2011-12-18 64 views

回答

6

"static"在这种情况下可能会产生误导。它的真正含义是该类可以独立存在。没有包含类的实例,非静态内部类不能存在。

IMO,当你开始在它所在的类之外使用一个内部类时,你需要考虑移动它并使它成为它自己的顶级类。几乎没有什么情况下,类之间的关系紧密结合,以至于需要将它作为内部类。

在你的代码示例:

OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass(); 

你正在创建StaticNestedClass的独立实例。

如果它不是静态的,你不能这样做。您只能从OuterClass的实例创建StaticNestedClass()的实例。

如果你把它搬到自己的java文件,你可以把它几乎相同:

StaticNestedClass notNestedAnymore = new StaticNestedClass(); 

至于你真正的问题:你为什么要创建它的一个实例?出于同样的原因,你创建任何类的实例 - 它会做一些你需要的工作。

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作为封闭实例。

+0

我明白这个部分。我的意思是我无法弄清楚为什么他们在他们的例子中创建一个** static **类的**实例**,它通常不需要C#中的实例:ClassName.memberName – 2011-12-18 20:24:58

+0

@ user1104888因为你'在这种情况下重新误解词“静态”的本质。您正在考虑静态类变量 - 除了这里,类本身是静态的,这与创建类的实例是正交的。 – 2011-12-18 20:28:38

+0

@ user1104888:我更新了我的答案以解决您的问题。 – 2011-12-18 20:33:12

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 
     } 

    } 
} 

声明一个内部类的静态只是删除这个隐式引用,这是静态和非静态内部类之间的唯一区别。

相关问题