当前位置: 代码迷 >> J2SE >> 关于继承的堆创建的有关问题
  详细解决方案

关于继承的堆创建的有关问题

热度:70   发布时间:2016-04-24 12:23:18.0
关于继承的堆创建的问题
public class Test1 {
public int a ;
public Test1(){
a=3;
}
public void addFive(){
a+=5;
}
public static void main(String[] args) {
Test1 t = new Test2();
t.addFive();
System.out.println(t.a);
}
}
class Test2 extends Test1{
public int a;
public Test2(){
a=8;
}
public void addFive(){
a+=5;
}
}

为什么结果是3呢?这个对象的堆空间是怎么搞的?

------解决方案--------------------
Java code
public static void main(String[] args)    {        Test1 t = new Test2();        t.addFive();        System.out.println(t.getA());    }        public int getA()    {        return a;    }
------解决方案--------------------
Java code
子类的内存空间是在父类内存空间上扩展的|-----------||  父类内存  ||  父类的a   ||-----------||  子类内存  ||  子类的a   ||-----------||    VT     ||-----------|VT是方法管理的虚拟表(viture table)可以想象成这样一个内存模型,子类对象是个大整体,父类对象是子类对象的一部分this包含整个大整体的空间,super包含父类对象的内存空间当你用父类引用变量指向子类对象的时候,引用有效部分只是父类内存空间和VT,即子类扩展的新的属性和方法,父类引用变量是访问不到的LZ可以试试在Test2追加一个新的方法,如addSix();然后调用 t.addSix()看看,就知道t能访问的范围了如果此时想访问 addSix(),必须转换为子类对象才可以,即((Test2)t).addSix()(Test2)t实际上就是相当于一个临时变量 Test2 t2 = (Test2)t;LZ再好好体会一下这其中的意思吧
------解决方案--------------------
对象.属性,只找类区的。你是 父类(不管装的是不是子对象).属性 ,所以在父类区找。这个和父类(不管装的是不是子对象).方法()是不一样的
------解决方案--------------------
楼主,只有成员方法是动态绑定的,其他的类成员变量,静态变量及静态方法都是静态绑定的,所以你尽管创造的是子类的实例,但声明却是父类的,所以成员变量是跟父类绑定在一起的,也就是a=3了,之后你调用了addFive()方法,这个是动态绑定的,绑定到子类中的addFive()方法,在这个方法中,你把子类的a加了5,父类的a并没有+5,所以最后打印出a=3了。
  相关解决方案