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

Java 如何从匿名内部类调用特定的父构造函数?,java,constructor,inner-classes,scjp,Java,Constructor,Inner Classes,Scjp,好的,我知道匿名内部类要么隐式扩展父类,要么实现接口,因此需要调用超类的构造函数。但是,我不知道如何为匿名类创建构造函数(如果可能的话),如果不定义构造函数,我也不知道如何调用super()!这是我的执业守则: public class AnonymousConstructor { public static void main(String[] args) { //I'm not sure how to explicitly call one of the arg su

好的,我知道匿名内部类要么隐式扩展父类,要么实现接口,因此需要调用超类的构造函数。但是,我不知道如何为匿名类创建构造函数(如果可能的话),如果不定义构造函数,我也不知道如何调用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");
    }
}
我担心的是,如果您试图从一个没有无参数构造函数的类生成一个匿名类,那么代码将在编译时失败,因为无法将参数传递给超级构造函数。这是一个有效的问题吗?如果是的话,有没有办法解决这个问题?

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

在您当前的示例中,您可以说

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


在Java中,无论发生什么情况,都需要有一个构造函数。它可以简单到

    public AnonymousConstructor()
    {
    }
也没有};在java中,只需不使用分号即可。此外,您始终希望使用访问修饰符,即“public、private或protected”。现在你应该可以给超级导体打电话了


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

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

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

新的MyBob(“str”){}就可以了。包级别呢?没关系。包类似于在同一个解决方案中有多个项目。@Katianie,我很确定Elliott的意思是省略访问修饰符会使构造函数包级别更高,因此访问修饰符不是严格要求的。正确。而且,这是一个有用的访问许可(特别是对于建筑商和工厂);在java中发生,例如在类内声明匿名内部类或枚举之后。是这样吗?那么,我怎么不能编写
Integer I=newinteger()?@Bohemian整数类被声明为final(与c++中的const类似),因此无法构造它。integer类有一些有用的静态方法,比如integer.parseInt(“1234”)@凯蒂安错了。提示:您可以编码
Integer i=新整数(0)。更大的提示:阅读@hisI的注释可以理解没有构造函数的类会得到默认构造函数,但我的问题更多的是,当没有默认的无参数构造函数时,如何为匿名内部类的超类指定构造函数,因为显式设置了单个或多个参数构造函数,而隐式设置了无参数构造函数。谢谢,这回答了我的问题。我现在明白了,在我的代码中,我不能为我的内部类创建构造函数,但我可以将参数传递到新调用中,例如MyBob my=new MyBob(“foo”,“bar”){};谢谢事实上,如果超类没有无参数构造函数,则需要这样做。
MyBob my = new MyBob("foo") { // super(String) is called
    // you can add fields, methods, instance blocks, etc, but not constructors
}