public class P {
public static int sint = 2;
private int iint = 1;
static {
System.out.println(sint);
sint = 3;
}
{
System.out.println(iint);
iint = 4;
}
public P() {
System.out.println(sint);
System.out.println(iint);
}
public int getIint() {
return iint;
}
public void setIint(int iint) {
this.iint = iint;
}
}
//===========================================================
public class S extends P {
public static int sint = 5;
private int iint = 6;
static {
System.out.println(sint);
sint = 7;
}
{
System.out.println(iint);
iint = 8;
}
public S() {
System.out.println(sint);
System.out.println(iint);
}
public int getIint() {
return iint;
}
public void setIint(int iint) {
this.iint = iint;
}
}
//===========================================================
public class d {
public static void main(String[] args) {
P p = new S();
System.out.println("p.sint = " + p.sint);
System.out.println("p.iint = " + p.getIint());
}
}
结果是什么?
2,1,2,1,5,6,5,6(7,8)?不是
是2,5,1,3,4,6,7,8(3,8)
从结果我们可以看出当实例化子类时,先去执行父类的构造方法,执行完一条函数后返回子类执行子类构造方法中的一条函数,再返回父类构造方法执行下一条函数,
直到父类的构造方法执行完后,再执行父类static静态方法。都执行完后才返回执行子类的构造方法和静态方法。由于sint在父类中声明为static类型,sint的值只能改变
一次,这就是为什么括号里第一个数是3而不是7.