继承类(Java),显式构造函数错误信息

Inheritance classes (Java), explicit constructor error message

所以我正在尝试学习继承 classes.

首先我创建了一个叫做Box的class来计算盒子的面积。

然后我创建了一个 TestBox Class,我在其中创建了一个名为 fedEx 的盒子对象。

框Class:

public class Box {
    private String boxName;

    public void calculateArea(int length, int width) {
        System.out.println("Area of " + getBoxInfo() + (length * width));
    }

    public Box(String boxName) {
        this.boxName = boxName;
    }

    public String getBoxInfo() {
        return boxName;
    }
}

测试盒Class:

public class TestBox {

    public static void main(String[] args) {

        Box fedEx = new Box("fedEx");
        fedEx.calculateArea(23, 2);
    }
}

到目前为止,如果我 运行 这段代码一切正常,我的打印屏幕显示 联邦快递 46 区

所以现在我去新建一个class叫NewBox,用"extends"继承classBox的方法,这个class用来计算音量

NewBox Class:

public class NewBox extends Box {

    public void calculateVolume(int length, int width, int height) {
        System.out.println("Volume = " + (length * width * height));
    }
}

现在为了测试这个,我在我的 TestBox class 中创建了一个名为 UPS 的新对象,现在我的 TestBox class 看起来像这样:

public class TestBox {

    public static void main(String[] args) {

        Box fedEx = new Box("fedEx");
        fedEx.calculateArea(23, 2);

        NewBox UPS = new NewBox("UPS");
        UPS.calculateArea(3, 2);
        UPS.calculateVolume(3, 2, 2);
    }
}

当我尝试 运行 这个程序时,我收到以下错误消息:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The constructor NewBox(String) is undefined
    at day3.inheritence.TestBox.main(TestBox.java:10)

我正在使用 eclipse 作为我的 IDE。

如何修复我的代码,错误消息是什么意思?

在您的 NewBox class 中添加以下内容。

public NewBox(String name){
    super(name);
}

现在NewBox变成了

public class NewBox extends Box{
    public NewBox(String name){
        super(name);
    }

    public void calculateVolume(int length, int width, int height){
        System.out.println("Volume = " + (length*width*height));
    }
}

NewBox 必须有一个构造函数转发给父 class 的构造函数。试试这个:

public class NewBox extends Box{ 

  public NewBox(String name) {
    super(name);
  }

  public void calculateVolume(int length, int width, int height){ 
    System.out.println("Volume = " + (length*width*height));
  }
}

因为你的 parent class(Box) 有一个参数化的构造函数,你的 child class(NewBox) 必须有一个参数化的构造函数,然后依次调用它的超级 constructor.So 在 NewBox class

中添加以下构造函数
public NewBox(String name){
   super(name)
}

先说default constructors。如果您不自己创建构造函数,则默认构造函数是隐式声明的。

public class SomeClass {
    // field and method declarations to follow
}

如果声明了构造函数,则没有默认构造函数;只有声明的构造函数。

public class Box {

    private final String boxName;

    public Box(String boxName) {
        this.boxName = boxName;
    }
}

对于继承,如果子项隐式声明了默认构造函数,但父项没有具有类似签名的构造函数,则会发生编译时错误。

更具体地说:

It is a compile-time error if a default constructor is implicitly declared but the superclass does not have an accessible constructor (§6.6) that takes no arguments and has no throws clause.

在你的情况下,添加 super 关键字,并将参数直接传递给父级。

public class NewBox extends Box {
    public NewBox(String boxName) {
        super(boxName);
    }
}

作为另一个例子,class Beta 将编译得很好,因为 Alpha 声明了一个与默认构造函数签名匹配的构造函数,但 Delta 将无法编译,因为Gamma 没有匹配的构造函数。

class Alpha {
    public Alpha() {

    }
}

class Beta extends Alpha {

}

class Gamma {
    private final int count;

    public Gamma(int count) {
        this.count = count;
    }
}

class Delta extends Gamma {

}

这可以通过为 `Gam

提供无参数构造函数来解决
class Gamma {
    private final int count;

    public Gamma(int count) {
        this.count = count;
    }

    public Gamma() {
        count = 0;
    }
}

你的 class NewBox 应该是这样的

public class NewBox extends Box{

    public NewBox(String boxName){
       super(boxName);        
    }

    public void calculateVolume(int length, int width, int height){
        System.out.println("Volume = " + (length*width*height));
    }
}

通过在您的 TestBox 中写入 NewBox UPS = new NewBox("UPS");JVM 期望在 NewBox 中使用字符串作为参数的构造函数,但那里缺少它。所以我们创建一个构造函数,它在 NewBox 中以字符串作为参数,在那个构造函数中我们写 super(boxName) 表示调用父 class 的构造函数,这里是 Box.