由于读的英文版的thinking in java所以导致有些地方读的不是很懂,有些误解 
希望高手帮我解开困惑  谢谢!!问一下
abstract class Base {
  public Base(int i) {
    System.out.println("Base constructor, i = " + i);
  }
  public abstract void f();
}public class AnonymousConstructor {
  private static Test monitor = new Test();
  public static Base getBase(int i) {
    return new Base(i) {
      {//这个括号内是不是它的构造函数,里面的super.Base();加与不加一样,首先都要调用基类的构造函数?匿名类的构造函数只能有一个?
        System.out.println("Inside instance initializer");
      }
      public void f() {
        System.out.println("In anonymous f()");
      }
    };
  }
  public static void main(String[] args) {
    Base base = getBase(47);
    base.f();
    monitor.expect(new String[] {
      "Base constructor, i = 47",
      "Inside instance initializer",
      "In anonymous f()"
    });
  }
}  
谢谢大家了!

解决方案 »

  1.   

    测试了一下
    匿名没有构造方法,
    你注释的部分,应该是属于非静态的初始块
    你可以写多个{}测试代码
    {
        System.out.println("Inside instance initializer");
    }
    {
        System.out.println("Inside instance initializer2");}
      

  2.   

    abstract class Base {
      public Base(int i) {
        System.out.println("Base constructor, i = " + i);
      }
      public abstract void f();
    }/*这上面是个抽象类有自己的构造函数。还有一个抽象的方法。*/public class AnonymousConstructor {
      private static Test monitor = new Test();
    /*这是个方法。返回类型是上面的抽象类直接在类里面return一个类*/
      public static Base getBase(int i) {
        return new Base(i) {
    /*如果在这里面有super.Base();的话就是调用了抽象类的构造函数。就有点像继承的关系。只要你在里面有生成了一个实例对象的话就会自动掉用抽象类的构造函数。不管是什么类。只要你有生成了该类的实例就会调用构造函数。不管是匿名还是不匿名的构造函数只能在类里面有重载的出现。*/
            System.out.println("Inside instance initializer");
          }
          public void f() {
            System.out.println("In anonymous f()");
          }
        };
      }
      public static void main(String[] args) {
        Base base = getBase(47);
        base.f();
        monitor.expect(new String[] {
          "Base constructor, i = 47",
          "Inside instance initializer",
          "In anonymous f()"
        });
      }
    }