2015-12-01 116 views
1
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 
    }  
} 

创建新实例可有人请向我解释:一种有趣的方式在Java中

  1. 什么新MyClass的(){}实际上意味着什么呢?
  2. 为什么不同的输出?
+6

这是一个匿名类。 – SLaks

回答

5

当您在new MyClass()通话后放入括号,这是一个继承了明确的类匿名类的语法。 {}是一个空的类体,所以没有任何重写,也没有声明构造函数。

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

+0

我在这里有点困惑。如果g是MyClass的子类(这就是为什么它能够覆盖MyClass中的任何方法),为什么g.getClass.getName()不返回MyClass? – xcoder

+0

变量'g'是指匿名类的一个实例,它是对象的运行时类型。 (第二个'g';你重新声明'g'。)'getClass'方法返回对应于被调用对象的运行时类型的'Class'对象。 – rgettman

0

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

这意味着你已经创建了一个新的子类的MyClass不具有任何名称。这就是为什么它被称为匿名类。

这匿名类的父类的引用变量参考。这里,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. 

所以,最后的类,这是一个不具有任何 的名字,这就是所谓的匿名类的子类。

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