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.
posted on 2010-12-05 23:18  KuSiuloong  阅读(596)  评论(0编辑  收藏  举报