为什么在 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 之外根本无法访问,为什么说明符 (public
、private
、&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
你可以通过反射来做,但不推荐它。
考虑以下片段:
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 之外根本无法访问,为什么说明符 (public
、private
、&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
你可以通过反射来做,但不推荐它。