如何从匿名内部类调用特定的父构造函数?

好的,所以我知道匿名内部类要么隐式扩展父类,要么实现接口,因此需要调用超类的构造函数。 但是,我不确定如何为匿名类创建构造函数(如果这是可能的)并且没有定义构造函数我不知道如何调用super()! 这是我的练习代码:

public class AnonymousConstructor { public static void main(String[] args) { //I'm not sure how to explicitly call one of the arg super constructors MyBob my = new MyBob() { //I would like to do something like this super("String"); or //super("String", "String"); }; } } class MyBob extends Thread { MyBob() { System.out.println("No arg constructor"); } MyBob(String a) { System.out.println("Arg constructor"); } MyBob(String a, String b) { System.out.println("2 arg constructor"); } public void run() { System.out.println("Outer"); } } 

我担心的是,如果你尝试从没有no-arg构造函数的类创建一个匿名类,那么代码将在编译时失败,因为没有办法将参数传递给superconstructor。 这是一个有效的问题,如果是这样,有没有办法解决这个问题?

您不能为匿名类定义构造函数(语言规范的一部分 ),但您可以通过简单地为new调用提供参数来控制调用哪个超级构造函数:

 MyBob my = new MyBob("foo") { // super(String) is called // you can add fields, methods, instance blocks, etc, but not constructors } 

默认情况下,每个类(没有特定的构造函数)都有一个无参数构造函数。 将插入一个空构造函数,javac将发出一个super()调用。

在你当前的例子中,你可以说

 new MyBob() { // anonymous MyBob sub-class 1, uses No arg constructor. } new MyBob("test") { // anonymous MyBob sub-class 2, uses Arg constructor. } 

要么

 new MyBob("test", "ing") { // anonymous MyBob sub-class 3, uses 2 arg constructor. } 

在Java中,无论如何都需要一个构造函数。 它可以很简单

  public AnonymousConstructor() { } 

也没有}; 在java中,根本不要放那个分号。 您也总是希望使用访问修饰符,即“公共,私有或受保护”。 现在你应该可以打电话给超级承包商了。

对于主类,它是静态的,因此不需要构造函数。 如果要在主类中创建方法,它必须是静态的。