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 编译错误:“类名”类型的层次结构不一致

Eclipse C++ 问题:没有二进制文件(但没有编译器错误),没有类(但在类层次结构中没有条目)

在析构函数中调用“delete”运算符时出现编译器错误“编译器堆空间不足”

Eclipse中的QueryService createSpecification编译错误

编译时异常与运行时异常的区别

Java类的根Object