黑马程序员技术交流社区

标题: 关于继承,多态问题,我到底哪错了? [打印本页]

作者: 865408846    时间: 2016-8-23 16:13
标题: 关于继承,多态问题,我到底哪错了?
class A {
        public void show() {
                show2();
        }
        public void show2() {
                System.out.println("我");
        }
}
class B extends A {
        /*
        public void show() {
                show2();
        }
        */

        public void show2() {
                System.out.println("爱");
        }
}
class C extends B {
        public void show() {
                super.show();
        }
        public void show2() {
                System.out.println("你");
        }
}
public class DuoTaiTest4 {
        public static void main(String[] args) {
                A a = new B();
                a.show();
               
                B b = new C();
                b.show();
        }
}
关键看 b.show();
思路一:一开始B继承A,类B里面的show()方法是A里面的,然后方法重写C里面show()是super.show() ,按理讲运行的话这里的super代表的是A这个父类

思路二:一开始B继承A,类B里面show()方法是A里面的show2(); 运行的时候继承C里面的show(),super代表的是B这个父类,意思是运行B里面的show(),这个 show()是A继承来的

我发现2个答案都一样的,想问哪个思路是正确的?为什么?错的错在哪了?
作者: 水月灬清影    时间: 2016-8-23 16:37
两个思路都不对可不一样么。
                B b = new C();
                b.show();
编译看左边:B中没有show()方法,那么就继承A中show()方法,就是注释里面的部分。编译通过,不报错;
运行看右边:执行C中show()方法,由super.show()转至B中执行show()方法:执行show2(),特别注意,由于C中重写了show2()方法,所以此处执行的是C中show2()输出“你”,而不是执行B中show2()输出“爱”
作者: 865408846    时间: 2016-8-23 16:43
水月灬清影 发表于 2016-8-23 16:37
两个思路都不对可不一样么。
                B b = new C();
                b.show();

非常感谢
作者: 阿卜    时间: 2016-8-23 16:43
super调用父类的方法并不是用父类对象调用父类方法。调用者还是子类对象,所以你的父类的show()方法里的show2()一直是调用的本类的show2()方法。




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