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

匿名内部类的构造器重载问题
在think in Java 4th 的10.6节末尾提到“所以对于匿名类而言,实例初始化的实际效果就是构造器。当然它受到了限制--你不能重载实例初始化方法,所以你仅有一个这样的构造器。”但是我自己根据书中的例子重新写了一个具备重载功能的构建器,在jdk1.6下运行正确,想请问各位大侠这是何解,另外为何我将Destination d重新指向用重载的构建器生成的另一个内部类对象,编译器报错,谢谢赐教!
interface Destination {
  String readLabel();
}

public class Parcel10{
  public Destination
  destination(final String dest){
  return new Destination(){
  private String label = dest;
  public String readLabel(){ return label;}
  {System.out.println("aaa");}
  };
  }
  public Destination
  destination(final String dest,final float price){
  return new Destination(){
  private int cost;
  {
  cost = Math.round(price);
  if (cost > 100)
  System.out.println("Over budget!");
  }
  private String label = dest;
  public String readLabel(){ return label;}
  };
  }
  public static void main(String[] args) {
  Parcel10 p = new Parcel10();

  Destination d = p.destination("Tasmania");
  //编译器提示:已在main(java.lang.String[])中定义d
  //Destination d = p.destination("Tasmania",101.395F);
  Destination t = p.destination("Tasmania",101.395F);

 }
}



------解决方案--------------------
我的理解是你想先根据第一个构造函数实例化一个,然后将指向第一个的引用指向利用第二个构造函数实例化的对象。
Destination d = p.destination("Tasmania",101.395F);
改为d = p.destination("Tasmania",101.395F);
你的方法是生成一个同名的引用d,并不是重新指向,所以系统报错
------解决方案--------------------
/**
*方法1,返回Destination 的一个对象
*/
public Destination destination(final String dest){
return new Destination(){
private String label = dest;
public String readLabel(){ 
return label;
}

{
System.out.println("aaa");
}
};
}

/**
*方法2,返回Destination 的一个对象,与方法1属于方法重载关系
*/
public Destination destination(final String dest,final float price){
return new Destination(){
private int cost;
{
cost = Math.round(price);
if (cost > 100)
System.out.println("Over budget!");
}
对,这两个方法中的方法实现都是使用了匿名内部类,但是它是使用了匿名内部类来创建对象,然后返回,然后您在main方法中Destination d;同时定义了两个相同的应用变量d,你感觉这能对吗?这符合Java语言规范吗?这跟p所调用的方法中的匿名内部类有啥关系?我不知道您读的think in Java 4th是什么教材,但我可以肯定的告诉您,这个匿名内部类,通俗的讲就是没有类名字的内部类,它通常被用来一次性的创建对象的,其它的没有什么注意点。