Java 父与子 内存

昨天讲了Java类成员的初始化顺序,我今天再深入的讲一下,先看下面的代码

public class Parent {
    int number = 1;

    public Parent() {
        display();
    }

    public void display() {
        Log.d("TAG", " number = " + number);
    }
}

public class Child extends Parent {
    int number = 2;
    public Child() {
        number = 3;
    }

    public void display() {
        Log.d("TAG", " number = " + number);
    }
}
如果我执行new Child();

大家能得出答案么?1或2?还是3呢?如果大家运行一下,大部分人可能都会懵逼了,why ? !!!

答案是0....

为什么是0呢,我们来分析一下

通过之前讲的类的初始化相关内容,在Parent的构造函数执行的时候,Child的变量与构造函数还未执行。其实在最开始的时候,编译器还做了一件事,那就是为变量分配内存,Parent与Child中的number变量都分配了内存空间,这时它们的值为0。

再认真想一下,我们在Parent构造函数里display()时,display()是调用的是Parent还是Child的呢?我们知道,当子类重写了父类的方法时,子类的方法就会覆盖父类的方法,我们是用的new Child(),那么这时的display()就是Child的。number是当前方法所在类的,所以结果是0。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值