Java嵌套类中私有构造可调用但私有方法不行的原因探究
私有嵌套类中方法调用的访问规则解析
先看示例代码:
public class AccessModifierTest { private static class Super { private int n = 3; private Super() {} private void setN(int n) { this.n = n; } } private static class Sub extends Super { private Sub() { super(); // invoking private ctor is permitted // setN(5); but invoking private method is not permitted, why? // super.setN(5); this is fine too } } public static void main(String[] args) { Super superInstance = new Sub(); } }
核心原因拆解:
私有构造能被调用的本质:
Java中,同一个外部类下的嵌套类(包括静态嵌套类)之间,互相拥有对方私有成员的访问权限。Super和Sub都是AccessModifierTest的私有静态嵌套类,所以Sub可以直接调用Super的私有构造方法super()。直接调用
setN(5)失败的原因:
私有方法不会被子类继承。Super的setN是私有方法,Sub作为子类根本没有继承这个方法。当你直接写setN(5)时,编译器会先在Sub自身查找该方法,找不到就会尝试查找继承的方法,但由于该方法没被继承,编译器判定“找不到方法setN(int)”,所以报错。super.setN(5)可行的原因:
用super.前缀明确指定调用父类Super的方法时,编译器会直接去Super类中查找该方法。又因为Sub和Super同属外部类的嵌套类,有权访问Super的私有成员,所以这种直接指定父类的调用是被允许的。
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

