这是我第一次在Stack Overflow上发帖,但是我正在处理我正在进行的项目的早期步骤(用Java编写)并且正在寻找指导。我搜索了论坛,但我仍然很难理解我正在制作的错误。
我正在创建一个类似电子邮件的少年系统,更具体地说,是在创建类层次结构和继承。我的超类是附件,其子类是 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;
}
}
我的项目很大程度上都包含了像这样的任务。
答案 0 :(得分:3)
您必须在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;
}
}
答案 1 :(得分:1)
这里发生的事情在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;
}
}
答案 2 :(得分:1)
你得到的“实际和形式参数列表的长度不同”错误只是因为Java调用超类的默认构造函数而没有任何参数。
但是,您的超类没有接受空参数列表的构造函数。这将导致“实际和形式参数列表长度不同”的错误,因为它尝试使用空参数列表进行构造,但是您提供的所有构造函数都采用不同大小的参数列表。
您可以做两件事。
OOP的这一特性对于理解所涉及的灵活性至关重要。此功能允许您在子类范围内对此类对象进行一次特定更改之前(或之后)自定义超类定义的对象的状态。在一系列继承中,这种构造函数的链接是Java和OOP的一个非常强大的方面。
答案 3 :(得分:0)
编写构造函数
您的Attachments类中的公共附件(){}
,以便您的继承类可以调用超类的构造函数