有个问题想不明白,请高手赐教~~
我这里提一个关于匿名类的问题,主要涉及匿名类的初始化顺序。
代码1:
- Java code
public interface Contents { int value();}public class Parcel7b { //这是一段普通代码 class MyContents implements Contents { private int i = 11; public int value() { return i; } } public Contents contents() { return new MyContents(); } public static void main(String[] args) { Parcel7b p = new Parcel7b(); Contents c = p.contents(); }} 代码2:
- Java code
public class Parcel7 { //这是上段普通代码的匿名类形式 public Contents contents() { return new Contents() { private int i = 11; public int value() { return i; } }; } public static void main(String[] args) { Parcel7 p = new Parcel7(); Contents c = p.contents(); }}代码3:
- Java code
public class Wrapping { private int i; public Wrapping(int x) { i = x; } public int value() { return i; }}public class Parcel8 { //这是基类带构造器的匿名类形式 public Wrapping wrapping(int x) { return new Wrapping(x) { public int value() { return super.value() * 47; } }; } public static void main(String[] args) { Parcel8 p = new Parcel8(); Wrapping w = p.wrapping(10); System.out.println(w + " "); }}代码1和代码2完全用于演示,问题是代码3。按照代码1、2的演示,知道匿名类是先定义类,然后再生成对象向上转型的,但是代码3中的匿名类中并没有构造函数,如果这个匿名类继承了Wrapping类及它带参数的构造函数,但是自己却没有构造函数来调用基类的构造函数,为什么创建对象时不会编译错误。这个值究竟是通过什么样的过程来传到基类里的?
[解决办法]
return new Wrapping(x) {
public int value() {
return super.value() * 47;
}
};
这里Wrapping(x)就是调用了父类的构造方法.
[解决办法]
一般情况下匿名内部类都不使用带参数的构造方法,如果确实需要,调用的其实就是父类的构造方法.按照构造方法的要求,该方法的名字必须类名相同,既然类都是匿名的,那怎么写构造方法呢?
[解决办法]
2楼正确,匿名内部类比较特殊,有些东西不能当常规类去理解,常规的类构造方法是不能从超类继承下来的,匿名内部类编译器作了些特殊处理,所以如2楼所说 Wrapping(x) 就是调用了父类的构造方法。