关于初始化的顺序
今天看书的时候偶然看到,感触良多,在这里记录一下.
首先理解java中所有事物都是对象,每个类的编译代码都存在于它自己独立的文件中,该文件只有需要程序代码时才会加载,即类的代码在初四使用时才会加载;
1.运行main方法,顺序执行,当有对象被创建时,这个对象对应的类开始被加载,
2.首先检查他的父类,加载类中的静态块,对静态变量赋值,然后加载子类静态块,静态变量.
3.对父类中变量初始化,调用父类构造器,
4.子类变量初始化.调用子类构造器.
上个代码:
package chushihua;
public class Man {
static {
System.out.println("man静态块初始化");
}
{
System.out.println("man代码块初始化");
}
private String s1=start1();
private static String s2=start2();
public static String start1() {
System.out.println("变量s1初始化");
return "父类静态成员变量的初始化" ;
}
public static String start2() {
System.out.println("静态变量s2初始化");
return null;
}
public Man() {
System.out.println("man构造器");
method();
}
public void method() {
System.out.println("man调用method方法");
}
}
package chushihua;
public class Boy extends Man{
static {
System.out.println("boy静态块初始化");
}
{
System.out.println("boy代码块初始化");
}
private int a=1;
private static int b=1;
public String s=ff();
public String ff() {
System.out.println("s变量初始化");
return null;
}
public void method() {
System.out.println("boy调用method方法,a="+a+",b="+b);
}
public Boy() {
System.out.println("boy构造器");
method();
}
}
package chushihua;
public class Test {
public static void main(String[] args) {
new Boy();
}
}
运行结果:
man静态块初始化
静态变量s2初始化
boy静态块初始化
man代码块初始化
变量s1初始化
man构造器
boy调用method方法,a=0,b=1
boy代码块初始化
s变量初始化
boy构造器
boy调用method方法,a=1,b=1
比较man类的变量初始化顺序,可以得知为何a的值不同;