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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 天空音乐 初级黑马   /  2014-12-29 15:45  /  871 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

代码如下
  1. class  sudu
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 fu z = new zi();
  6.                 z.show();
  7.                 System.out.print(z.b);
  8.         }
  9. }

  10. class fu
  11. {
  12.         int d = 10;
  13.         int b = 20;
  14. void show(){
  15.         System.out.println("fu_show");
  16.         }
  17. }

  18. class zi extends fu
  19. {
  20.         int c = 50;
  21.         int b = 60;
  22. void show(){
  23.         System.out.println("zi_show");
  24.         }

  25. }
复制代码

为什么运行结果是zi_show 20而不是zi_show 60????

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 淡定

查看全部评分

9 个回复

倒序浏览
因为这里的z是一个fu类型的,使用fu类型的引用是不能得到其子类的成员变量的,但是通过多态可以访问子类的部分方法(多态是针对方法的,不能推广到成员变量)
PS:命名和格式挺考验人的。
回复 使用道具 举报
子类可以继承父类的成员变量和成员方法,如果子类中有与父类相同的成员变量和成员方法的时候。
父类的引用会调用的是父类的成员变量,而方法则是调用子类的,因为子类的方法是对父类方法的重写。我也不是很理解,只能暂时先记住结果了。
回复 使用道具 举报
覆盖是出现在父类与子类方法之间的,成员变量并没有覆盖一说。因此父类引用不会去调用子类的成员变量,并且父类中没有这个成员变量的话也不会去子类中查找,编译时报错。在这里会产生这个疑问,是因为没有把覆盖的定义理解清楚。
回复 使用道具 举报
成员变量 编译运行都看左边
回复 使用道具 举报
多态时方法的调用编译看左边,运行看右边。变量都看左边。
回复 使用道具 举报
变量是不能被复写的.
回复 使用道具 举报
编译看左边,运行看右边。
回复 使用道具 举报
成员变量编译运行都看左边。。
回复 使用道具 举报
z是父类型的引用,它指向了子类对象。它能能直接访问父类的变量,不能直接访问子类变量,所以输出的是20而不是60。如果要调用子类的成员变量,必须对z做强制类型转换成子类引用:zi a = (zi)z; System.out.print(a.b)的结果就是60。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马