一种在Java中创建新实例的有趣方法

时间:2015-12-01 20:00:14

标签: 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. 新的MyClass(){}实际意味着什么?
  2. 为什么输出不同?

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

MyClass g = new MyClass();,这会创建Myclass

的对象

while,MyClass g = new MyClass(){};使用匿名类扩展Myclass

请阅读:https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

答案 2 :(得分:0)

新的MyClass(){}实际意味着什么?

这意味着您创建了一个新的MyClass子类,它没有任何名称。这就是为什么它被称为匿名课程。

Anonymous类引用Parent类的引用变量。在这里,g。

例如,

A类{ }

//somewhere i wrote like,
Class A = new A(){...};
Means new A(){...} is subclass of A.
for example, Class B extends A{...}, in this case Class B is sub class of A.
  

所以最终这个类是A的子类,它没有任何   名称,它被称为匿名类。

     

所以请记住,在这里您查询的是匿名[无名]。