Java教程说,静态内部类是通过使用封闭类的名称,如新EnclosingClassNameHere.StaticNestedClassNameHere()访问为什么我要在java中创建一个静态类的实例?
我为什么要在所有创建静态类的实例?有人可以解释一下吗?
Java教程说,静态内部类是通过使用封闭类的名称,如新EnclosingClassNameHere.StaticNestedClassNameHere()访问为什么我要在java中创建一个静态类的实例?
我为什么要在所有创建静态类的实例?有人可以解释一下吗?
"static"
在这种情况下可能会产生误导。它的真正含义是该类可以独立存在。没有包含类的实例,非静态内部类不能存在。
IMO,当你开始在它所在的类之外使用一个内部类时,你需要考虑移动它并使它成为它自己的顶级类。几乎没有什么情况下,类之间的关系紧密结合,以至于需要将它作为内部类。
在你的代码示例:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
你正在创建StaticNestedClass的独立实例。
如果它不是静态的,你不能这样做。您只能从OuterClass
的实例创建StaticNestedClass()
的实例。
如果你把它搬到自己的java文件,你可以把它几乎相同:
StaticNestedClass notNestedAnymore = new StaticNestedClass();
至于你真正的问题:你为什么要创建它的一个实例?出于同样的原因,你创建任何类的实例 - 它会做一些你需要的工作。
这段代码没有任何混淆。静态嵌套类只是一种引入另一个名称空间的方法。
通过创建一个静态嵌套类,你表达了外层和内层类之间非常强大的关系。通常,嵌套类是助手或外部类的一部分。例如,当您创建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
作为封闭实例。
在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 **类的**实例**,它通常不需要C#中的实例:ClassName.memberName – 2011-12-18 20:24:58
@ user1104888因为你'在这种情况下重新误解词“静态”的本质。您正在考虑静态类变量 - 除了这里,类本身是静态的,这与创建类的实例是正交的。 – 2011-12-18 20:28:38
@ user1104888:我更新了我的答案以解决您的问题。 – 2011-12-18 20:33:12