好的,我知道匿名内部类要么隐式扩展父类,要么实现接口,因此需要调用超类的构造函数。但是,我不确定如何为匿名类创建构造函数(如果这是可能的)并且没有定义构造函数我不知道如何调用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。这是一个有效的问题,如果是这样,有没有办法解决这个问题?
答案 0 :(得分:30)
您无法为匿名类(语言规范的part)定义构造函数,但您可以通过简单地为new
调用提供参数来控制调用哪个超级构造函数:
MyBob my = new MyBob("foo") { // super(String) is called
// you can add fields, methods, instance blocks, etc, but not constructors
}
答案 1 :(得分:7)
默认情况下,每个类(没有特定的构造函数)都有一个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.
}
答案 2 :(得分:0)
在Java中,无论如何都需要构造函数。它可以像
一样简单 public AnonymousConstructor()
{
}
也没有};在java中,根本不要放那个分号。此外,您始终希望使用访问修饰符,即" public,private或protected"。现在你应该可以打电话给超级承包商了。
对于主类,它是静态的,因此不需要构造函数。如果你想在主类中创建一个方法,它必须是静态的。