为什么在 Java 中定义内部(非静态嵌套)类 时使用访问说明符?

Why use access specifiers when defining inner (non-static nested) classes in Java?

考虑以下片段:

class Deep {

    static class StaticInner {

    }

    class InnerClass {

    }

    public class InnerClass2 {

    }

    private class InnerClass3 {

    }

    protected class InnerClass4 {

    }
}

public class Test {

    public static void main(String args[]) {
        Deep.StaticInner sc = new Deep.StaticInner(); // valid
        Deep.InnerClass ic = new Deep.InnerClass(); // invalid
        Deep.InnerClass2 ic2 = new Deep.InnerClass2(); // invlaid
        Deep.InnerClass3 ic3 = new Deep.InnerClass3(); // invalid
        Deep.InnerClass4 ic4 = new Deep.InnerClass4(); // invalid
    }
}

除了名为 StaticInner 的 Deep 中的静态 class,所有其他嵌套的 classes 都需要封闭的 class Deep 才能被访问。换句话说,它们不能在 Deep 之外访问(这是我的理解)。我见过程序员在 nested-inner classes 之前指定说明符。重点是什么?如果(非静态)内部 classes 在封闭的 class 之外根本无法访问,为什么说明符 (publicprivate、&protected)给出?为什么 Java 甚至支持内部 classes 上的访问说明符?

您可以像这样实例化 public 非静态内部 class:

public class HelloWorld{

    public class HellowWorld2{
        public HellowWorld2(){
            System.out.println("Hellow World2");
        }
    }

     public static void main(String []args){
        System.out.println("Hello World");
        new HelloWorld().new HellowWorld2(); //The instantiation
     }
}

如果 hellowworld2 是私有的,你就做不到。所以它并非完全没有意义,您可能会遇到一些想要在外部 class 之外实例化并且不关心外部 class 引用的场景。

 public class Deep {
    static class StaticInner {

    }

    class InnerClass {

    }

    public class InnerClass2 {

    }

    private class InnerClass3 {

    }

    protected class InnerClass4 {
        Deep.InnerClass3 object = new Deep().new InnerClass3(); // valid
    }
} 

```````

public class Test {
        public static void main(String args[]) {
            Deep deep = new Deep();
            Deep.StaticInner sc = new Deep.StaticInner(); // valid
            Deep.InnerClass ic = deep.new InnerClass(); // valid when in same package
            Deep.InnerClass2 ic2 = deep.new InnerClass2(); // vlaid
            // Deep.InnerClass3 ic3 = new Deep.InnerClass3(); // invalid because InnerClass3 is private

            Deep.InnerClass4 ic4 = deep.new InnerClass4(); // valid
        }
    }

它们变得无效,因为您没有正确访问它

请使用正确的签名访问内部类

编辑 如果你真的想使用 private Inner Class 你可以通过反射来做,但不推荐它。