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

时间:2016-08-04 03:59:03

标签: java inner-classes access-specifier

请考虑以下代码段:

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内部的静态类之外,所有其他嵌套类都需要访问封闭类Deep。换句话说,他们无法在Deep之外访问(这是我的理解)。我见过程序员在嵌套内部类之前指定说明符。重点是什么?如果(非静态)内部类在封闭类之外根本不可访问,为什么给出了说明符(publicprivate和& protected)?为什么Java甚至支持内部类的访问说明符?

2 个答案:

答案 0 :(得分:2)

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

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是私有的,你就无法做到。所以它并非完全没有意义,你可能有一些场景,你想要在外部类之外进行实例化,而不关心外部类引用。

答案 1 :(得分:1)

 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,可以通过反思来实现,但不建议使用。