java SE类初始化过程学习记录
父类代码:
package lxb.test;
public class Super {
public static int i = 1;
public int j = 2;
static{
System.out.println("父类静态代码块执行i:" + i);
}
{
System.out.println("父类构造代码块执行i:" + i);
System.out.println("父类构造代码块执行j:" + j);
}
public Super() {
run();
System.out.println("父类构造函数执行i:" + i);
System.out.println("父类构造函数执行j:" + j);
}
public void run() {
System.out.println("run方法执行j:" + j);
}
}
子类代码:
package lxb.test;
public class Children extends Super {
public static void main(String[] args) {
Children children = new Children();
}
public static int i = 11;
public int j = 12;
static{
System.out.println("子类静态代码块执行i=" + i);
}
{
System.out.println("子类构造代码块执行i=" + i);
System.out.println("子类构造代码块执行j=" + j);
}
public Children(int a){
super();
System.out.println("子类调用有参构造函数执行i=" + i);
System.out.println("子类调用有参构造函数执行j=" + j);
}
public Children() {
//子类构造函数调用其他子类构造函数时,必须在第一行。
//但是其调用的最后一个构造函数的第一行必须是父类构造函数
this(i);
System.out.println("子类构造函数执行i=" + i);
System.out.println("子类构造函数执行j=" + j);
}
public void run() {
System.out.println("子类run方法执行i=" + i);
System.out.println("子类run方法执行j=" + j);
}
}
运行结果和分析:
父类静态代码块执行i:1 //父类静态变量和静态代码块先初始化
子类静态代码块执行i=11 //子类静态变量和静态代码块初始化
//子类非静态变量声明,默认值为0
父类构造代码块执行i:1
父类构造代码块执行j:2 //父类构造代码块执行
子类run方法执行i=11 //父类构造函数开始执行,调用被子类覆盖的run方法
子类run方法执行j=0 //子类声明的默认值为0的非静态变量
父类构造函数执行i:1
父类构造函数执行j:2 //父类构造函数执行
//子类声明的非静态变量开始赋值
子类构造代码块执行i=11 //构造代码块执行,子类声明的非静态变量赋值成功
子类构造代码块执行j=12
子类调用有参构造函数执行i=11
子类调用有参构造函数执行j=12 //子类中被调用的构造函数执行
子类构造函数执行i=11
子类构造函数执行j=12 //最后执行子类构造函数,完成对象的初始化
总结
对于对象初始化这部分内容是javaSE的基础,之前看过《java编程思想》里面有这方面的介绍,不过都是局限于看和理解,今天遇到这方面的内容,自己亲自动手写代码实践了一下,对象初始化过程终于整理清楚了。代码核心就是在父类构造函数中调用run方法,可以把构造过程中的细节展现出来,想出这个方法的人真的很聪明。
另外,纸上得来终觉浅,绝知此事要躬行。多写代码,多实践才能不断的进步。