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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

送题啦。求大神帮忙详细分析下列代码运行结果,说明原理。(没有分析结果不得分)。
下列代码主函数中B的对象b调用函数fun1()会调用B中方法,输出结果是:456.可是A的对象a调用方法fun1()怎么也输出:456.??
        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();
                }
        }

3 个回复

倒序浏览
        class A {
            void fun1() {
                      System.out.println(fun2());
                }
                int fun2() {
                        return 123;
                }
        }
         public class B extends A {
                         //子类重写父类的方法fun2();多态的一种体现
                int fun2() {
                         return 456;
                 }
              public static void main(String args[]) {
                                      //创建B类的对象
                        B b = new B();
                        //调用B类继承父类A的方法
                        //在运行是fun1()调用fun2(),
                        //因为B类中有fun2()方法,
                        //所以调用B类中的fun2();
                        //运行时多态,所以结果为:456

                        b.fun1();
                        //父类引用指向子类实例,多态的一种体现

                        A a = b;
                        //调用方法时,会根据实际的类型即B类的类型调用B类中的方法
                        //运行时多态。因为B类中没有fun1(),所以调用继承自父类中的fun1()
                        //在运行是fun1()调用fun2(),因为B类中有fun2()方法,
                        //所以调用B类中的fun2();
                        //运行时多态,所以结果为:456
                        a.fun1();
                }
        }
解答:
运行结果是:
456
456
分析过程详见上述代码中的注释。
不谢!!:P:lol

回复 使用道具 举报
编译看左边,运行看右边,看看老毕讲的多态,A a = b;父类引用指向子类对象,调用的只会是子类的方法
回复 使用道具 举报
A a = b;等价于 A a = b = new B(); 即A a = new B(); 此为多态。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马