Java继承中为什么不使用super关键字也能调用父类的方法和属性?
Java继承成员访问规则解答
根本原因:子类已经继承了父类的对应成员
Java的继承机制中,子类会自动获得父类所有可访问的成员(属性和方法),你不需要加super就能直接调用,本质是你调用的是子类从父类继承后属于自身的成员,不是直接跨类调用父类的成员。
你当前代码满足两个可继承条件:
- 父类的
subject属性、intro()方法都用的是默认(包)访问权限,且父子类在同一个默认无名包下,符合继承的访问权限要求 - 你没有在子类中定义和父类同名的
intro()方法、subject属性,没有出现成员遮蔽/方法重写的情况
什么时候才需要使用super关键字访问父类成员?
只有当子类出现和父类同名的成员,需要明确区分访问父类版本的时候,才必须用super:
比如你给子类加一个重写的intro()方法,就能看出区别:
class ChildClass extends ParentClass { ChildClass(String name) { super(name); } // 重写父类的intro方法 void intro () { System.out.println("子类自定义的intro方法"); } void getMethodParent() { intro(); // 调用的是子类自己重写的intro,输出"子类自定义的intro方法" super.intro(); // 必须加super才能调用父类原本的intro,输出"Learn Java" } }
如果子类没有重写父类方法,也没有定义同名属性,intro()和super.intro()的执行效果完全一致,不需要额外加super。
补充说明访问权限的影响
如果父类的成员用private修饰,子类就算继承了也不能直接访问,必须通过父类提供的public/protected访问方法才能调用,这种情况下就算加super也没法直接访问私有成员。
内容的提问来源于stack exchange,提问作者Angkasa Olrenza
相关产品推荐
相关产品推荐

