2014-03-04 60 views
2

我正在用Java編寫Volume和Book類,以幫助我更好地理解構造函數和對象 - 基本上是OOP的更廣泛方面。當我嘗試創建一個主類,我收到指出以下錯誤:實際和正式參數列表長度不同

「類卷構造卷不能被應用到給定的類型; 要求:字符串,整數,圖書[] 發現:無參數 原因:實際和正式名單長度不同 ----「

這是我到目前爲止的代碼。

首先,卷類:

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 
} 

}

我有Volume中的構造函數正確設置(以我的理解),但仍然收到此錯誤。任何提示或建議?先謝謝你!

+0

您定義的參數化的構造函數爲什麼你讓你的'Volume_Main'類擴展'Volume'?刪除'擴展音量'。 –

+0

你在主要方法中添加什麼語句來調用construtor拋出錯誤? – Kick

+0

當我用Volume擴展它時,是不是表示我將有權訪問Volume類?在我寫過其他程序之前,這對我來說已經很好了 – user3380461

回答

2

在Java中,每個類都必須有一個構造函數。在你沒有明確定義一個編譯器的情況下,實質上爲你插入一個空的構造函數。如果你沒有明確地調用超類構造函數,構造函數也隱式調用父類的無參數構造函數。所以,你的Volume_Main類具有以下構造:

public Volume_Main() { 
    super() 
} 

但是,父類的Volume_MainVolume,且沒有參數的構造函數,所以編譯器會引發錯誤。 Volume_Main可能沒有理由延伸Volume,但至少您將不得不明確定義Volume中的無參數類。

+0

這幫了很多,謝謝澄清! – user3380461

+0

作爲編譯器添加參數較少的構造子類爲什麼它不添加在超類? – Kick

+0

@Youngistan如果類沒有明確定義的構造函數,它只會添加無參數的構造函數。在這種情況下,'Volume'類('Volume_Main'的父類)*具有構造函數,但它需要參數。 –

0

或者您刪除了extends Volume或者您在Volume_Main中使用相同的參數創建了一個構造器。就我個人而言,在這種情況下我認爲繼承Volume是沒有意義的。

0

您的Volume類構造函數是一個無參數構造函數。並且您正在Volume_Main類中擴展Volume類。默認情況下,它將在Volume類中查找無參數構造函數。

因此,在Volume_Main類中,您必須定義構造函數,該構造函數將調用Volume類的正確構造函數。

編輯:

有兩種方法可以解決此問題。

1)如果您不需要擴展Volume類,那麼您可以從Volume_Main類中刪除'extends Volume'

2)您可以定義卷類無參數的構造函數會調用像

public Volume() { 
    this(voulmeName, numberOfBooks, books); 
} 
相關問題