在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); }
}

解决方案 »

  1.   

    我的理解是你想先根据第一个构造函数实例化一个,然后将指向第一个的引用指向利用第二个构造函数实例化的对象。
    Destination d = p.destination("Tasmania",101.395F);
    改为d = p.destination("Tasmania",101.395F);
    你的方法是生成一个同名的引用d,并不是重新指向,所以系统报错
      

  2.   

    /**
    *方法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是什么教材,但我可以肯定的告诉您,这个匿名内部类,通俗的讲就是没有类名字的内部类,它通常被用来一次性的创建对象的,其它的没有什么注意点。
      

  3.   

      {
            cost = Math.round(price);
            if (cost > 100)
               System.out.println("Over budget!");
          }
    请问此块是什么块?是匿名块吗?还是new Destination()匿名内部类的“匿名构造器”?