明确指出接口没有构造函数。但是,当使用匿名内部类时,我们将创建一个接口对象并对其进行重写。如果接口中没有构造函数,那怎么可能。 例如,
interface A{
void print();
}
class B{
public static void main(String args[]){
A a=new A(){
void print(){
System.out.println("Message");
}
};
}
}
如果接口没有构造函数,那么A a = new A()怎么可能?
答案 0 :(得分:2)
代码
interface A {
void print();
}
class B {
public static void main(String[] args) {
A a = new A() {
public void print() {
System.out.println("Message");
}
};
}
}
是
的简写interface A {
void print();
}
class B {
public static void main(String[] args) {
class B$1 extends java.lang.Object implements A {
B$1() {
super();
}
public void print() {
System.out.println("Message");
}
}
A a = new B$1();
}
}
只有一个例外:如果显式声明了类B$1
,则可以使用class C extends B$1
从其扩展。但是,即使不是B$1
(JLS§8.1.1.2),也无法从匿名类final
扩展(JLS§8.1.4)。
也就是说,匿名类仍然是类。与所有类一样(java.lang.Object
本身除外),即使这些类也直接或间接扩展了java.lang.Object
。如果使用接口指定了匿名类,则它将扩展java.lang.Object
并实现该接口。如果使用类指定了匿名类,则它将扩展该类。如果构造函数有参数,则将参数转发给super()
。
如果愿意,您甚至可以(尽管绝对不建议使用)稍后在A a2 = new B$1();
中插入main()
。但实际上,不要那样做,我只是提到它是为了说明幕后情况。
您可以通过将源代码放在单独的目录中(例如,放入AB.java
,进行编译,然后
javap -c B$1
查看javac
如何生成匿名类。答案 1 :(得分:0)
每个类都有一个默认构造函数,如果您没有定义其他构造函数,则该默认构造函数为无参数构造函数。除非您定义其他构造函数,否则匿名类实现接口将自动生成该接口。