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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蝶的历练 中级黑马   /  2013-3-31 21:30  /  2212 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 蝶的历练 于 2013-4-1 21:04 编辑

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);   
   }
}
答案为什么是输出20,和10,大神们能说一下里面的执行顺序吗,都快搞晕了

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

6 个回复

倒序浏览
你new B()对象 b.i当然是访问对象b的i的值
后面你让父类指向子类对象,所以a.i访问的是A类的i的值
这用到了多多态,父类指向子类对象,在方法中,如果子类复写了父类的方法,父类会调用子类的方法,如果父类没有子类调用的方法,
则会报错
对于属性还是各自用各自的
说到顺序:
1.创建了子类对象
2.父类指向了子类对象
3.调用子类的i的值
4.调用了父类的i的值

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
你的输出语句第一条直接是子类引用指向子类对象,所以毫无疑问调用的肯定是子类自己的属性,所以是20,第二条输出语句中的引用是父类,再调用属性也是父类特有的属性,只有调用方法时,子类重写父类的方法才会被调用.

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
  1. class A {  
  2.     public int i = 10;   
  3. }      
  4. class B extends A{  
  5.     public int i = 20;
  6. }   
  7. public class Test{
  8.     public static void main(String args[]){  
  9.       B b = new B();   
  10.       A a = b;
  11.       System.out.println(b.i);  
  12.       System.out.println(a.i);   
  13.    }
  14. }
复制代码
这是多态的知识点

成员变量调用多态时,都参考左边

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报

RE: 作业题目

赵喜平 发表于 2013-3-31 22:03
这是多态的知识点

成员变量调用多态时,都参考左边

A a = b;这句话怎么理解啊
回复 使用道具 举报
A a = b;完整代码应该是A a=B b;
也就是父类引用A一个a指向子类对象B类对象b,
也就是多态。
根据多态的特性结果应该参考左边父类。
回复 使用道具 举报
给你分享点多态的知识,你看下:

多态中成员方法的特点:
编译时期:参阅引用类型变量所属的类中是否有调用的方法,如果有,编译通过;没有则失败;
运行时:参阅的是对象所属的类中是否有调用的方法。
注:也就是说成员方法在多态调用时,编译看左边,运行看右边。

多态中成员变量的特点:
无论编译或运行,都参考左边(引用型变量所属的类);

另外还有一个特殊的地方就是:
多态中静态方法无论编译或运行也只参考左边。(或者直接调用)


这是之前记的一些比较,希望能帮到你。

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马