为什么外部 Java 类可以访问内部类私有成员?

我观察到 Outer 类可以访问内部类私有实例变量。这怎么可能?下面是演示相同内容的示例代码:

class ABC{
    class XYZ{
        private int x=10;
    }

    public static void main(String... args){
        ABC.XYZ xx = new ABC().new XYZ();
        System.out.println("Hello :: "+xx.x); ///Why is this allowed??
    }
}

为什么允许此行为?


答案 1

内部类只是一种干净地分离一些真正属于原始外部类的功能的方法。它们适用于有 2 个要求的情况:

  1. 如果外部类中的某些功能是在单独的类中实现的,则该功能将最清楚。
  2. 即使它位于单独的类中,该功能也与外部类的工作方式密切相关。

给定这些要求,内部类可以完全访问其外部类。由于它们基本上是外部类的成员,因此它们有权访问外部类的方法和属性(包括私有项)是有道理的。


答案 2

如果要隐藏内部类的私有成员,则可以定义一个具有公共成员的接口,并创建一个实现此接口的匿名内部类。波纹管示例:

class ABC{
    private interface MyInterface{
         void printInt();
    }

    private static MyInterface mMember = new MyInterface(){
        private int x=10;

        public void printInt(){
            System.out.println(String.valueOf(x));
        }
    };

    public static void main(String... args){
        System.out.println("Hello :: "+mMember.x); ///not allowed
        mMember.printInt(); // allowed
    }
}