两个测试类:
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、子类构造函数
网友评论