调用基类构造函数但不应该调用

时间:2015-02-11 16:41:45

标签: java constructor

我收到的错误是:

DerivedClass.java:6: error: constructor BaseClass in class BaseClass cannot be applied to given types;
    DerivedClass(String d) {
                           ^
  required: String
  found: no arguments
  reason: actual and formal argument lists differ in length
1 error

这是我的代码:

class BaseClass {
    BaseClass(String f) {
       System.out.println(f);
       System.out.println("BaseClass time");
    }
}
public class DerivedClass extends BaseClass {
    DerivedClass() {
        super("You did not pass an argument to your object.");
        System.out.println("It's DerivedClass time");
    }
    DerivedClass(String d) {
        System.out.println("Hey look, an argument");
        System.out.println(d);
        System.out.println("It's DerivedClass time");
    }
    public static void main(String[] args) {
        DerivedClass defauld = new DerivedClass();
        DerivedClass custom = new DerivedClass("Ayyyyy");
    }
}

怎么办?我觉得没有理由不这样做。 DerivedClass中允许您传递字符串的构造函数已根据我的知识进行了格式化。

3 个答案:

答案 0 :(得分:2)

问题是,如果你没有明确地这样做,那么在构造DerivedClass时,编译器将调用super()而不带参数。修复很简单:

DerivedClass(String d) {
     super(d);
     // rest of your code
}

有关详细信息,请阅读Java Language Specification, Section 12.4.2 - Detailed Initialization Procedure

答案 1 :(得分:1)

您需要显式调用基类构造函数(就像您在其他情况下所做的那样):

DerivedClass(String d) {
    super(d);
    System.out.println("Hey look, an argument");
    ...

如果您不这样做,编译器将隐式尝试为基类调用no-args构造函数。您的代码中没有这样的构造函数,因此出现错误消息。

答案 2 :(得分:0)

Java规则: - 构造函数的第一行是对超类构造函数的调用。如果你甚至没有写这行,那么编译期间编译器会把超级()'它不会调用超类的参数构造函数。

所以当程序执行DerivedClass行时defauld = new DerivedClass();

执行no参数构造函数,第一行是super(),它调用super class的no参数构造函数。(不存在)。

解决方案: -

在基类

中给出一个无参数构造函数

在派生类中参数化构造函数write super("传递一个字符串");在第一行