黑马程序员技术交流社区

标题: 关于变量的一的小问题 [打印本页]

作者: 王虎    时间: 2012-10-7 10:33
标题: 关于变量的一的小问题
请结合内存图说明一下里面的 i  是怎么个变化情况
class A {  
    public int i = 10;   
}      
class B extends A{  
    public int i = 20;
}   
public class Test{
    public static void main(String args[]){  
      B b = new B();   
      A a = b;
      System.out.println(b.i);  
      System.out.println(a.i);   
   }
}

作者: AngieFans85    时间: 2012-10-7 10:52
这个需要什么内存图啊.
a.i就是A对象的成员变量i,b.i就是B类的成员变量i.
作者: 黑马连家华    时间: 2012-10-7 10:57
...我不会用苹果的画图软件啊...
作者: 黑马连家华    时间: 2012-10-7 11:03
...B b = new B();的时候建立了一个B类的实例对象(在堆中),它获得了父类所有非私有方法,父类中同名方法或属性被隐藏,所以b.i = 20
   A a = b;这时候将对象b的引用(在栈中)传递给a(也在栈中),这时候是父类a引用指向了子类对象(就是上一步的new B()实例),产生了多态,父类引用得不到子类特有的方法,所以a.i值为10
作者: 谭立文    时间: 2012-10-7 11:07
............

QQ截图20121007110607.png (14.22 KB, 下载次数: 37)

QQ截图20121007110607.png

作者: AngieFans85    时间: 2012-10-7 11:27
黑马连家华 发表于 2012-10-7 11:03
...B b = new B();的时候建立了一个B类的实例对象(在堆中),它获得了父类所有非私有方法,父类中同名方法或属 ...

"A a = b;这时候将对象b的引用(在栈中)传递给a(也在栈中),这时候是父类a引用指向了子类对象(就是上一步的new B()实例),产生了多态,父类引用得不到子类特有的方法,所以a.i值为10"

其实这个不是多态啦,多态要满足三个要素:
1 父类引用指向子类对象.
2 要有继承.
3 要有非静态方法重写.
而此处只满足了第1点,所以不是多态实现.
a.i为10也不是因为父类引用得不到子类特有的方法,而是成员属性(包括静态的与非静态的)不存在多态一说,而且静态方法也不存在多态一说,只有非静态方法才可能够成多态实现.
此处a.i为10,是因为a.i就是调用到A类的成员变量i而已.
作者: 王虎    时间: 2012-10-7 11:40
黑马连家华 发表于 2012-10-7 11:03
...B b = new B();的时候建立了一个B类的实例对象(在堆中),它获得了父类所有非私有方法,父类中同名方法或属 ...

这样理解是不是更好些“产生了多态,父类引用得不到子类特有的属性”因为此题好像没涉及到“子类特有的方法”
作者: 王虎    时间: 2012-10-7 11:46
黑马连家华 发表于 2012-10-7 11:03
...B b = new B();的时候建立了一个B类的实例对象(在堆中),它获得了父类所有非私有方法,父类中同名方法或属 ...

哦了,想通了,说的很到位!
作者: 黑马连家华    时间: 2012-10-7 12:48
马镱洵 发表于 2012-10-7 11:27
"A a = b;这时候将对象b的引用(在栈中)传递给a(也在栈中),这时候是父类a引用指向了子类对象(就是上一步的 ...

有了第一点,第二点肯定也是存在的...没有继承怎么会存在父类和子类的引用.
关于第三点,我没学好,我再看看
作者: 黑马连家华    时间: 2012-10-7 12:57
马镱洵 发表于 2012-10-7 11:27
"A a = b;这时候将对象b的引用(在栈中)传递给a(也在栈中),这时候是父类a引用指向了子类对象(就是上一步的 ...

有了第一点,第二点肯定也是存在的...没有继承怎么会存在父类和子类的引用.
关于第三点,我没学好,我再看看
作者: AngieFans85    时间: 2012-10-7 13:20
黑马连家华 发表于 2012-10-7 12:48
有了第一点,第二点肯定也是存在的...没有继承怎么会存在父类和子类的引用.
关于第三点,我没学好,我再看看 ...

"有了第一点,第二点肯定也是存在的...没有继承怎么会存在父类和子类的引用."

嗯,可以这样理解,那么此处也只是满足前两点,仍然不是多态实现,呵呵.
作者: AngieFans85    时间: 2012-10-7 13:22
王虎 发表于 2012-10-7 11:40
这样理解是不是更好些“产生了多态,父类引用得不到子类特有的属性”因为此题好像没涉及到“子类特有的方 ...

是不是构成了多态,与属性一点关系都没有的,只与实例方法有关.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2