JVM是否调用匿名类的默认构造函数来创建实例?

时间:2012-10-18 11:20:56

标签: java

JVM是否会调用Constructor的默认Anonymous Class来创建实例。

我的理解可能是愚蠢的。我认为,即使使用Reflection API创建实例,也至少会有Default ConstructorAnonymous Class有一个Default Constructor?否则,JVM或其他什么创建实例?

4 个答案:

答案 0 :(得分:4)

是的。您甚至可以通过指定参数来使用其他构造函数:

鉴于

public abstract class A {
   String str;
   public A(String str){
       this.str=str;
   }
   public abstract void doSomething();
}

你可以做到

...


A a = new A("Hello World") {
   public void doSomething() {
       System.out.println(str);
   }
};
a.doSomething();

当一个类没有显式构造函数时,它有一个隐式的默认空构造函数。这就是调用,就像调用任何其他构造函数一样。

答案 1 :(得分:1)

在我看来,与普通类不同,匿名类具有与隐式构造函数关联的不同行为。

定义普通类时,编译器可以隐式插入一个无参数构造函数。 但是使用匿名类,您可以(隐式地通过编译器)获得超类所具有的所有构造函数。

假设我们有一个班级:

class A {
    A(int i) {}
    A(String s) {}
}

如果我们将其子类化如下......

class B extends A {}

...我们收到编译错误,因为编译器试图这样做:

class B extends A {
    B() {
        super();        // Error: there's no no-arg superclass constructor!
    }
}

但是当我们创建一个匿名类时,它会隐式创建为超类定义的构造函数(A)

A a1 = new A(1) {};     // OK. Uses (int) constructor
A a2 = new A("") {};    // OK. Uses (String) constructor
A a3 = new A() {};      // Error. There's no no-arg constructor

好像我们的匿名类有这些构造函数

X(int i) {
    super(i);
}

X(String s) {
    super(s);
}

答案 2 :(得分:0)

匿名类有一个默认的no args构造函数,由JVM调用一次。由于匿名类没有名称,因此无法为匿名类定义构造函数。如果您的类需要构造函数,则必须使用本地类。

答案 3 :(得分:0)

在任何情况下,都会调用构造函数来初始化新创建的对象。匿名类具有默认构造函数,它初始化类的字段(如果有),并调用超类的构造函数。