Java 如何从匿名内部类调用特定的父构造函数?
好的,我知道匿名内部类要么隐式扩展父类,要么实现接口,因此需要调用超类的构造函数。但是,我不知道如何为匿名类创建构造函数(如果可能的话),如果不定义构造函数,我也不知道如何调用super()!这是我的执业守则: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
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
}