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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭军亮 中级黑马   /  2013-5-13 17:11  /  1114 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郭军亮 于 2013-5-13 23:45 编辑
  1. class Fu
  2. {
  3.         int num=4;
  4.         void show()
  5.         {
  6.                 System.out.println("showFu");
  7.         }
  8. }
  9. class Zi extends Fu
  10. {
  11.         int num=5;
  12.         void show()
  13.         {
  14.                 System.out.println("showZi");
  15.         }
  16. }
  17. class T
  18. {
  19.         public static void main(String[] args)
  20.         {
  21.                 Fu f=new Zi();
  22.                 Zi z=new Zi();
  23.                 System.out.println(f.num);
  24.                 System.out.println(z.num);
  25.                 f.show();
  26.                 z.show();         
  27.         }
  28. }

  29. 4
  30. 5
  31. showZi
  32. showZi
复制代码
想问一下问什么会输出4而不是5呢???

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

4 个回复

倒序浏览
是这样,在多态中成员变量的特点是:
无论在编译和运行时都参考左边,即引用型变量所属的类,也可以理解为父类。
所以运行时f.num的值由父类num来决定。
希望可以帮助到你。
回复 使用道具 举报
本帖最后由 zms2100 于 2013-5-13 17:32 编辑

多态特性 :        (个人笔记,仅供参考,O(∩_∩)O~)
四、变量不能被重写(覆盖),”重写“的概念只针对方法。      //这一句好像是老师的原话,呵呵
(1、当子类中有与父类同名的变量时,子类对象会优先访问本类中的变量,而多态时,调用父类变量也是访问父类本身的变量)

回复 使用道具 举报
本帖最后由 long 于 2013-5-13 17:30 编辑

因为类中的字段是不存在复写的,多态只能应用于被复写的方法,不能应用于字段,父类与子类的同名字段在内存中占有不同的内存空间。子类对象其实包含了一个父类对象。只要父类对象的字段不是用private修饰的,就可以在子类对象中访问。
Fu f = new Zi();
f 虽然指向一个子类的对象,但它是一个父类的引用,f.num 自然指的是父类中的字段num。((Zi)f).num 表示的才是子类对象的num,本例中等于z.num, 也就是5。

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

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