Java Tutorial说通过使用封闭类的名称来访问静态嵌套类,如 new EnclosingClassNameHere.StaticNestedClassNameHere()
为什么我要创建一个静态类的实例呢?有人可以解释一下吗?
答案 0 :(得分:6)
"static"
可能会产生误导。它真正意味着该课程可以独立存在。如果没有封闭类的实例,则不能存在非静态内部类。
IMO,当你开始使用它所在类之外的内部类时,你需要考虑移动它并使它成为自己的顶级类。极少数情况下,类之间的关系紧密耦合,您需要将它保持为内部类。
在您的代码示例中:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
您正在创建一个StaticNestedClass的独立实例。
如果它不是静态的,你就不能这样做。您只能从StaticNestedClass()
的实例创建OuterClass
的实例。
如果您将其移动到自己的.java文件中,您可以几乎完全相同:
StaticNestedClass notNestedAnymore = new StaticNestedClass();
至于你真正的问题:你为什么要创建它的实例?出于同样的原因,您创建了任何类的实例 - 它可以完成您需要的一些工作。
答案 1 :(得分:5)
此代码没有任何混淆。静态嵌套类只是引入另一个命名空间的一种方式。
通过创建静态嵌套类,您可以表达外部类和内部类之间非常强的关系。通常,嵌套类是辅助对象或外部类的一部分。例如,当您创建Tree
类时,Node
类是嵌套静态类的良好候选者。 Tree.Node
清楚地解释了Node
类的目的。
事实上,static
关键字的使用与static
字段一致。在这两种情况下,您都可以访问static
实体,而无需封闭类的实例。当谈到static
类时,它基本上意味着:“我可以创建这个静态嵌套类的实例而不需要外部类的实例”。默认情况下(不使用static
关键字时)嵌套类变为内部类。在这种情况下,你不能简单地写:
new OuterClass.StaticNestedClass();
相反,您需要使用一些模糊的语法传递OuterClass
实例:
OuterClass outerClassInstance = new OuterClass();
outerClassInstance.new InnerClass();
幸运的是,当new InnerClass()
在 OuterClass
正文中执行时,this
被隐含地用作封闭实例。
答案 2 :(得分:1)
在java内部类中有一个对外部类的实例的隐式引用。这样您就可以直接访问外部类的成员,这在用于回调的匿名类中很有用。
class A{
private int a = 3;
class Inner{
Inner(){
System.out.println(a);//also A.this.a
}
}
static class StaticInner{
StaticInner(){
System.out.println(a);//FAILS
}
}
}
声明一个内部类static只是删除了这个隐式引用,这是静态和非静态内部类之间的唯一区别。