当前位置: 首页 > 知识库问答 >
问题:

子类的不同构造函数

张勇
2023-03-14

我有一个抽象的超类,它有一个形式的构造函数

public classname(String name, int amount)

并希望创建该抽象类的一个子类,该子类不是以字符串作为其第一个参数,而是采用一个表示给定字符串名称的整数值,例如,0代表某个字符串,1代表另一个字符串,依此类推。

当我尝试编写窗体子类(int number,int amount)的构造函数时,我得到一个格式为“Implicit super constructor is undefined.必须显式调用另一个构造函数”的错误。

为什么不能在子类中创建另一个不同的构造函数?

共有2个答案

裴星洲
2023-03-14

错题,你可以在子类中再写一个构造函数,但由于超类没有默认/无参数构造函数,所以你得明示地调用你提到的超类的构造函数,以保证超类的不变性。

蓬宾白
2023-03-14

正如派生类中其他人提到的,您需要使用super(arguments)调用其超类的构造函数。此外,此调用必须是构造函数中的第一个指令,因此您可能会面临这样的问题:在调用构造函数之前,您需要确定要作为name放置的值

MyClass(int id, int amount){
    super("???",amount);
}

在这里,我们还不知道使用什么值来代替“???”。不幸的是你不能用

MyClass(int id, int amount){
    if (id==1) super("foo",amount);
    else super("bar",amount);
}

一种可能的解决方案是创建单独的方法,该方法将基于id返回正确的名称,并将其用作super参数,如

MyClass(int id, int amount){
    super(choseName(id),amount);
}

private static String choseName(int id){
    if (id==1) 
        return "foo";
    else 
        return "bar";        
}
 类似资料:
  • 问题内容: 编译该程序时,出现错误- 错误-找不到构造函数Person()。为什么定义Person()是必要的? 问题答案: 创建时,您要同时创建一个。为了确保构造正确,编译器在构造函数中添加了一个隐式调用: 由于没有无参数构造函数,因此失败。 您可以通过以下任一方式解决它 添加对super的显式调用,如下所示: } 或通过将no-arg构造函数添加到: } 通常,编译器还会隐式添加无参数构造函数

  • 我在Java有一个简单的亲子实现。父类看起来像: 和子类类似于: 当我打电话的时候 我希望BasePage构造函数也能运行并设置配置数据。但BasePage构造函数根本不运行。我不明白为什么。有人能告诉我为什么吗?谢谢.

  • 问题内容: 我有两个类,和,扩展了前一个类。 具有以下构造函数: 我将注意到所有实例变量都已设置为private。 同时,具有以下构造函数: 但是,这为我的构造函数引发了“找不到符号”错误。 我尝试使用,但是我的超类的私有范围阻止了这种情况。 我发现向我的构造函数中添加字段并允许我调用超级构造函数,但是我想知道是否存在一种无需在子类构造函数中传递其所有参数的情况下调用超级构造函数的方法? 问题答案

  • 我在班里学习。出于好奇,我扩展了具有参数化构造函数的内部类。但是当我编写super(inti)来调用它时,代码不会编译。 因为内部类是外部类的一部分(成员),必须通过外部类访问它们。如何调用测试类的超级构造函数。 编译错误是:由于某些中间构造函数调用,没有外部类型的封闭实例可用

  • 在Dart中,工厂构造函数需要编码器提供更多逻辑,但与常量构造函数没有太大区别,只是它们允许“非最终”实例变量。 与const Constructor相比,它们有哪些优点? 谢谢大家。 编辑 下面是关于Seth Ladd博客“Dart-试图理解“工厂”构造函数的价值”中工厂构造函数的用法。 恕我直言,使用通用构造函数,可以通过细微的差异实现相同的效果,但相当简单。 如上所示,尽管这两个实例 所以,

  • 为什么在派生类构造函数中调用超类构造函数时id的值为0?当创建子对象时,什么时候在堆中为该对象分配内存?在基类构造函数运行之后还是之前?