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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ______雨点ペ 中级黑马   /  2014-11-7 21:46  /  2258 人查看  /  23 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


我的分析:B是A的子类,因此会继承A类中的fun1()和fun2()。当new一个B类对象时,用其引用b调用fun1(),由于
B类继承了A类中的fun1(),因此会运行fun1()进而运行fun2(),最终打印出888.当用A类引用a指向子类对象B时,A类
引用a调用了fun1(),因此运行的是A类中的fun1(),进而运行fun2(),最终打印结果为888.
但是我用eclipse运行这个程序的时候没有运行结果,是不是我对程序的分析错了啊!请高人分析一下程序。

评分

参与人数 1黑马币 +1 收起 理由
杨佳名 + 1

查看全部评分

23 个回复

倒序浏览
你的main方法都没有包含在一个类中,main方法是static的,必须由类去调用,但是你的mian方法没有自己所属的类啊,不知道我说的对不对,你可以试一试
回复 使用道具 举报
你这有两个public 的类, 编译器应该会报错,你把class A的public修饰去掉再看看
回复 使用道具 举报
而且结果是
999
999
因为 B b = new B();
b 是指向B的对象,而B中其实是有两个方法,分别是
  1. void fun1(){
  2.                 System.out.println(fun2());
  3.         }
复制代码
  1. int fun2(){
  2.                 return 999;
  3.         }
复制代码

所以fun1中打印的fun2的返回值是999,因为已经把父类的fun2覆盖了

接下来 A a =b;a.fun1();还是调用子类B的fun1方法,和之前相同,所以还是999
回复 使用道具 举报 1 0
代码没有问题,结果应该是两个999
回复 使用道具 举报
不是覆盖了么,你为什么会认为是888?
回复 使用道具 举报
不是2个999么
回复 使用道具 举报
应该是没问题啊,运行结果应该是俩999皮炎平
回复 使用道具 举报
飘过。。。
回复 使用道具 举报
youtianlong123 发表于 2014-11-7 22:36
你的main方法都没有包含在一个类中,main方法是static的,必须由类去调用,但是你的mian方法没有自己所属的 ...

main()在B类中。它所属的类是B类
回复 使用道具 举报
RINGARES 发表于 2014-11-7 22:46
你这有两个public 的类, 编译器应该会报错,你把class A的public修饰去掉再看看 ...

哪有两个Public修饰的类?就一个类A被public修饰了!
回复 使用道具 举报
本帖最后由 ______雨点ペ 于 2014-11-8 18:24 编辑
RINGARES 发表于 2014-11-7 22:55
而且结果是
999
999

我认为A a = new B(),   a.fun1()调用的是A类中的fun1(),因为B类没有重写A类的fun1()。
回复 使用道具 举报
你应该是在eclipse中建立的,把A类的public去掉试试看
回复 使用道具 举报
你应该是在eclipse中建立的,把A类的public去掉试试看
回复 使用道具 举报
我觉得楼主对多态这地方理解的不够,我的想法跟楼主有些相似。还得继续学习理解啊,结果是两个999,你的程序写的没问题,不可能没结果啊。
回复 使用道具 举报
DamonZh 发表于 2014-11-8 19:16
我觉得楼主对多态这地方理解的不够,我的想法跟楼主有些相似。还得继续学习理解啊,结果是两个999,你的程 ...

你看啊!B类继承了A类中的fun1(),因此B b = new B()后,用b调用fun1(),调用的是B继承过来的fun1(),然后又调用了fun2(),由于B类重写了A类中的fun2(),因此调用的是B类中的fun2(),运行结果为999.但是,A a = new B()后,即用父类引用a去调用fun1(),子类B类继承了fun1()但是没有重写fun1(),那么用父类引用a去调用fun1()时,我认为调用的是A类中的fun1().但是别人认为调用的仍是B类继承来的fun1().我就这一点不懂了。
回复 使用道具 举报
RINGARES 发表于 2014-11-7 22:55
而且结果是
999
999

你看啊!B类继承了A类中的fun1(),因此B b = new B()后,用b调用fun1(),调用的是B继承过来的fun1(),然后又调用了fun2(),由于B类重写了A类中的fun2(),因此调用的是B类中的fun2(),运行结果为999.但是,A a = new B()后,即用父类引用a去调用fun1(),子类B类继承了fun1()但是没有重写fun1(),那么用父类引用a去调用fun1()时,我认为调用的是A类中的fun1().但是别人认为调用的仍是B类继承来的fun1().我就这一点不懂了。老师说过,父类引用指向子类对象时,如果子类重写了父类中的方法后,用父类引用调用这个方法,调用的是子类重写过来的这个方法。所以我想问你:父类引用指向子类对象时,如果子类没有重写父类中的方法,仅仅是子类继承了父类中的这个方法,那么用父类引用去调用这个方法,调用的是父类中的这个方法,还是子类从父类继承过来的这个方法?为什么?
回复 使用道具 举报
______雨点ペ 发表于 2014-11-8 17:36
哪有两个Public修饰的类?就一个类A被public修饰了!

哦,看错了,那就是声明public 的类,名称要和.java文件名一致,除此以外代码没有问题
回复 使用道具 举报
______雨点ペ 发表于 2014-11-8 20:02
你看啊!B类继承了A类中的fun1(),因此B b = new B()后,用b调用fun1(),调用的是B继承过来的fun1(),然后 ...
父类引用指向子类对象时,如果子类没有重写父类中的方法,仅仅是子类继承了父类中的这个方法,那么用父类引用去调用这个方法,调用的是父类中的这个方法,还是子类从父类继承过来的这个方法?


实际上还是子类对象去调取这个方法,这个方法是子类从父类继承过来的,就是子类的方法了
回复 使用道具 举报
RINGARES 发表于 2014-11-8 20:14
实际上还是子类对象去调取这个方法,这个方法是子类从父类继承过来的,就是子类的方法了 ...

那你的意思是当父类引用指向子类对象时,用父类引用去调用某个方法(这个方法不是子类特有的方法),调用的是子类继承过来的方法。如果子类重写了父类中的这个方法,用父类引用调用的是子类重写过来的这个方法。这两种情况的区别就是:一种是父类引用调用的是子类继承过来的方法,一种是父类引用调用的是子类重写过来的的方法。对吗?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马