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.