实际和形式参数列表的长度不同

时间:2014-03-04 19:02:17

标签: java class constructor

我正在用Java编写Volume和Book类,以帮助我更好地理解构造函数和对象 - 基本上是OOP的更广泛的方面。当我尝试创建一个主类时,我收到一个错误,指出以下内容:

“构造函数Volume类中的Volume不能应用于给定的类型;  必需:String,int,Book []  发现:没有争论  原因:实际和正式列表的长度不同 ----“

这是我到目前为止的代码。

首先是Volume类:

public class Volume extends Book{

public String volumeName;
public int numberOfBooks;
public Book[] books;

// Constructor with parameters
public Volume(String volumeName,int numberOfBooks,Book[] books){
    this.volumeName = volumeName;
    this.numberOfBooks = numberOfBooks;
    this.books = new Book[numberOfBooks];
}

// String representation of the Volume
public static String toString(Volume volume){
    String volumeDescription = "Here are the details of the selected Volume:\n";
    volumeDescription += "The volume's name is \"" + volume.volumeName + "\".\n";
    volumeDescription += "It contains " + volume.numberOfBooks + " books.\n";
    volumeDescription += "Here is a list of books it contains:\n";
    for(int i = 0; i < volume.numberOfBooks; i++){
        volumeDescription += "[" + i + "] " + volume.books[i];
    }
    return volumeDescription;
}

// Description of each book in the Volume
public static String getBookArray(Volume volume){
    Book[] listOfBooks = volume.books;
    String bookDescriptions = "Here is a description of each book in the Volume.\n";
    for(int i = 0; i < listOfBooks.length; i++){
        bookDescriptions += "Book #" + i + ":\n";
        bookDescriptions += "Title: " + listOfBooks[i].title + "\n";
        bookDescriptions += "Author: " + listOfBooks[i].author + "\n";
        bookDescriptions += "Number of pages: " + listOfBooks[i].numberOfPages + "\n";
    }
    return bookDescriptions;
}

}

这里是主要的,我收到上面提到的错误:

public class Volume_Main extends Volume{

public static void main(String[] args) {
    // TODO code application logic here
}

}

我已正确设置卷中的构造函数(据我所知),但仍然收到此错误。任何提示或建议?提前谢谢!

3 个答案:

答案 0 :(得分:2)

在Java中,每个类都必须有一个构造函数。如果您没有明确定义编译器,则编译器实际上会为您插入一个空构造函数。如果您没有自己显式调用超类构造函数,构造函数也会隐式调用父类的无参数构造函数。所以你的Volume_Main类有以下构造函数:

public Volume_Main() {
    super()
}

但是,Volume_Main的父类是Volume,并且没有无参数构造函数,因此编译器会抛出错误。 Volume_Main可能没有理由扩展Volume,但至少你必须在Volume中明确定义无参数类。

答案 1 :(得分:0)

或者删除extends Volume或者在Volume Main中创建具有相同参数的构造函数。我个人认为在这种情况下从Volume继承是没有意义的。

答案 2 :(得分:0)

您的Volume类构造函数是一个无参数构造函数。您正在Volume_Main类中扩展Volume类。默认情况下,它将在Volume类中查找无arg构造函数。

因此在Volume_Main类中,您必须定义将调用Volume类的正确构造函数的构造函数。

编辑:

您可以通过两种方式解决此问题。

1)如果您不需要扩展Volume类,则可以从Volume_Main类中删除'extends Volume'

2)你可以在Volume类中定义一个no arg构造函数,它将调用你定义的参数化构造函数,如

public Volume() {
  this(voulmeName, numberOfBooks, books);
}