请考虑以下代码段:
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
之外访问(这是我的理解)。我见过程序员在嵌套内部类之前指定说明符。重点是什么?如果(非静态)内部类在封闭类之外根本不可访问,为什么给出了说明符(public
,private
和& protected
)?为什么Java甚至支持内部类的访问说明符?
答案 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
,可以通过反思来实现,但不建议使用。