2

是否JVM调用默认值ConstructorAnonymous Class创建实例。

我的理解可能是愚蠢的。我想,即使Reflection API是用来创建实例,至少也会有Default Constructor. Anonymous ClassDefault Constructor吗?否则,如何JVM或以任何方式创建实例?

4

4 回答 4

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();

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

于 2012-10-18T11:31:50.423 回答
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);
}
于 2013-05-03T17:48:17.743 回答
0

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

于 2012-10-18T11:28:53.103 回答
0

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

于 2012-10-18T11:29:09.633 回答