假设我有一个具体的类Class1,我正在用它创建一个匿名类。

Object a = new Class1(){
        void someNewMethod(){
        }
      };

现在有没有办法重载这个匿名类的构造函数。如下图所示

Object a = new Class1(){
        void someNewMethod(){
        }
        public XXXXXXXX(int a){
          super();
          System.out.println(a);
        }
      };

用xxxxxxxx来命名构造函数?


当前回答

在匿名类中拥有命名重载构造函数没有任何意义,因为无论如何都无法调用它。

根据您实际要做的事情,访问类外声明的最终局部变量,或者使用Arne所示的实例初始化器,可能是最佳解决方案。

其他回答

是的,你不能在匿名类中定义构造函数,这是对的,但这并不意味着匿名类没有构造函数。迷惑…… 实际上,你不能在匿名类中定义construct,但是编译器为它生成了一个构造函数,该构造函数具有与其父构造函数相同的签名。如果父对象有多个构造函数,则匿名对象将有且只有一个构造函数

在匿名类中拥有命名重载构造函数没有任何意义,因为无论如何都无法调用它。

根据您实际要做的事情,访问类外声明的最终局部变量,或者使用Arne所示的实例初始化器,可能是最佳解决方案。

在我的例子中,一个本地类(具有自定义构造函数)作为一个匿名类工作:

Object a = getClass1(x);

public Class1 getClass1(int x) {
  class Class2 implements Class1 {
    void someNewMethod(){
    }
    public Class2(int a){
      super();
      System.out.println(a);
    }
  }
  Class1 c = new Class2(x);
  return c;
}

如果你不需要传递参数,那么初始化代码就足够了,但如果你需要从一个控制器传递参数,有一种方法可以解决大多数情况:

Boolean var= new anonymousClass(){
    private String myVar; //String for example

    @Overriden public Boolean method(int i){
          //use myVar and i
    }
    public String setVar(String var){myVar=var; return this;} //Returns self instane
}.setVar("Hello").method(3);

可以在抽象类中有一个接受初始化参数的构造函数。Java规范只指定匿名类(可选的)抽象类或接口实现的后代,不能单独拥有构造函数。

以下是绝对合法和可能的:

static abstract class Q{
    int z;
    Q(int z){ this.z=z;}
    void h(){
        Q me = new Q(1) {
        };
    }
}

如果你有可能自己编写抽象类,把这样一个构造函数放在那里,在没有更好的解决方案时使用流畅的API。您可以通过这种方式重写原始类的构造函数,创建带有带参数的构造函数的命名兄弟类,并使用该构造函数实例化匿名类。