访问匿名类的构造函数

Sar*_*n M 212 java constructor overloading anonymous-types

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

Object a = new Class1(){
        void someNewMethod(){
        }
      };
Run Code Online (Sandbox Code Playgroud)

现在有什么方法可以重载这个匿名类的构造函数.如下图所示

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

用xxxxxxxx命名构造函数?

Jon*_*eet 272

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);
            }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

这很糟糕,但它可能只对你有所帮助.或者,使用适当的嵌套类:)

  • OMG,有人指责THE Jon Skeet复制吗? (23认同)
  • 阿恩,我相信他没有复制它.他知道足够的java足够公平,当他想复制它时我会给予信任. (18认同)

Arn*_*ter 96

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

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

  void someNewMethod() {
  }
};
Run Code Online (Sandbox Code Playgroud)

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


Joe*_*tov 72

这是解决问题的另一种方法:

public class Test{

    public static final void main(String...args){

        new Thread(){

            private String message = null;

            Thread initialise(String message){

                this.message = message;
                return this;
            }

            public void run(){
                System.out.println(message);
            }
        }.initialise(args[0]).start();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的解决方案,但是在这里使用Thread会让它在一开始有点误导(有一段时间我认为你创建了一个单独的线程来初始化东西!) (20认同)
  • 请注意,在定义`t`之后,除非在类/接口类型中定义了此函数,否则不能调用`t.initialise()`. (7认同)

Thi*_*thi 13

我知道这个帖子太旧了,无法发布答案.但我仍然认为这是值得的.

虽然你不能有一个显式的构造函数,但如果你打算调用超类的构造函数,那么你需要做的就是以下内容.

StoredProcedure sp = new StoredProcedure(datasource, spName) {
    {// init code if there are any}
};
Run Code Online (Sandbox Code Playgroud)

这是StoredProcedure通过传递a DataSource和对象在Spring 中创建对象的示例String.

所以底线是,如果你想创建一个匿名类并想要调用超类构造函数,那么创建一个带有与超类构造函数匹配的签名的匿名类.