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

Posted

技术标签:

【中文标题】如何从匿名内部类调用特定的父构造函数?【英文标题】:How to call a specific parent constructor from anonymous inner class? 【发布时间】:2014-01-15 10:14:23 【问题描述】:

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

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

【问题讨论】:

new MyBob("str") 可以。 【参考方案1】:

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

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

【讨论】:

谢谢,这回答了我的问题。我现在明白,在我的代码中,我无法为内部类创建构造函数,但我可以将参数传递给新调用,例如 MyBob my = new MyBob("foo", "bar") ;谢谢! 如果超类没有无参数构造函数,这实际上是必需的。【参考方案2】:

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

【讨论】:

是这样吗?那我怎么不能编码Integer i = new Integer(); @Bohemian Integer 类被声明为 final(如 c++ 中的 const ),因此它不能被构造。整数类具有有用的静态方法,例如 Integer.parseInt("1234"); @Katianie 错了。提示:您可以编码Integer i = new Integer(0);。更大的提示:阅读@his 的评论 我知道没有构造函数的类会获得默认构造函数,但我的问题更多是当没有默认的无参数构造函数时如何为匿名内部类的超类指定构造函数显式设置单个或多参数构造函数,并且没有隐式设置无参数构造函数。【参考方案3】:

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

一样简单
    public AnonymousConstructor()
    
    

也没有 ;在java中,根本不要放那个分号。此外,您总是希望使用访问修饰符,即“公共、私有或受保护”。现在你应该可以调用超级委托人了。

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

【讨论】:

包级别呢? 剂量问题。包类似于在同一个解决方案中拥有多个项目。 @Katianie,我很确定 Elliott 的意思是省略访问修饰符会使构造函数成为包级别,因此访问修饰符不是严格要求的。 正确。此外,它是一个有用的访问权限(尤其是对于 Builders 和 Factory)。 其实也有;发生在 java 中,例如在类中声明的匿名内部类或枚举之后。

以上是关于如何从匿名内部类调用特定的父构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA学习之局部内部类,匿名内部类,静态内部类

匿名内部类

java中匿名内部类的匿名构造函数是怎么用的?

匿名对象,封装,构造代码块静态代码块内部类匿名内部类

该如何理解匿名内部类的功能?

匿名内部类