代码块02使用细节-Java

代码块02使用细节

  • 四、使用细节
    • 1、static代码块/静态代码块,随着类的加载而执行,且只执行一次
    • 2、 类什么时候被加载 [重要 ! ]
      • 案例演示:static代码块
    • 3、普通代码块,在创建对象实例时,会被隐式的调用。
      • 案例演示:普通代码块
    • 4、创建一个对象时,在一个类调用顺序是
      • 案例演示
    • 5、构造器的最前面其实隐含了super()和调用普通代码块
      • 案例演示
    • 6、创建一个子类时(继承关系),调用顺序
      • 案例演示
    • 7、静态代码块只能直接调用静态成员(静态属性和静态方法)

四、使用细节

1、static代码块/静态代码块,随着类的加载而执行,且只执行一次

static代码块也叫静态代码块,作用就是对类进行初始化,而且它随着类的加载而执行,并且只会执行一次。

如果是普通代码块,每创建一个对象,就执行。

2、 类什么时候被加载 [重要 ! ]

① 创建对象实例时(new)
② 创建子类对象实例,父类也会被加载
③ 使用类的静态成员时(静态属性,静态方法)

案例演示:static代码块

① 创建对象实例时(new)

public class CodeBlockDetail01 {public static void main(String[] args) {A aa = new A();}
}class A {static {System.out.println("AA的静态代码块");}
}

在这里插入图片描述

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

public class CodeBlockDetail01 {public static void main(String[] args) {B b = new B();}
}class A {static {System.out.println("父类A的静态代码块");}
}class B extends A {static {System.out.println("子类B的静态代码块");}
}

在这里插入图片描述

③ 使用类的静态成员时(静态属性,静态方法)
使用静态属性或者静态方法的时候,类已经加载

public class CodeBlockDetail01 {public static void main(String[] args) {//③ 使用类的静态成员时(静态属性,静态方法)System.out.println(Cat.n1);}
}
class Cat {public static int n1 = 999;static {System.out.println("cat 的静态代码块");}
}

在这里插入图片描述
static代码块/静态代码块,随着类的加载而执行,且只执行一次

public class CodeBlockDetail01 {public static void main(String[] args) {D d = new D();D d1 = new D();}
}
class D {static{System.out.println("DD的静态代码块");}
}

在这里插入图片描述

3、普通代码块,在创建对象实例时,会被隐式的调用。

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

案例演示:普通代码块

① 普通代码块,被创建一次,就会调用一次。

	//【main】D d = new D();D d1 = new D();class D {static{System.out.println("D的static静态代码块");}{System.out.println("D的普通代码块");}}

在这里插入图片描述
② 只是使用类的静态成员时,普通代码块并不会执行。
注意:静态代码块一定会执行。

	//【main】System.out.println(D.n2);class D {public static int n2 = 8888;static{System.out.println("D的static静态代码块");}{System.out.println("D的普通代码块");}}

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

创建 一个对象 时,在 一个类 调用顺序是 (重点,难点)∶

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

② 调用普通代码块普通属性的初始化(注意:普通代码块和普通属性初始化调用的优先级一样,如果有多个普通代码块和多个普通属性初始化,则按定义顺序调用)

补充:这里暗含了顺序,①中的静态代码块和静态属性初始化 一定比②的调用。

③ 调用构造方法。

案例演示

① 静态代码块和静态属性初始化调用的优先级一样,按照定义的顺序调用。

//【main】
A a = new A();class AA {//静态属性初始化private static int n1 = getN1();//静态代码块static {System.out.println("A的静态代码块0101");}public static int getN1() {System.out.println("getN1()被调用");return 100;}
}

在这里插入图片描述
修改代码顺序为:

class AA {//静态代码块static {System.out.println("A的静态代码块0101");}//静态属性初始化private static int n1 = getN1();public static int getN1() {System.out.println("getN1()被调用");return 100;}
}

在这里插入图片描述
② 普通属性初始化 & 普通代码块

class AA {//普通属性private int n2 = getN2();//普通代码块{System.out.println("普通代码块0101");}public int getN2() {System.out.println("getN22()被调用");return 200;}
}

在这里插入图片描述

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

构造器的最前面其实隐含了super()和调用普通代码块。
静态相关的代码块、属性初始化,在类加载时,就已经执行完毕。
因此是优先于构造器和普通代码块执行的。

class A {public A() {// 构造器//这里有隐藏的执行要求// (1) super() // (2) 调用普通代码块System.out.println("A的构造器");}
}

案例演示

CodeBlockDetail03.java

//【main】
BBB bbb = new BBB();class AAA {{System.out.println("AAA的普通代码块···");}public AAA() {// 构造器//这里有隐藏的执行要求// (1) super() - AAA 的父类是Object// (2) 调用普通代码块System.out.println("AAA的构造器···");}
}class BBB extends AAA{{System.out.println("BBB的普通代码块···");}public BBB() {// 构造器//这里有隐藏的执行要求// (1) super()// (2) 调用普通代码块System.out.println("BBB的构造器···");}
}

在这里插入图片描述

6、创建一个子类时(继承关系),调用顺序

创建一个子类时(继承关系),他们的静态代码块,静态属性初始化,普通代码块,普通属性初始化,构造方法的调用顺序如下:

//面试题
A(子类)->B(父类)
① 父类的静态代码块和静态属性(优先级一样,按定义顺序执行)
② 子类的静态代码块和静态属性(优先级一样,按定义顺序执行)
····································注意此时类加载完成································
③ 父类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)
④ 父类的构造方法
⑤ 子类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)
⑥ 子类的构造方法

以 class B02 extends A02 为例。
【分析】new B02();
(1) 进行类的加载
1.1 先加载 父类 A02 。1.2 再加载 B02
-加载子类的时候,一定要有父类,(比如先加载Object类)
-加载的时候,进行静态属性初始化 & 静态代码块
(静态属性初始化 & 静态代码块与类加载相关,优先级一样,取决于代码顺序)
(2) 创建对象
2.1 从子类的构造器开始
子类构造器隐藏了①super()②普通代码块 & 普通属性相关···

案例演示

CodeBlockDetail04.java

7、静态代码块只能直接调用静态成员(静态属性和静态方法)

静态代码块只能直接调用静态成员( 静态属性和静态方法 ),普通代码块可以调用任意成员。

本笔记是对韩顺平老师的Java课程做出的梳理。方便本人和观看者进行复习。
课程请见: https://www.bilibili.com/video/BV1fh411y7R8/?spm_id_from=333.999.0.0&vd_source=ceab44fb5c1365a19cb488ab650bab03

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法每日一练]-图论(保姆级教程篇7 最小生成树 ,并查集模板篇)#村村通 #最小生成树

目录 题目:村村通 并查集 题目:最小生成树 kruskal算法 prim算法 先引入问题: 要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺…

C++ day37 贪心算法 单调递增的数字 监控二叉树

题目1&#xff1a;738 单调递增的数字 题目链接&#xff1a;单调递增的数字 对题目的理解 返回小于或等于n的最大数字&#xff0c;且数字是单调递增&#xff08;单调递增数字的定义&#xff1a;每个相邻位上的数字满足x<y&#xff09; 贪心算法 注意本题的遍历顺序是从…

羽隔已就之图像处理之BP神经网络入门

小y最近非常忙&#xff0c;这一年来&#xff0c;活很多&#xff0c;一直在加班、出差&#xff0c;也没好好休息过。最近在武汉出差一个多月了&#xff0c;项目逐渐完结&#xff0c;有点闲时间了&#xff0c;回首望&#xff0c;这一年设定的很多目标都没完成。 还记得&#xff0…

关于Unity中字典在Inspector的显示

字典在Inspector的显示 方法一&#xff1a;实现ISerializationCallbackReceiver接口 《unity3D游戏开发第二版》记录 在编辑面板中可以利用序列化监听接口特性对字典进行序列化。 主要继承ISerializationCallbackReceiver接口 实现OnAfterDeserialize() OnBeforeSerialize() …

动态规划--使用最小花费爬楼梯

题目描述 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 示例…

【FGPA】Verilog:JK 触发器 | D 触发器 | T 触发器 | D 触发器的实现

0x00 JK 触发器 JK 触发器是 RS 触发器和 T 触发器的组合&#xff0c;有两个输入端 J 和 K&#xff0c;如果两个输入端都等于 1&#xff0c;则将当前值反转。 行为表 状态图 Timing Diagram Circuit JK 触发器的设计目的是防止 RS 触发器在输入 S 和 R 均等于 …

2020年1月31日 Go生态洞察:pkg.go.dev的未来步骤

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

安卓开发学习---kotlin版---笔记(一)

Hello word 前言&#xff1a;上次学习安卓&#xff0c;学了Java开发&#xff0c;简单的搭了几个安卓界面。这次要学习Kotlin语言&#xff0c;然后开发安卓&#xff0c;趁着还年轻&#xff0c;学点新东西&#xff0c;坚持~ 未来的你会感谢现在努力的你~ 主要学习资料&#xff1a…

Day12 qt QMianWindow,资源文件,对话框,布局方式,常用ui控件

QMianWindow 概述 QMainWindow 是一个为用户提供主窗口程序的类&#xff0c;包含一个菜单栏&#xff08; menu bar &#xff09;、多 个工具栏 (tool bars) 、多个铆接部件 (dock widgets) 、一个状态栏 (status bar) 及 一个中心部件 (central widget) 许多应用程序的基础…

matlab配置

matlab配置 windowslinux挂载安装MATLAB windows 按照这里一步步配置就行( 移动硬盘中软件备份中自取) linux linux配置步骤 挂载 sudo mount -t auto -o loop /media/oyk/Elements/ubuntu/MATLAB/R2017a_glnxa64_dvd1.iso ./matlab/安装MATLAB 挂载完成后&#xff0c;先…

无人机光伏巡检代替人工,贵州电站运维升级

无人机光伏巡检如何做到降本增效&#xff1f;贵州省光伏电站有新招&#xff01;某70MWp的光伏电站通过引入复亚智能无人机光伏巡检系统&#xff0c;专注于使用无人机对区域内的光伏面板进行自动巡航巡查&#xff0c;利用自动化巡检和故障识别技术&#xff0c;显著提升了光伏电站…

vue中:计算属性computed

1. 在computed中定义计算属性方法根据已有的数据进行计算返回一个要显示的新数据 2. 在页面中使用{{计算属性名}}来显示返回的数据 3. computed: 内部有缓存, 多处读取只计算一次 4. 计算属性默认相当于只有getter来根据已有数据计算返回一个新数据值, 也可以指定setter来监…