JAVA类的初始化问题_java类的初始化问题: 一道阿里笔试题的分析

一. 题目

1. 描述

765c66a8808d

上.png

765c66a8808d

下.png

2. 考察点

很多人java用了好多年, 每天创建数十个类, 事实上也不一定清楚类创建过程中的一些具体细节. 因此这道题还是非常有难度的一题.

那么让我们来看看吧

二. 解答

1. java类创建的过程

对一个具体的子类来说:

1) 进入子类的构造方法

2) 如果有父类father, 执行父类的构造方法

- 其中, 父类father如果有赋值属性, 首先初始化赋值属性

- 然后执行father构造方法中的具体代码

3) 子类如果有赋值属性, 初始化赋值属性

4) 执行子类构造方法中的具体代码

2. 单步调试截图

765c66a8808d

1

765c66a8808d

2

765c66a8808d

3

765c66a8808d

4

765c66a8808d

5

765c66a8808d

6

765c66a8808d

7

765c66a8808d

8

765c66a8808d

9

765c66a8808d

10

765c66a8808d

11

765c66a8808d

12

765c66a8808d

13

765c66a8808d

14

至此, 类的创建完成. 输出结果应该是P F S 2.

三. 扩展

1. static问题

如果类代码中存在static关键字修饰的静态成员属性, 静态成员方法, 乃至静态代码块的话, 什么情况会发生呢?

让我们来实验一下.

765c66a8808d

MainTest.java

765c66a8808d

static实验输出

开始执行:

765c66a8808d

1

765c66a8808d

2

765c66a8808d

3

765c66a8808d

4

765c66a8808d

5

765c66a8808d

6

765c66a8808d

7

765c66a8808d

8

从static关键字部分的代码行为我们可以得出如下几个观察:

static是和类的加载相关的. 当一个变量s进行类的声明的时候, 会先后加载其父类Father, 子类Son的类代码.

子类继承了父类, 那么在声明子类类型的变量的时候, 必须先加载父类的类代码, 再加载子类的类代码.

类代码执行是从上往下逐行扫描的, 因此静态代码块和有值静态成员属性的执行主要是依据其在代码中的先后位置.

2. 综合总结

如果你上面看了这么多都已经忘记了的话, 没事, 记住这最后的结论就可以了,

对一个具体的子类来说, 其Person s = new Son();或者Son s = new Son();的执行过程都遵循如下过程

1) 对变量S进行类型声明, 即执行`Son s`, 因此先后加载Person.class(父类)和Son.class(子类)

- 加载父类代码的同时, 执行其中的静态代码块和静态成员属性赋值;

- 加载子类代码的同时, 执行其中的静态代码块和静态成员属性赋值;

2) 变量声明结束, 开始执行`new Son()`, 这将调用Son的构造方法

if (Son有父类Person)

- 先进入父类构造方法

- 其中, 父类Person如果有赋值属性, 首先初始化赋值属性

- 然后执行Person构造方法中的具体代码

子类如果有赋值属性, 初始化赋值属性

执行子类构造方法中的具体代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值