当前位置: 首页 > news >正文

类的加载顺序问题-demo展示

      面试的的时候经常会被问到包含静态代码块、实例代码块和构造器等代码结构的加载顺序问题,下面借用一个面试题,回顾一下类的代码加载顺序。

public class AooTest {public static void main(String[] args) {AooTest.f1();}static AooTest test1 = new AooTest();static {System.out.println("1");}{System.out.println("2");}AooTest() {System.out.println("3");System.out.println("a=" + a + ", b=" + b);}private static void f1() {AooTest aooTest = new AooTest();System.out.println("4");}int a = 5;static int b = 6;
}

先看一下输出结果:

2
3
a=5, b=0
1
2
3
a=5, b=6
4

      这个题比较绕,一般就是面试的时候故意出的费脑细胞的题,开发的时候压根不会碰到。但是这种题能够加深我们对类加载机制的理解,现在我们逐行去分析一下:

1、首先执行main方法,这里会执行当前AooTest类的加载,引起类加载有7种情况:

      1.1:创建类的实例,new关键词;
      1.2:访问类或接口的静态变量,或者对静态变量赋值;
      1.3:调用类的静态方法;
      1.4:程序的启动类所在的类;
      1.5:初始化一个类的子类时会引起父类的主动使用和初始化;
      1.6:反射,如Class.forName("com.cn.Test01");
      1.7:jdk1.7之后的动态语言支持也会引起类的初始化。

2、类的加载会出发静态代码块,这个题里面有多个静态属性和静态代码块,按照从上往下的顺序执行,依次是:

3、这里在执行1的时候,就去执行new AooTest(),对当前类实例化,那么实例化就需要执行成员属性赋值和实例代码块、之后再执行构造器,如果有多个成员属性或者多个实例代码块也是从上往下的顺序执行,这里我们看下:

所以,先输出 2(步骤1.1),之后对a赋值 a= 5(步骤1.2)。

然后再执行构造器的代码(步骤1.3),首先输出 3,接下来输出 a = 5, b=0,这里有些同学会有疑问,为什么 b 是0呢?大家注意看,前面类加载的时候,我们只是执行了步骤1,而 静态属性b的赋值要到步骤3种才能执行,所以这里b是没有被赋值的,默认是0。

4、然后回到前面的图,执行步骤2,输出1

5、再往下执行步骤3,注意这里b会被赋值了 b =6。

经过以上步骤,类的加载执行完成,所有的静态属性和静态代码块都执行完成。

6、下面进入了main方法,执行了 AooTest.f1()函数。

在f1方法里面,AooTest又一次被实例化了,所以如果前面被实例化的步骤一样,实例代码块输出2,构造器输出3,接下来输出输出 a = 5, b=6,这里注意,b在前面已经赋值了,所以与上面的输出不同。

7、实例化结束之后,最后输出 4 。

最后来总结一下类加载的顺序:

1、最先加载静态成员变量、静态代码块,如果有多个,按照从上往下的顺序加载;

2、其次实例化普通成员变量、实例代码块,如果有多个,按照从上往下的顺序执行;

3、最后执行构造器函数

http://www.lryc.cn/news/272478.html

相关文章:

  • [蓝桥杯2020国赛]答疑
  • 【AIGC表情prompt】提示词练习技巧
  • SpringBoot项目的三种创建方式
  • 【docker实战】01 Linux上docker的安装
  • Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的图像剪切(ROI)功能(C#)
  • 软件测试之安全测试
  • 【华为OD机试真题2023CD卷 JAVAJS】会议室占用时间
  • UR5机器人的旋转向量转换到四元数,再从四元数转换到旋转向量python代码
  • MD5--加密原理及代码示例(C#)
  • 理解 RPC 与 Protobuf:完整指南
  • 成为一名合格的前端架构师,前端知识技能与项目实战教学
  • 前端 富文本编辑器原理
  • Java网络编程之IP,端口号,通信协议(UDP,TCP)
  • iOS和iPadOS设备启动到打开App
  • 【INTEL(ALTERA)】如何使用 Quartus命令行导入 .qud 文件?
  • js创建服务器,以及对接口的理解和创建
  • 【Bootstrap学习 day7】
  • Zookeeper无法启动,报“Unable to load database on disk”
  • 【Web2D/3D】CSS3的2D/3D转换、过渡、动画(第一篇)
  • uView NumberBox 步进器
  • 三菱plc的点动控制循环(小灯闪烁,单控气缸循环)
  • 学习Go语言Web框架Gee总结--http.Handler(一)
  • react+redux+antd-mobile 之 记账本案例
  • Day22
  • Windows下linux 子系统 WSL2怎样使用usb串口(USBIPD-win4.0.0)
  • 飞腾Ubantu22.04.3安装OpenNebula测试
  • gookit/color - Go语言命令行色彩使用库教程
  • python弹奏《起风了》
  • Linux---all
  • 前端中级算法题