You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 04:05:37