2014-03-27 51 views
0

我可以在没有编译错误的情况下创建静态内部类的实例。这是什么意思? java如何让一个人为静态类创建对象?请帮助我。java如何让内部静态类的实例化?

public class StringMatrix { 
    static class moves{ 
     int x; 
     int y; 
     moves(int x,int y){ 
      this.x=x; 
      this.y = y; 
     } 
     static moves[] movements = {new moves(0,1),new moves(1,1),new moves(0,-1),new moves(1,0),new moves(-1,0),new moves(-1,-1),new moves(-1,1),new moves(1,-1)}; 
    } 
} 
+1

哪部分你不明白?静态,还是内部类? –

+2

肮脏的小秘密。 “静态内部”类只是一个类,在任何其他类的字节码级别上都是难以区分的。这只是一个编译器调试(并命名为“OuterClassName $ InnerClassName”),它使它特殊并限制对它的访问。 –

回答

1

Java是允许创建静态内部类。

静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。实际上,为了方便打包,静态嵌套类在行为上是嵌套在另一个顶级类中的顶级类。

您可以访问静态嵌套类使用封闭的类名访问: 像

StringMatrix.moves 

我们为什么需要静态嵌套类?

静态嵌套类是不是真的需要。然而,你可以说,如果两个类只能一起使用 - 比如A类使用助手类B,而B从不独立使用 - 那么静态嵌套类就是要走的路。换句话说,通过让B仅仅是一个普通的老班级,那个绊倒它的程序员可能会尝试使用它。如果B是一个静态嵌套类,那么它就更加清楚它具有与A有关的特殊用法。

2

这些不叫做内部类,而是“静态嵌套类”。它们在外部类中声明为静态,这意味着它们可以在没有实例化外部类的情况下存在。它们实际上只是在另一个类中定义的普通类,以便使代码更易于阅读和更好地分组。

欲了解更多信息,请参阅Java's documentation

1

当内部类是static时,它与顶级类的差别非常小:它使用外部类类的方式类似于名称空间,并且可以访问其外部类的其他静态成员,而无需指定类的名称。在所有其他方面,它与顶级类相同:特别是,它可以从静态上下文中实例化,也就是您在代码示例中执行的方式。

非静态内部类为其外部类的实例添加隐式引用。这是什么改变了实例化的规则 - 现在你需要一个外部类的实例来实例化一个内部类。

0

这实际上只是一种将两个相关类一起定义在一个文件中的方法。要实例化你的动作班,你应该这样做:

int x=1; 
int y=1; 
moves m = new StringMatrix.moves(x,y);