Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的类层次结构编译错误_Java_Hierarchy_Bluej - Fatal编程技术网

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

Java中的类层次结构编译错误,java,hierarchy,bluej,Java,Hierarchy,Bluej,这是我第一次在这里发表关于堆栈溢出的文章,但是我在一个用Java编写的项目的早期阶段遇到了问题,我正在寻找指导。我已经搜索了论坛,但是仍然很难理解我所犯的错误 我正在创建一个类似青少年电子邮件的系统,更具体地说,我正在处理类层次结构和继承。我的超类是Attachments,它的一个子类是ContainsDescription 编译时,ContainsDescription子类的构造函数中发生错误。错误是,实际参数列表和形式参数列表的长度不同,我不太知道如何解释。我的代码如下: public cl

这是我第一次在这里发表关于堆栈溢出的文章,但是我在一个用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;
    }
}

我非常感谢您的指导,因为我的项目中有很多都是这样的任务。

您必须提供一个CONCONSTRUCTOR in CONTAINS描述,它接受您的超类的参数

您必须将它们结合起来:

public class ContainsDescription extends Attachments
{
    private String description;

    public ContainsDescription(String description, String filename, int kilobytes)
    {
        super(filename, kilobytes);
        this.description = description;          
    }
}
如果不这样做,它将无法构造超类。 如果您确实只需要一个以描述为参数的构造函数,则可以提供默认值:

public class ContainsDescription extends Attachments
{
    private String description;

    public ContainsDescription(String description)
    {
        super("", 0);
        this.description = description;          
    }
}

这里发生的事情在java中称为构造函数链接,您可以阅读更多内容

因为父类有一个带参数的构造函数,所以需要显式调用它。 否则,默认构造函数将不带参数进行隐式调用,在您的情况下,默认构造函数不可用。如果您没有调用它,那么您的代码与

        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;
        }
    }
编写构造函数

公共附件{}


在您的Attachments类中,您的继承类可以调用超类的构造函数,您得到的实际参数列表和形式参数列表的长度不同,这仅仅是因为Java调用超类的默认构造函数时没有任何参数

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

你可以做两件事

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

No;问题是现有的构造函数需要构造超类。@SLaks:刚刚编辑过它:-实际上,我的第一个代码确实不起作用。一个构造函数是行不通的。现在换衣服。谢谢你,杰伦。第一个给出了相同的错误,但第二个有效。没有意识到我必须在子类中构造超类。你发布的代码有语法错误;附件的构造器没有关闭。谢谢,我几乎在发布后立即发现并更正了它。谢谢@jab的全面回复。非常有用。谢谢你的链接,@freakythomi。我正处于编程的初级阶段,所以所有的信息都是有用的。