黑马程序员技术交流社区

标题: 作业题目 [打印本页]

作者: 蝶的历练    时间: 2013-3-31 21:30
标题: 作业题目
本帖最后由 蝶的历练 于 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,大神们能说一下里面的执行顺序吗,都快搞晕了
作者: 我手心里的宝    时间: 2013-3-31 21:37
你new B()对象 b.i当然是访问对象b的i的值
后面你让父类指向子类对象,所以a.i访问的是A类的i的值
这用到了多多态,父类指向子类对象,在方法中,如果子类复写了父类的方法,父类会调用子类的方法,如果父类没有子类调用的方法,
则会报错
对于属性还是各自用各自的
说到顺序:
1.创建了子类对象
2.父类指向了子类对象
3.调用子类的i的值
4.调用了父类的i的值
作者: 我自信我很牛    时间: 2013-3-31 21:41
你的输出语句第一条直接是子类引用指向子类对象,所以毫无疑问调用的肯定是子类自己的属性,所以是20,第二条输出语句中的引用是父类,再调用属性也是父类特有的属性,只有调用方法时,子类重写父类的方法才会被调用.
作者: 赵喜平    时间: 2013-3-31 22:03
  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. }
复制代码
这是多态的知识点

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

作者: 蝶的历练    时间: 2013-3-31 22:09
标题: RE: 作业题目
赵喜平 发表于 2013-3-31 22:03
这是多态的知识点

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

A a = b;这句话怎么理解啊
作者: HM刘俊    时间: 2013-4-1 00:33
A a = b;完整代码应该是A a=B b;
也就是父类引用A一个a指向子类对象B类对象b,
也就是多态。
根据多态的特性结果应该参考左边父类。
作者: 山西_李帅    时间: 2013-4-1 01:07
给你分享点多态的知识,你看下:

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

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

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


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




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