为什么我要在java中创建静态类的实例?

时间:2011-12-18 20:18:41

标签: java static

Java Tutorial说通过使用封闭类的名称来访问静态嵌套类,如 new EnclosingClassNameHere.StaticNestedClassNameHere()

为什么我要创建一个静态类的实例呢?有人可以解释一下吗?

3 个答案:

答案 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只是删除了这个隐式引用,这是静态和非静态内部类之间的唯一区别。