韩顺平0基础学java——第18天

p374-395

类变量和类方法

类变量(静态变量)

例:

class Child{

        public static Int count;//这个count可以被所有Child实例共享

        /..../

}

内存中,static在堆中是独立存放的,并不在某个对象的空间中。

1d32c6a6a54d47f0ab815460205a86aa.png

由于count是静态变量,于是在类加载的时候,信息放在方法区中,有些人认为count不在堆中,而是在方法区的静态域中。那到底在哪呢?

记住一点:static变量是对象共享的,不管它在哪,共识1static变量是同一个类所有对象共享,2static变量在类加载的时候就生成了。

8ed5a1a7e78c48afa5aa71f63336db5a.png

如何访问静态变量?

efd4692ed84f4d5ca6c52d6187e2336f.png

同时,由于有访问修饰符,静态变量依然要遵守相关的访问权限。

如 public static int age = 10;

类变量细节讨论

1.什么时候需要使用类变量

        当我们需要让某个类的所有对象都共享一个变量时,就可以考虑使用变量。

2.类变量和实例变量(普通属性)的区别

        类变量是该类所有对象所共享的,而实例变量是没个对象独享的。

3.加上static就称为类变量(静态变量),否则就叫实例变量/普通变量/非静态变量。

4.类变量可以通过 类名.类变量名 或者 对象名.类变量名来访问,但jiava设计者推荐使用类名.类变量名 来访问,前提是满足访问修饰符的访问权限和范围。

5.实例不能通过类名.变量名来访问

f7aa2bae69934d179e508d0d1fe49169.png

6.类变量是在类加载的时候就初始化了, 所以我们没有创建对象实例,就能通过类名.类变量名来访问! 

7.类变量的生命周期是随类的加载开始,随着类消亡而销毁。

类方法(静态方法)

访问修饰符 static 数据返回类型 方法名(){} //推荐

static 访问修饰符 数据返回类型 方法名(){}

静态方法就可以调用静态属性!静态方法可以通过类名或对象名来调用。

类方法经典的使用场景:当方法中不涉及到任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率。比如工具类的一些排序、打印特定信息等等。

类方法细节

1.类方法和普通方法都是随着类的加载而加载,将结构信息储存在方法区,类方法中无this的参数,普通方法中隐含着this的参数

2.类方法可以通过类名调用,也可以通过对象名调用。

3.普通方法和对象有关,需要通过对象名调用,比如对象名.方法名(参数),不能通过类名调用。

4.类方法中不允许使用和对象有关的关键字,比如this和super,普通方法(成员方法)可以。

5.类方法(静态方法)中,只能访问静态方法或静态变量。

6.普通成员方法,既可以访问普通变量(方法),也可以访问静态变量(方法)

小结:静态方法只能访问静态成员,非静态方法可以访问静态和非静态成员,都要遵守访问权限!

课堂练习

第一题:

7c00fd9818914dc19e34d5035e7f931b.png

count=9

count=10

11

第二题:

b6ac340f3940405687979442ed1a5e5f.png

有错,静态的getTotalPerson方法访问了非静态的id字段

第三题:

672b7c54af444f4e92cdb28aa70d4cfb.png

把this.total改成Person.total就可以了。total是静态属性!用类名调用。

main方法

main的形式:

public static void main(String[ ] args){}

1.main方法是java虚拟机在调用,所以该方法的访问权限必须是public

2、java虚拟机在执行main方法时,不必创建对象,所以该方法必须是static

3.该方法接受String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数。

4.java执行的程序 参数1 参数2 参数3

0382_韩顺平Java_main语法说明_哔哩哔哩_bilibili

理解main方法

1.在main()方法中,我们可以直接调用main方法所在类的静态方法或静态属性

2.但是不能直接访问该类中的非静态成员,必须先创建本类的对象,再调用。

命令行传参数:d5bad793169e49d7ac67b03a014c03dd.png

 idea里传参数:

3c4f909c76c94f3d92abdb3233d7f324.png2c5c04467cd449a4ad429168425b7dd0.png

代码块

代码块又称为初始化块,是类的一部分,类似于方法,将逻辑语句封装在方法体中,通过{}包围起来,但是和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不能通过对象或类显式调用,而是加载类时,或创建对象时隐式调用。

基本语法

[修饰符]{

代码

};

注意:

1.修饰符可选,要写的话只能写static

2.代码块分类两类,使用static修饰的叫静态代码块,没有static修饰的叫动态代码块。

3.逻辑语句可以为任何逻辑语句(输入、输出、方法调用、循环、判断等)

4.;可以写也可以省略

代码块的好处:

1.相当于另外一种形式的构造器(对构造器的补充机制),可以做初始化的操作。

        例:构造器构成重载后,若每个构造器都有相同的语句,所以可以把这些语句放在代码块中。当我们不管调用哪个构造器来创建对象,都会先调用代码块的内容。

2.提高代码的重用性

代码块使用细节(很烦人)

1.

static代码块也叫静态代码块,作用就是对类进行初始化,而且它随着类的加载而执行,并且只会执行一次,只执行一次!如果是普通代码块,每创建一个对象,就执行一次。

2.

类什么时候被加载

        1.创建对象实例时 (new)

        2,创建子类对象实例,父类也会被加载

        3使用类的静态成员时(静态属性,静态方法)

背下来

3

普通的代码块,在创建对象实例时,会被隐式调用,被创建一次,就会被调用一次,如果只是使用类的静态成员时,普通代码块并不会被执行。ae6fd203f0274a48b440ea7e265959b0.png

5dbec2d703d849199888fdbc3ff8bf00.png

啊,加油,今天肝到400集!好困啊

小结:static代码块是类加载的时候执行,只一次,普通代码块是创建对象的时候调用,每个对象都会调用它!

4.

创建一个对象时,在一个类调用的顺序是

        1.调用静态代码块和静态属性初始化(注意,静态代码块和静态属性初始化调用的优先级一样,如果有多个静态代码块和多个静态变量初始化,则按照它们定义的顺序调用)

        2.调用普通代码块和普通属性的初始化(优先级相同没如果有多个,那么按照他们定义的顺序初始化)

        3构造器(几天不见这么拉了?)

那么,有继承的时候,是什么顺序呢?(面试爱问)

5.

构造器的最前面其实隐含了super()和 调用普通代码块,

4049b9cb30944b31bfb085a91ee75fac.png

也就是说,调用super就会去父类,按照顺序走一轮,然后回到自己的内部,调用普通代码块,然后调用
 

6&7.

be2992958a6c4e0bbbd8602a3e4e8fa1.png

 亲测:new 子类 

b712f61fda9649799e0e48f9f2adde7b.png

new孙类

91379bc6b9a24f7a9a22bab13d90d5ed.png

按这个套路...

4f506485459840e480b9360f439ebc13.png

0389_韩顺平Java_代码块使用细节4_哔哩哔哩_bilibili

练习

第一题

1b3f1022bceb4331a1b23de0c5e786f1.png

in static block//调用Person类的时候会进行静态字段和静态代码块的加载,但是只在调类的时候输出这一次!

total =100

total =100

第二题:

cf837878f3c245ca9a31e388f77b14a2.png

静态成员sam初始化

static块被执行

sam1成员初始化//不要忘了普通代码块在构造器前面!!!

Test默认构造函数被调用

单例设计模式

静态方法和属性的经典应用

设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱...

b92b8086fc5b42b09b4f967781371f8b.png

饿汉式

1.构造器私有化→防止用户new

2.类的内部创建对象

3.向外暴露一个静态的公共方法,如getinstance

4.代码实现

例:

package com.day18;

public class MyTool {
    public static void main(String[] args) {
        GirlFriend mdk = GirlFriend.getInstance();
        GirlFriend xixi = GirlFriend.getInstance();
        System.out.println(mdk.toString());
        System.out.println(xixi.toString());
        System.out.println(mdk == xixi);
    }
    }

class GirlFriend{
    //为了能够在静态方法中返回gf对象,需要将其修饰为static,而这里static了,它只会创建一次。
    private static GirlFriend gf=new GirlFriend("马大可");
    private String name;
    private GirlFriend(String name){
        this.name= name;
    }
    //这个方法必须是静态的,否则就得去外面new一个!
    public static GirlFriend getInstance(){
        return gf;
    }

    @Override
    public String toString() {
        return "GirlFriend{" +
                "name='" + name + '\'' +
                '}';
    }
}

这里只要加载类,就会被创建,你不一定会用它。饿汉式:你可以不用对象,但不能没有对象!

饿汉式你可能造成创建了对象,但是不使用,因此资源被浪费了。

懒汉式

1.构造器私有化,防止直接new

2.类的内部创建对象

3向外暴露一个静态的公共方法

4.代码实现

简单地说,就是你需要使用了,才创建。

package com.day18;

public class MyTool {
    public static void main(String[] args) {

    }
    }

class GirlFriend{
    private String name;
    private GirlFriend(String name){//私有化构造器,不让在外面new
        System.out.println("构造器被调用了");
        this.name= name;
    }
    private static GirlFriend gf;
    public static GirlFriend getInstance(){
        if(gf==null){
            gf = new GirlFriend("马大可");
            return gf;
        }
    }
    @Override
    public String toString() {
        return "GirlFriend{" +
                "name='" + name + '\'' +
                '}';
    }
}

小结:

饿汉式问题:在类加载的时候就创建,可能存在资源浪费问题

懒汉式问题:线程安全问题

final关键字

final可以修饰类,属性,方法,局部变量

可能会用到final的情况:

1.当不希望类被继承时,可以用final修饰(结扎类?)

2.不希望被重写的方法:public final void speak(){}

3.当不希望类的某个属性被修改,public final double rare = 0.8;交80%的利息!

4.不希望局部变量被修改

final的使用细节

457a393793884365a264118a79b15cce.png

0394_韩顺平Java_final使用细节1_哔哩哔哩_bilibili

如果是静态的final

c4fb17d8e7ca4984a49b5d4fa646838a.png

如果不是final类,但是含有final方法,该方法虽然不能重写,但是可以被继承

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/685560.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】C语言实现二叉树的基本操作——二叉树的遍历(先序遍历、中序遍历、后序遍历)

C语言实现二叉树的基本操作 导读一、二叉树的遍历二、先序遍历三、中序遍历四、后序遍历五、结点序列六、递归算法与非递归算法的转化结语 导读 大家好,很高兴又和大家见面啦!!! 通过前面的介绍,我们已经认识了二叉树…

SAP 限制物料类型在BOM组件中简介

我们在创建BOM的时候通常是基于成品或者是半成品虚拟件创建BOM。正常情况下某些特殊的物料类型是不存在BOM中的。我们可以通过系统后台配置的方式对物料类型进行控制,控制对应的物料类型是否允许出现在BOM的组件中 1、后台配置路径: SPRO—生产—基本信息—物料清单—项目数…

【Linux取经路】网络套接字编程——TCP篇

文章目录 前言十、Tcp Server 端代码10.1 socket、bind10.1 listen——监听一个套接字10.2 accept——获取一个新连接10.3 read——从套接字中读取数据10.4 write——向套接字中进行写入10.5 Tcp Service 端完整代码(单进程版)10.6 Tcp Server 端代码&am…

【ZYNQ】CPU 私有定时器

Zynq 的每个 Cortex-A9 处理器都有自己的专用 32 位定时器和 32 位看门狗定时器,两个处理器共享一个全局 64 位定时器,这些计时器的时钟频率始终为 CPU 频率的 1/2。本文主要介绍 Zynq 芯片 CPU 私有定时器的工作特性,以及私有定时器的基本使…

(面试官问我微服务与naocs的使用我回答了如下,面试官让我回去等通知)微服务拆分与nacos的配置使用

微服务架构 正常的小项目就是所有的功能集成在一个模块中,这样代码之间不仅非常耦合,而且修改处理的时候也非常的麻烦,应对高并发时也不好处理,所以 我们可以使用微服务架构,对项目进行模块之间的拆分,每一…

精选网络安全书单:打造数字世界的钢铁长城!

目录 1.前言 2.书单推荐 2.1. 《内网渗透实战攻略》 2.2. 《Kali Linux高级渗透测试(原书第4版)》 2.3. 《CTF那些事儿》 2.4. 《权限提升技术:攻防实战与技巧》 2.5. 《数字政府网络安全合规性建设指南:密码应用与数据安全…

C++:红黑树

红黑树的概念 红黑树是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路 径会比其他路径长出两倍,因而是接近平衡…

ArrayList——简单洗牌算法

特殊语法介绍&#xff1a; List<List<E>> 该语法情况比较特殊&#xff0c;相当于一个“二维数组”存着一个个线性表的结构&#xff0c;如图&#xff1a; 该语法的灵活性强&#xff0c;可适用于多种类型和多种情况。接下来就使用该语法来实现一个简单的洗牌操作。…

halo进阶-主题插件使用

开始捣鼓捣鼓halo&#xff0c;换换主题&#xff0c;加个页面 可参考&#xff1a;Halo 文档 安装/更新主题 主题如同壁纸&#xff0c;萝卜青菜各有所爱&#xff0c;大家按需更换即可&#xff1b; Halo好在一键更换主题&#xff0c;炒鸡方便。 安装/更新插件 此插件还扩展了插件…

CR80通用清洁卡:证卡打印机、ATM机、POS机、读卡器等卡片设备清洁维护的好助手!

随着科技的进步&#xff0c;ATM机、POS终端、门禁系统、证卡打印机、读卡器等卡片设备在我们的日常生活中扮演着越来越重要的角色&#xff0c;些设备在长时间使用和环境因素的影响下&#xff0c;容易积聚油脂、灰尘和其他污染物&#xff0c;从而对其性能和功能产生负面影响。 深…

Xcode 打包报错Command PhaseScriptExecution failed with a nonzero exit code

解决办法: 1、在Xcode项目中 Pods -> Targets Support Files -> Pods-项目名 -> Pods-项目名-frameworks 中(大约在第44行) 加上 -f 2、CocoaPods版本太旧了,可以尝试升级CocoaPods版本 使用sudo gem update cocoapods更新cocoapods&#xff0c;问题将在1.12.1版本已…

力扣2968.执行操作使频率分数最大

力扣2968.执行操作使频率分数最大 方法一&#xff1a;滑窗 前缀和 求前缀和数组s 求一个数组补齐到中位数的差值 枚举右端点 class Solution {public:int maxFrequencyScore(vector<int>& nums, long long k) {int res0,n nums.size();sort(nums.begin(),nums…

单元测试AIR原则:提升代码质量的秘密武器

文章目录 引言一、AIR原则1. Automatic&#xff08;自动化&#xff09;2. Independent&#xff08;独立性&#xff09;3. Repeatable&#xff08;可重复性&#xff09; 二、Automatic&#xff08;自动化&#xff09;三、Independent&#xff08;独立性&#xff09;四、Repeatab…

GIF录屏工具Gif123 v3.3.0单文件

软件介绍 GIF的优势是小、轻、快&#xff0c;适合时间短、画面小、需要嵌入其他页面&#xff0c;打开就自动循环播放的动画。Gif123可录制合成鼠标轨迹,可调整鼠标指针大小,可在设置中打开鼠标指针高亮光圈功能,高亮光圈可跟随鼠标移动以指示鼠标位置。软件极其简单&#xff0…

C语言实现教学计划编制问题,Dev C++编译器下可运行(240606最新更新)

背景&#xff1a; 问题描述 大学的每个专业都要编制教学计划。假设任何专业都有固定的学习年限&#xff0c;每学年含两学期&#xff0c; 每学期的时间长度和学分上限都相等。每个专业开设的课程都是确定的&#xff0c;而且课程的开设时间的安排必须满足先修关系。每个课程的先…

树形表/树形数据接口的开发

数据表格式 需要返回的json格式 点击查看json数据 [{"childrenTreeNodes" : [{"childrenTreeNodes" : null,"id" : "1-1-1","isLeaf" : null,"isShow" : null,"label" : "HTML/CSS","na…

Spark MLlib 机器学习详解

目录 &#x1f349;引言 &#x1f349;Spark MLlib 简介 &#x1f348; 主要特点 &#x1f348;常见应用场景 &#x1f349;安装与配置 &#x1f349;数据处理与准备 &#x1f348;加载数据 &#x1f348;数据预处理 &#x1f349;分类模型 &#x1f348;逻辑回归 &a…

【成品设计】基于NB模块智能烟感系统设计

《基于NB模块智能烟感系统》 整体功能&#xff1a; 所需器件&#xff1a; 选用STM32F103为主控&#xff0c;选用DS18B20温度传感器和MQ烟雾传感器作为数据采集点&#xff0c; 采用0.96寸屏显实时显示采集到的温度、烟雾等数据&#xff0c;用蜂鸣器作为报警装置。 通过有人物联…

OpenCV的“画笔”功能

类似于画图软件的自由笔刷功能&#xff0c;当按住鼠标左键&#xff0c;在屏幕上画出连续的线条。 定义函数&#xff1a; import cv2 import numpy as np# 初始化参数 drawing False # 鼠标左键按下时为True ix, iy -1, -1 # 鼠标初始位置# 鼠标回调函数 def mouse_paint(…

初学者如何对大模型进行微调?

粗略地说&#xff0c;大模型训练有四个主要阶段&#xff1a;预训练、有监督微调、奖励建模、强化学习。 预训练消耗的时间占据了整个训练pipeline的99%&#xff0c;其他三个阶段是微调阶段&#xff0c;更多地遵循少量 GPU 和数小时或数天的路线。预训练对于算力和数据的要求非…