黑马程序员技术交流社区

标题: 送题啦求大神帮忙详细分析下列代码运行结果,说明原理。 [打印本页]

作者: 蓝墨清幽    时间: 2015-4-26 09:44
标题: 送题啦求大神帮忙详细分析下列代码运行结果,说明原理。
送题啦。求大神帮忙详细分析下列代码运行结果,说明原理。(没有分析结果不得分)。
下列代码主函数中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();
                }
        }

作者: Larno    时间: 2015-4-26 09:56
        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


作者: Zack    时间: 2015-4-26 10:02
编译看左边,运行看右边,看看老毕讲的多态,A a = b;父类引用指向子类对象,调用的只会是子类的方法
作者: 弹剑高歌踏浪行    时间: 2015-4-27 23:37
A a = b;等价于 A a = b = new B(); 即A a = new B(); 此为多态。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2