JVM
是否会调用Constructor
的默认Anonymous Class
来创建实例。
我的理解可能是愚蠢的。我认为,即使使用Reflection API
创建实例,也至少会有Default Constructor
。 Anonymous Class
有一个Default Constructor
?否则,JVM
或其他什么创建实例?
答案 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)
在任何情况下,都会调用构造函数来初始化新创建的对象。匿名类具有默认构造函数,它初始化类的字段(如果有),并调用超类的构造函数。