静态代码块,构造代码块,构造函数,成员变量赋值顺序

两个测试类:
public class TestParent {

private String x="myparenttest";

static {

System.out.println("父类静态");

}

{

System.out.println("父类构造代码块:"+x);

}

public TestParent(String x) {

this.x=x;

System.out.println("父类构造函数"+x);

}

public String getX() {

return x;

}

public void setX(String x) {

this.x = x;

}

}

public class TestSon extends TestParent {

private String x="myson";

static {

System.out.println("子类静态代码块");

}

{

System.out.println("子类构造代码块:"+x);

}

public TestSon(String x) {

super(x);

this.x=x;

System.out.println("子类构造函数"+x);

}

public String getX() {

return x;

}

public void setX(String x) {

this.x = x;

}

}

public class MyTest {

public static void main(String[] args) {

TestSon son=new TestSon("lilei");

System.out.println();

TestSon son2=new TestSon("hanmeimei");

}

}

运行结果如下:

父类静态--------------------------------父类的静态代码块,只在第一次new时执行

子类静态代码块-------------------------子类的静态代码块,只在第一次new时执行

父类构造代码块:myparenttest----------------------------构造代码块,此时成员变量已赋值完

父类构造函数lilei

子类构造代码块:myson----------------------------------父类的所有构造完成后才执行子类的构造

子类构造函数lilei


父类构造代码块:myparenttest-------------------第二次new 子类的时候执行结构的开始

父类构造函数hanmeimei

子类构造代码块:myson

子类构造函数hanmeimei

总结:

执行顺序如下:

1、父类静态代码块

2、子类静态代码块

3、父类构造代码块

4、父类构造函数

5、子类构造代码块

6、子类构造函数

如果加入成员变量的赋值时机:

执行顺序如下:

1、父类静态代码块

2、子类静态代码块

3、父类成员变量默认值

4、子类成员变量默认值

5、父类成员变量赋值(myparenettest)取代默认值

6、父类构造代码块

7、父类构造函数

8、子类成员变量赋值取代默认值

9、子类构造代码块

10、子类构造函数

成员变量的赋值实际是先于构造函数的。父类的构造函数执行完成后才会给子类的成员变量赋值替换默认值

你可能感兴趣的:(静态代码块,构造代码块,构造函数,成员变量赋值顺序)