日期:2014-05-20  浏览次数:20562 次

有个问题想不明白,请高手赐教~~
我这里提一个关于匿名类的问题,主要涉及匿名类的初始化顺序。
代码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) 就是调用了父类的构造方法。