主要记录下java实例化对象、静态代码块等代码执行的顺序
Java程序在执行过程中,类,对象以及它们成员加载、初始化的顺序如下:
1、首先加载要创建对象的类及其直接与间接父类。
2、在类被加载的同时会将静态成员进行加载,主要包括静态成员变量的初始化,静态语句块的执行,在加载时按代码的先后顺序进行。
3、需要的类加载完成后,开始创建对象,首先会加载非静态的成员,主要包括非静态成员变量的初始化,非静态语句块的执行,在加载时按代码的先后顺序进行。
4、最后执行构造器,构造器执行完毕,对象生成。
所以java对象实例化时的顺序为:
1,父类的静态成员变量和静态代码块加载
2,子类的静态成员变量和静态代码块加载
3,父类成员变量和方法块加载
4,父类的构造函数加载
5,子类成员变量和方法块加载
6,子类的构造函数加载
class X {
Y b = new Y();//实例化对象
int number1 = num();//父类中的成员变量
int num(){//父类中的成员函数
System.out.println("父类成员变量num加载");
return 666;
}
static int number2=num2();//父类中的静态成员变量
static int num2(){//父类中的静态成员函数
System.out.println("父类静态成员变量num2加载");
return 666666;
}
static {//X中静态代码块
System.out.print("父类中的静态代码块加载"+"\n");
}
{
System.out.println("父类普通方法块加载");
}
//Y b = new Y();
public X() {
System.out.print("父类中的构造函数加载"+"\n");
}
//Y c = new Y();
}
class Y {
static {
System.out.print("类中调用其他类时,其他类的静态函数加载"+"\n");
}
Y() {
System.out.print("类中调用其他类时,其他类的构造函数加载"+"\n");
}
}
public class Z extends X {
Y y = new Y();
int number = num();//父类中的成员变量
int num(){//子类中的成员函数
System.out.println("子类成员变量num加载");
return 555;
}
static int number2=num2();//父类中的静态成员变量
static int num2(){//父类中的静态成员函数
System.out.println("子类静态成员变量num2加载");
return 55555;
}
static {
System.out.print("子类中的静态代码块"+"\n");
}
{
System.out.println("子类普通方法块加载");
}
Z() {
//super();//默认,供系统底层检查调用,而不具体执行class Z的构造方法
System.out.print("子类中的构造函数加载"+"\n");
}
public static void main(String[] args) {
Z z=new Z();
}
}
过程:子类main函数中实例化对象 z,先加载父类;
父类静态成员变量/父类静态代码块(顺序执行)>子类静态 ;
若父类中调用其他类,在父类和子类的静态内容执行完成后 ,再执行;
父类普通方法块>构造函数>
运行结果:
父类静态成员变量num2加载 //静态内容执行
父类中的静态代码块加载
子类静态成员变量num2加载
子类中的静态代码块
类中调用其他类时,其他类的静态函数加载 //父类中的调用其他类 其它类中的static{}(只执行一次)
类中调用其他类时,其他类的构造函数加载 //其它类中的构造方法
子类成员变量num加载 //此处是父类和子类的同名成员函数num 就近原则执行了子类的(大概,测试不同名执行父类)
父类普通方法块加载
父类中的构造函数加载
类中调用其他类时,其他类的构造函数加载 //其它类中的构造方法
子类成员变量num加载
子类普通方法块加载
子类中的构造函数加载
网上关于父类静态 、普通代码块、构造函数和子类中的这些 的执行顺序有很多,我主要是遇到了父类中再调用其他类进行对象实例化,记录一下顺序的学习。
参考文章: