java - 在 Java 中创建新实例的一种有趣方式

标签 java constructor

class MyClass {

}

public class Test { 
    public static void main(String[] args) {
        MyClass g = new MyClass();
        System.out.println(g.getClass()); //print MyClass

        MyClass g2 = new MyClass(){};
        System.out.println(g2.getClass()); //print Test$1
    }       
}

谁能给我解释一下:

  1. new MyClass(){} 到底是什么意思?
  2. 为什么输出不同?

最佳答案

当您在 new MyClass() 调用之后放置大括号时,这是对显式类进行子类化的匿名类的语法。 {} 是一个空类主体,因此没有任何内容被覆盖,也没有声明构造函数。

输出 Test$1 是不同的,因为匿名子类确实有一个隐式名称,它是封闭类 (Test),然后是美元符号 $ ,然后是序列号 (1)。在编译Test.java时,你可能会注意到除了Test.classMyClass.class之外,还有Test1.class也存在——匿名类的类文件。如果您要在 Test 类中声明另一个匿名子类,在您的第一个匿名子类之后,那么它将被命名为 Test$2,无论它实际上是哪个类的子类。

关于java - 在 Java 中创建新实例的一种有趣方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34029058/

相关文章:

java - 列名中的正斜杠引发语法错误 "/"

c++ - clang 和 gcc 中的这个警告似乎不正确

c++ - 禁止在友元函数中调用私有(private)构造函数

java - 按钮在扩展 JButton 时不执行任何操作,但它通过返回 JButton 的方法来执行此操作

android - 单例构造函数使我的应用程序崩溃

java - Proguard:如何防止在 Android 中重命名 Packagename?

java - java 的字符串中断

c - 在 C 中实现构造函数的正确方法

Java Stream -> 从另一个不同结构的列表创建列表

从 .jar 文件加载 Java 图像