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

2022-09-01 14:16:37

好的,所以我知道一个匿名的内部类要么隐式扩展父类,要么实现一个接口,因此需要调用超类的构造函数。但是,我不确定如何为匿名类创建构造函数(如果可能的话),并且在不定义构造函数的情况下,我不确定如何调用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");
    }
}

我担心的是,如果您尝试从没有无参数构造函数的类创建一个匿名类,则代码将在编译时失败,因为无法将参数传递给超构造函数。这是否是一个合理的担忧,如果是这样,有没有办法解决这个问题?


答案 1

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

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

答案 2

默认情况下,每个类(没有特定的构造函数)都有一个 no-arg 构造函数。将插入一个空构造函数,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.
}