Java 父与子 内存

来源:互联网 发布:网络双生是什么意思 编辑:程序博客网 时间:2024/05/18 03:15

昨天讲了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。





0 0