java如何允许内部静态类的实例化?

时间:2014-03-27 03:02:50

标签: java inner-classes

我能够创建静态内部类的实例而不会出现编译错误。这是什么意思? 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)};
    }
}

4 个答案:

答案 0 :(得分:2)

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

有关详细信息,请参阅Java's documentation

答案 1 :(得分:1)

Java允许创建静态内部类。

  

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

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

StringMatrix.moves

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

不需要静态嵌套类。但是,您可以提出这样的论点:如果两个类仅一起使用 - 例如A类使用辅助类B,而B从不单独使用 - 那么静态嵌套类就是可行的方法。换句话说,通过使B只是一个普通的老类,偶然发现它的程序员可能会尝试使用它。如果B是静态嵌套类,则更明确的是它具有与A相关的特殊用途。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

这只是一种在一个文件中一起定义两个相关类的方法。要实例化你的移动类,你可以这样做:

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