繁体   English   中英

为什么在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
    }
}

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

您可以像这样实例化公共非静态内部类:

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是私有的,则不可能做到这一点。 因此,这并不是完全没有意义的,您可能会遇到一些需要在外部类外部实例化并且不关心外部类引用的情况。

 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 ,则可以通过反射来实现,但不建议这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM