是否JVM
调用默认值Constructor
来Anonymous Class
创建实例。
我的理解可能是愚蠢的。我想,即使Reflection API
是用来创建实例,至少也会有Default Constructor
. Anonymous Class
有Default Constructor
吗?否则,如何JVM
或以任何方式创建实例?
是否JVM
调用默认值Constructor
来Anonymous Class
创建实例。
我的理解可能是愚蠢的。我想,即使Reflection API
是用来创建实例,至少也会有Default Constructor
. Anonymous Class
有Default Constructor
吗?否则,如何JVM
或以任何方式创建实例?
是的,它确实。您甚至可以通过指定参数来使用其他构造函数:
给定
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();
当一个类没有显式构造函数时,它有一个隐式的默认空构造函数。就像调用任何其他构造函数一样,它被调用。
在我看来,与普通类不同,匿名类具有与隐式构造函数相关的不同行为。
当您定义一个普通类时,编译器只能隐式插入一个无参数构造函数。但是使用匿名类,您可以(通过编译器隐式)获取超类拥有的所有构造函数。
假设我们有一个类:
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);
}
匿名类有一个默认的无参数构造函数,由 JVM 调用一次。由于匿名类没有名称,因此无法为匿名类定义构造函数。如果您的类需要构造函数,则必须改用本地类。
在任何情况下,都会调用构造函数来初始化新创建的对象。匿名类有默认构造函数,它初始化类的字段,如果有的话,并调用超类的构造函数。