一道Java面试题

 
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.

转载于:https://www.cnblogs.com/SCAU_que/archive/2010/12/05/1897276.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值