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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

865408846

初级黑马

  • 黑马币:31

  • 帖子:11

  • 精华:0

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个答案都一样的,想问哪个思路是正确的?为什么?错的错在哪了?

4 个回复

倒序浏览
两个思路都不对可不一样么。
                B b = new C();
                b.show();
编译看左边:B中没有show()方法,那么就继承A中show()方法,就是注释里面的部分。编译通过,不报错;
运行看右边:执行C中show()方法,由super.show()转至B中执行show()方法:执行show2(),特别注意,由于C中重写了show2()方法,所以此处执行的是C中show2()输出“你”,而不是执行B中show2()输出“爱”
回复 使用道具 举报
水月灬清影 发表于 2016-8-23 16:37
两个思路都不对可不一样么。
                B b = new C();
                b.show();

非常感谢
回复 使用道具 举报
super调用父类的方法并不是用父类对象调用父类方法。调用者还是子类对象,所以你的父类的show()方法里的show2()一直是调用的本类的show2()方法。
回复 使用道具 举报
其实个人观点,super指向的是子类对象中父类的那一非重叠部分或未被子类重写的部分——>这种符合面向对象思想,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马