黑马程序员技术交流社区

标题: 为什么输出结果不同——多态中成员变量 [打印本页]

作者: 天天学习    时间: 2013-12-24 20:28
标题: 为什么输出结果不同——多态中成员变量
本帖最后由 天天学习 于 2013-12-26 22:37 编辑

代码1:
  1. class Fu
  2. {
  3.         int i;
  4.         Fu()
  5.         {
  6.                 i = 5;
  7.         }
  8. }
  9. class Zi extends Fu
  10. {
  11.         int i;
  12.         Zi(int i)
  13.         {
  14.                 this.i = i;
  15.         }
  16. }
  17. class Test
  18. {
  19.         public static void main(String[] args)
  20.         {
  21.                 Fu f = new Zi(3);
  22.                 System.out.println(f.i);
  23.         }
  24. }
复制代码
代码2:
  1. class Fu
  2. {
  3.         int i;
  4.         Fu()
  5.         {
  6.                 i = 5;
  7.         }
  8. }
  9. class Zi extends Fu
  10. {
  11.         Zi(int i)
  12.         {
  13.                 this.i = i;
  14.         }
  15. }
  16. class Test
  17. {
  18.         public static void main(String[] args)
  19.         {
  20.                 Fu f = new Zi(3);
  21.                 System.out.println(f.i);
  22.         }
  23. }
复制代码
代码1打印为5,而代码2打印3而不打印5,具体原因是什么?


作者: kun1990    时间: 2013-12-24 22:31
首先,Zi 继承了Fu ,int i 是public的即,Zi也是可以继承的,new Zi(3)此时就给了 i 赋值,因为new的时候没有使用的是无参构造,所以,不会执行Fu()这一构造
作者: jing迪    时间: 2013-12-24 23:05
第一题子类有自己的成员变量i所以不用父类的
第二题子类没有自己的成员变量,继承的父类的成员变量所以把i修改成3
作者: Zenith    时间: 2013-12-25 11:33
Zi继承Fu   相当于Fu 里的东西Zi都有  那么new Zi(3),就会在Zi里找带参构造,this 代表的是本类的对象.把子的参数3赋值给了Fu中的变量i.就把Fu里的东西都放Zi 里就清楚了
作者: Zenith    时间: 2013-12-25 11:36
就把Fu里的东西 全部放Zi 里
你就能看清楚了
this代表的是本类的变量  
带参构造Zi(3)
就是把3赋值给了  Fu 中的变量i
作者: 静心远行    时间: 2013-12-26 11:45
对于代码1,我曾经看到过这样的解释:声明父类对象用子类进行实例化时,这个被声明的对象是一个父类对象,但是它指向了子类的引用,它的属性保留的是父类里边的属性,但是它调用的却是子类里边的方法,即f的属性i
作者: 静心远行    时间: 2013-12-26 11:46
接上,属性i是用的父类中的i
作者: 静心远行    时间: 2013-12-26 11:50
代码2:我感觉是因为子类的构造方法zi(int i)中执行this.i=i是发现子类中没有i这个属性,所以默认把i的值赋给了父类中的i.------我也在学习,仅供参考。
作者: 戴荣辉    时间: 2013-12-26 13:28
代码一 成员变量无论编译和运行,都参考左边 所以是5  而代码二因为子类继承了父类中的i  那么修改成3




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