Java中的类层次结构编译错误

时间:2013-11-22 03:22:03

标签: java hierarchy bluej

这是我第一次在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;
    }
}

我的项目很大程度上都包含了像这样的任务。

4 个答案:

答案 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调用超类的默认构造函数而没有任何参数

但是,您的超类没有接受空参数列表的构造函数。这将导致“实际和形式参数列表长度不同”的错误,因为它尝试使用空参数列表进行构造,但是您提供的所有构造函数都采用不同大小的参数列表。

您可以做两件事。

  1. ,创建超类的另一个不接受参数的构造函数。
  2. ,使用适当的参数调用继承的构造函数中的super()。
  3. OOP的这一特性对于理解所涉及的灵活性至关重要。此功能允许您在子类范围内对此类对象进行一次特定更改之前(或之后)自定义超类定义的对象的状态。在一系列继承中,这种构造函数的链接是Java和OOP的一个非常强大的方面。

答案 3 :(得分:0)

编写构造函数

  

公共附件(){}

您的Attachments类中的

,以便您的继承类可以调用超类的构造函数