A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王虎 中级黑马   /  2012-10-7 10:33  /  1783 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请结合内存图说明一下里面的 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);   
   }
}

11 个回复

倒序浏览
这个需要什么内存图啊.
a.i就是A对象的成员变量i,b.i就是B类的成员变量i.
回复 使用道具 举报
...我不会用苹果的画图软件啊...
回复 使用道具 举报
...B b = new B();的时候建立了一个B类的实例对象(在堆中),它获得了父类所有非私有方法,父类中同名方法或属性被隐藏,所以b.i = 20
   A a = b;这时候将对象b的引用(在栈中)传递给a(也在栈中),这时候是父类a引用指向了子类对象(就是上一步的new B()实例),产生了多态,父类引用得不到子类特有的方法,所以a.i值为10

评分

参与人数 2技术分 +1 黑马币 +2 收起 理由
创出一片辉煌 + 1
王虎 + 2 说的很到位

查看全部评分

回复 使用道具 举报
............

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

QQ截图20121007110607.png
回复 使用道具 举报
黑马连家华 发表于 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而已.

评分

参与人数 1黑马币 +1 收起 理由
王虎 + 1 你说的更合理些!

查看全部评分

回复 使用道具 举报
王虎 中级黑马 2012-10-7 11:40:04
7#
黑马连家华 发表于 2012-10-7 11:03
...B b = new B();的时候建立了一个B类的实例对象(在堆中),它获得了父类所有非私有方法,父类中同名方法或属 ...

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

哦了,想通了,说的很到位!
回复 使用道具 举报
马镱洵 发表于 2012-10-7 11:27
"A a = b;这时候将对象b的引用(在栈中)传递给a(也在栈中),这时候是父类a引用指向了子类对象(就是上一步的 ...

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

有了第一点,第二点肯定也是存在的...没有继承怎么会存在父类和子类的引用.
关于第三点,我没学好,我再看看
回复 使用道具 举报
黑马连家华 发表于 2012-10-7 12:48
有了第一点,第二点肯定也是存在的...没有继承怎么会存在父类和子类的引用.
关于第三点,我没学好,我再看看 ...

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

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

是不是构成了多态,与属性一点关系都没有的,只与实例方法有关.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马