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

高手指点一下
由于读的英文版的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() "
        });
    }
}    


谢谢大家了!

------解决方案--------------------
匿名内部类连名字都没有 那来的构造函数啊?
------解决方案--------------------
测试了一下
匿名没有构造方法,
你注释的部分,应该是属于非静态的初始块
你可以写多个{}

测试代码
{
System.out.println( "Inside instance initializer ");
}
{
System.out.println( "Inside instance initializer2 ");

}
------解决方案--------------------
好像匿名类的执行顺讯和普通类有些区别
测试结果显示是先调用匿名类的父类的构造方法
然后才执行匿名类的非静态初始化块的

------解决方案--------------------
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[] {