首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

有个有关问题想不明白,请高手赐教~

2012-03-24 
有个问题想不明白,请高手赐教~~我这里提一个关于匿名类的问题,主要涉及匿名类的初始化顺序。代码1:Java cod

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

热点排行