Java中的类层次结构编译错误
Posted
技术标签:
【中文标题】Java中的类层次结构编译错误【英文标题】:Class Hierarchy Compiling Error in Java 【发布时间】:2013-12-06 20:04:22 【问题描述】:这是我第一次在 Stack Overflow 上发帖,但在我正在从事的项目(用 Java 编写)的早期步骤中遇到了麻烦,我正在寻找指导。我搜索了论坛,但仍然很难理解我所犯的错误。
我正在创建一个类似于电子邮件的青少年系统,更具体地说,我正在研究类层次结构和继承。我的超类是Attachments,它的子类是ContainsDescription。
编译时,ContainsDescription子类的构造函数出现错误。错误内容为“实际参数列表和形式参数列表的长度不同”,我不太知道如何解释。我的代码如下:
public class Attachments
private String filename;
private int size;
public Attachments(String filename, int kilobytes)
this.filename = filename;
size = kilobytes;
public void preview()
System.out.println("Filename: " + filename + "\n");
System.out.println("Size: " + size + " kB" + "\n");
public class ContainsDescription extends Attachments
private String description;
public ContainsDescription(String description)
this.description = description;
我们将不胜感激,因为我的大部分项目都包含这样的任务。
【问题讨论】:
您发布的代码有语法错误;Attachments
的构造函数没有关闭。
谢谢,我几乎在发布后立即发现并更正了它。
【参考方案1】:
您必须在ContainsDescription
中提供一个构造器,它接受您的超类的参数。
你必须把它们结合起来:
public class ContainsDescription extends Attachments
private String description;
public ContainsDescription(String description, String filename, int kilobytes)
super(filename, kilobytes);
this.description = description;
如果不这样做,它将无法构造超类。
如果你真的只想要一个以Description
作为参数的构造函数,你可以提供默认值:
public class ContainsDescription extends Attachments
private String description;
public ContainsDescription(String description)
super("", 0);
this.description = description;
【讨论】:
否;问题只是现有的构造函数需要构造超类。 @SLaks: 刚刚编辑过 :) - 实际上,我的第一个代码确实不起作用。一个构造函数不起作用。现在改变。 谢谢,杰伦。第一个给出了同样的错误,但第二个有效。没有意识到我必须在子类中构造超类。【参考方案2】:这里发生的事情称为java中的构造函数链接,您可以阅读更多here
由于您的父类有一个带参数的构造函数,您需要显式调用它。 否则将对默认构造函数进行不带参数的隐式调用,在您的情况下,默认构造函数不可用。如果你还没有调用它,你的代码是一样的
public class ContainsDescription extends Attachments
private String description;
public ContainsDescription(String description)
super(); //implicitly added by java. This will look for constructor withod argument in the super class
this.description = description;
【讨论】:
感谢您的链接,@FreakyThommi。我还处于编程初期,所以所有信息都很有用。【参考方案3】:您收到“实际参数列表和形式参数列表的长度不同”错误仅仅是因为 Java 调用了超类的默认构造函数没有任何参数。
但是,您的超类没有接受空参数列表的构造函数。这会导致“实际参数列表和形式参数列表长度不同”的错误,因为它尝试使用空参数列表进行构造,但是您提供的所有构造函数都接受不同大小的参数列表。
您可以做两件事。
-
或者,为您的超类创建另一个不接受参数的构造函数。
或者,使用适当的参数在继承的构造函数中调用 super()。
OOP 的这一特性对于理解所涉及的灵活性至关重要。此功能允许您在子类范围内对此类对象进行特定更改之前(或之后)自定义由超类定义的对象的状态。这种继承链中构造函数的链接是 Java 和 OOP 的一个非常强大的方面。
【讨论】:
感谢@jab 的彻底回复。非常有用。【参考方案4】:写一个构造函数
公共附件()
在您的 Attachments 类中,以便您的继承类可以调用超类的构造函数
【讨论】:
以上是关于Java中的类层次结构编译错误的主要内容,如果未能解决你的问题,请参考以下文章
Eclipse C++ 问题:没有二进制文件(但没有编译器错误),没有类(但在类层次结构中没有条目)
在析构函数中调用“delete”运算符时出现编译器错误“编译器堆空间不足”