访问匿名类的构造函数

比方说,我有一个具体的类Class1,我正在创build一个匿名类。

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节:

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

对不起:(

编辑:作为一种替代方法,您可以创build一些最终的本地variables,和/或在匿名类中包含一个实例初始值设定项。 例如:

 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() { } }; 

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

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

 public class Test{ public static final void main(String...args){ Thread t = 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(); } } 

我知道这个post太旧了,不能发表一个答案。 但是,我认为这是值得的。

虽然你不能有一个明确的构造函数,但如果你的意图是调用超类的构造函数,那么以下就是你所要做的。

 StoredProcedure sp = new StoredProcedure(datasource, spName) { {// init code if there are any} }; 

这是通过传递一个DataSource和一个String对象在Spring中创build一个StoredProcedure对象的例子。

所以底线是,如果你想创build一个匿名类,并且想要调用超级类的构造函数,那么创build一个匿名类,并使用与超类构造函数相匹配的签名

您可以在接受init参数的抽象类中拥有构造函数。 Java规范只规定了作为(可选的)抽象类或接口实现的后代的匿名类不能由她自己拥有一个构造函数。

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

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

如果你有自己编写抽象类的可能性,那么把这样的构造函数放在那里,并且在没有更好的解决scheme的地方使用stream利的API。 你可以用这种方法覆盖你的原始类的构造函数,用带参数的构造函数创build一个命名的兄弟类,并使用它来实例化你的匿名类。

是的,你不能在匿名类中定义结构,但这并不意味着匿名类没有构造函数。 Confuse …其实你不能在一个匿名类中定义结构,但是编译器为它生成一个构造函数,它和它所调用的父构造函数具有相同的签名。 如果父项有多个构造函数,则匿名函数将只有一个构造函数

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

 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); 

在匿名类中有一个命名为重载的构造函数没有任何意义,因为无论如何都不可能调用它。

取决于你实际尝试做什么,只需访问在类之外声明的最终局部variables,或者使用Arne所示的实例初始化程序,可能是最好的解决scheme。

就我而言,本地类(具有自定义构造函数)作为匿名类工作:

 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; } 

彼得Norvig的Java的IAQ:不常见的问题

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

http://norvig.com/java-iaq.html#init – build立者和初始化

总结一下,你可以构build这样的东西

 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; } }