先看下面的代码:
public class Test {
public static int a =0 ;
static {
a = 10;
System.out.println("静态代码块执行a="+a);
}
{
a = 8;
System.out.println("非静态代码块(构造代码块)在执行a="+a);
}
public Test(){
this("调用无参构造方法,a="+ a);
System.out.println("无参构造方法在执行a="+ a);
}
public Test(String n){
this(n ,"调用带参构造方法1,a="+ a);
System.out.println("带参构造方法1在执行a="+ a);
}
public Test(String s1, String s2){
System.out.println(s1 + "," +s2);
}
public static void main(String[] args){
Test test = null;
System.out.println("下面new一个Test实例:");
test = new Test();
}
}
在我编译运行的时候,方法的加载顺序如何呢?先看一下打印信息:
静态代码块执行a=10
下面new一个Test实例:
非静态代码块(构造代码块)在执行a=8
调用无参构造方法,a=10,调用带参构造方法1,a=10
带参构造方法1在执行a=8
无参构造方法在执行a=8
首先打印静态代码块的内容,因为在虚拟机在首次加载Java类时,会对静态代码块、静态成员变量、静态方法进行一次初始化(静态间按顺序执行)。
然后打印非静态内容,先是执行有this()的构造方法,因为此时构造方法还未初始化,没有结果。再按顺序执行其余代码块。
每天进步一点点。
推荐微信公众号【排骨肉段】,记录日常的美好。