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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 碎流 高级黑马   /  2014-8-27 23:37  /  4080 人查看  /  15 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 碎流 于 2014-8-28 11:51 编辑

分析运行结果,说明原理。(没有分析结果不得分)

        class A {
            void fun1() {
                      System.out.println(fun2());
                }
                int fun2() {
                        return 123;
                }
        }
         public class B extends A {
                int fun2() {
                         return 456;
                 }
              public static void main(String args[]) {
                        B b = new B();
                        b.fun1();
                        A a = b;
                        a.fun1();
                }
        }

评分

参与人数 1技术分 +1 收起 理由
天黑偷牛 + 1 有问题就要来讨论

查看全部评分

15 个回复

正序浏览
运行结果是:
456
456

分析如下:
1,第一个执行语句创建B对象,而B类继承A类,所以B类中的fun2()方法会覆盖A类中的fun2()方法
因此b.fun1();语句调用的是B类中的fun2()方法,故返回456
2,A a = b;语句的作用是将B类的对象赋值给父类即多态中的向上转型,a和b指向对内存中的同一对象
故调用结果也是一直的,同样为456

点评

牛!  发表于 2015-6-18 16:37

评分

参与人数 1黑马币 +5 收起 理由
碎流 + 5 很给力! 谢谢..

查看全部评分

回复 使用道具 举报
运行结果为: 456                    456 分析: 在子类中重写了fun2,使调用fun1的时候打印456 main方法中的b.fun1打印456 a虽然是A类,但是指向b的地址,a.func1依旧是打印456。
回复 使用道具 举报
看懂了,两次都应该是456
回复 使用道具 举报
分析得不错哦
回复 使用道具 举报
5楼分析的不错
回复 使用道具 举报
Kikyou 发表于 2014-8-28 00:13
应该是先456再123吧

是两个456
回复 使用道具 举报
运行结果为: 456
                   456
分析:
在子类中重写了fun2,使调用fun1的时候打印456
main方法中的b.fun1打印456
a虽然是A类,但是指向b的地址,a.func1依旧是打印456。
回复 使用道具 举报
学习了,没学到继承呢
回复 使用道具 举报
本帖最后由 happymouse 于 2014-8-28 09:27 编辑
碎流 发表于 2014-8-28 00:55
这个代码BextendsA  前面不能加入public
我运行的时候是删除了的,可以说下什么原因吗 ...

因为一个java文件里面只能有一个public修饰的类,java文件名必须和被public修饰的类名相同
回复 使用道具 举报
碎流 高级黑马 2014-8-28 00:55:27
7#
happymouse 发表于 2014-8-28 00:18
运行结果是:
456
456

这个代码BextendsA  前面不能加入public
我运行的时候是删除了的,可以说下什么原因吗
回复 使用道具 举报
456和123,b.fun1()这里调用方法的是子类的对象,则用子类已经重写的方法,相当于this.fun1(),而a。fun()则是父类对象调用,相当于super。fun1(),代码貌似有问题,我也刚学,找不出问题在哪
回复 使用道具 举报
应该是先456再123吧
回复 使用道具 举报

回帖奖励 +5

楼主看看方法调用的顺序和对应对象问题就行了;
回复 使用道具 举报
没人吗,,,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马