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

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

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

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

用xxxxxxxx来命名构造函数?


当前回答

Java语言规范,第15.9.5.1节:

匿名类不能具有 显式声明的构造函数。

不好意思:(

编辑:作为一种替代方法,您可以创建一些最终局部变量,和/或在匿名类中包含实例初始化式。例如:

public class Test {
    public static void main(String[] args) throws Exception {
        final int fakeConstructorArg = 10;

        Object a = new Object() {
            {
                System.out.println("arg = " + fakeConstructorArg);
            }
        };
    }
}

虽然很难看,但也许能帮到你。或者,使用合适的嵌套类:)

其他回答

Peter Norvig的《Java IAQ:不常回答的问题》

http://norvig.com/java-iaq.html#constructors -匿名类构造函数

http://norvig.com/java-iaq.html#init -构造函数和初始化

加起来,你可以构造这样的东西。

public class ResultsBuilder {
    Set<Result> errors;
    Set<Result> warnings;

...

    public Results<E> build() {
        return new Results<E>() {
            private Result[] errorsView;
            private Result[] warningsView;
            {
                errorsView = ResultsBuilder.this.getErrors();
                warningsView = ResultsBuilder.this.getWarnings();
            }

            public Result[] getErrors() {
                return errorsView;
            }

            public Result[] getWarnings() {
                return warningsView;
            }
        };
    }

    public Result[] getErrors() {
        return !isEmpty(this.errors) ? errors.toArray(new Result[0]) : null;
    }

    public Result[] getWarnings() {
        return !isEmpty(this.warnings) ? warnings.toArray(new Result[0]) : null;
    }
}

Java语言规范,第15.9.5.1节:

匿名类不能具有 显式声明的构造函数。

不好意思:(

编辑:作为一种替代方法,您可以创建一些最终局部变量,和/或在匿名类中包含实例初始化式。例如:

public class Test {
    public static void main(String[] args) throws Exception {
        final int fakeConstructorArg = 10;

        Object a = new Object() {
            {
                System.out.println("arg = " + fakeConstructorArg);
            }
        };
    }
}

虽然很难看,但也许能帮到你。或者,使用合适的嵌套类:)

这是不可能的,但是你可以像这样添加一个匿名初始化器:

final int anInt = ...;
Object a = new Class1()
{
  {
    System.out.println(anInt);
  }

  void someNewMethod() {
  }
};

不要忘记对匿名类使用的局部变量或参数的声明使用final,就像我对anInt所做的那样。

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

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

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