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

java如何允许内部静态类的实例化?,java,inner-classes,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[] mov

我能够在没有编译错误的情况下创建静态内部类的实例。这是什么意思?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)};
    }
}

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


有关详细信息,请参见

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


有关更多信息,请参见允许Java创建静态内部类

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

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

为什么需要静态嵌套类?


实际上并不需要静态嵌套类。但是,您可以提出这样的论点:如果两个类只一起使用——比如类A使用辅助类B,而B从来没有单独使用过——那么静态嵌套类就是最好的选择。换句话说,通过使B只是一个普通的旧类,偶然发现它的程序员可能会尝试使用它。如果B是一个静态嵌套类,那么更清楚的是,它有一个与a相关的特殊用途。

Java允许创建静态内部类

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

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

为什么需要静态嵌套类?


实际上并不需要静态嵌套类。但是,您可以提出这样的论点:如果两个类只一起使用——比如类A使用辅助类B,而B从来没有单独使用过——那么静态嵌套类就是最好的选择。换句话说,通过使B只是一个普通的旧类,偶然发现它的程序员可能会尝试使用它。如果B是一个静态嵌套类,那么更清楚的是,它有一个与a相关的特殊用途。

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


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

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


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

这实际上只是一种在一个文件中同时定义两个相关类的方法。要实例化moves类,您需要执行以下操作:

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

这实际上只是一种在一个文件中同时定义两个相关类的方法。要实例化moves类,您需要执行以下操作:

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

你不明白哪一部分?静态,还是内部类?肮脏的小秘密。“静态内部”类只是一个类,在字节码级别无法与任何其他类区分。它只是一个编译器swizzle(并将其命名为“OuterCassName$InnerClassName”),这使得它非常特殊,并限制了对它的访问。您不了解哪一部分?静态,还是内部类?肮脏的小秘密。“静态内部”类只是一个类,在字节码级别无法与任何其他类区分。它只是一个编译器swizzle(并将其命名为“OuterClassName$InnerClassName”),使其具有特殊性并限制对其的访问。