2013-03-11 20 views
0

這是作業分配的一部分。如何在Java中編寫替代方法

我試圖做一個class名爲RomanNumeral有幾種方法。第一種方法,RomanNumeral檢查字符串rn是否是羅馬數字。第二種方法將羅馬數字轉換爲十進制值。我的問題在於其他方法。我被要求爲.equals().compareTo()toString()創建替代文件。我的問題是我怎麼會開始這樣做呢?重寫是什麼意思?我應該看看他們做什麼,並效仿它?如果我在哪裏,可以在哪裏查看定義.compareTo()toString()的方法?

如果有幫助,我可以發佈我的當前代碼。

+0

覆蓋基本上意味着用您自己的方法替換定義方法的代碼...'@覆蓋' – JCOC611 2013-03-11 21:57:36

+3

http://docs.oracle.com/javase/tutorial/java/IandI/override.html看看文檔 – 2013-03-11 21:58:31

+1

迄今爲止,您諮詢了哪些書籍或文檔?如果他們不解釋什麼是覆蓋手段,它們必須非常糟糕...... – zeroflagL 2013-03-11 22:00:22

回答

3

好了,從我所看到的,你有2點主要的問題在這裏。

  1. 是什麼意思覆蓋的方法?
  2. 如何重寫一個方法?

讓我們想出一個新班級,這樣我就可以避免爲你做功課。

我們有一個名爲Student類,其存儲3個字符串。

  • GPA

它可能是這個樣子。

public class Student { 
    String firstName; 
    String lastName; 
    String gpa 

    public Student(String firstName, String lastName, String gpa){ 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.gpa = gpa; 
    } 

    // Perhaps some methods here 

    public String getIdentity(){ 
     return this.lastName + ", " + this.firstName; 
    } 
} 

你喜歡學生課,但是你認爲如果你能跟蹤一個大學生ID也會好很多。一種解決方案是擴展學生類。

通過擴展類,我們接觸的所有的學生有方法(和構造函數),我們得到添加一些我們自己的。 因此,讓我們打電話給我們的新班級CollegeStudent,併爲studentId添加一個字符串。

public class CollegeStudent extends Student{ 

    String studentId; 

} 

現在,沒有額外的工作,我可以創造一個CollegeStudent,並獲得它的身份。

// Code 
CollegeStudent myCollegeStudent = new CollegeStudent("Dennis", "Ritchie", "2.2"); 
String identity = myCollegeStudent.getIdentity(); 
// Code 

好的,足夠的設置。讓我們回答你的問題。

所以讓我們假設,而不是返回「裏奇丹尼斯」,你更喜歡的getIdentity()返回「studentId」對於大學生。你可以用覆蓋的getIdentity方法。

通過重寫的方法,你會得到重新寫的getIdentity(),使其返回studentId。 CollegeStudent班會看起來像這樣。

public class CollegeStudent extends Student{ 

    String studentId; 

    @Override 
    public String getIdentity(){ 
     return this.studentId; 
    } 
} 

要覆蓋一個方法,你必須返回同一類型的對象(在我們的例子字符串),你必須接受相同的參數(本例未接受任何參數)

你也可以覆蓋構造函數。

那麼這是如何適用於你的任務? .equals(),.compareTo()和.toString()已經定義,因爲您將擴展的類(如Object)。但是,您需要重新定義或覆蓋這些方法,以便它們對您的班級有用。也許你的執行toString()將返回單詞「四」而不是「IV」。可能不會,但重要的是您現在可以自由決定如何編碼該方法。

希望這會有所幫助。

+0

這是什麼。聲明呢?是否this.firstName = firstName;在第一種方法中,將方法Student的參數firstName分配給類變量firstName? – Chase 2013-03-11 23:14:56

+0

這是正確的。 – ProbablyJody 2013-03-12 00:24:23

+0

我可以改爲將構造函數的頭文件寫爲「String Student(String fname,String lname,String newgpa)」,因此第一個名稱的賦值看起來像「this.firstName = fname」。我使用「這個」來減少歧義。如果變量的名稱不同,則「this」不是必需的。即在這種新的情況下,「firstName = fname」也可以工作。 – ProbablyJody 2013-03-12 00:36:57

2

當一個類別延伸另一個,它繼承所有非私有實例成員。

例如,RomanNumeral延伸Object,所以它繼承後者的toString()方法。這意味着您可以在任何RomanNumeral實例上調用toString(),並調用Object.toString()方法。

然而,RomanNumeral可以通過提供其自己定義,將取代它繼承了一個選擇覆蓋此方法。然後,當您在RomanNumeral實例上調用toString()時,它將調用您定義的方法。 (這工作,即使你通過一個Object參考參考RomanNumeral實例)

所以,你被要求你來充實這個專欄:

public class RomanNumeral { 

    // ... your other methods ... 

    @Override  // this line is optional 
    public String toString() { 
     // TODO define this method 
    } 

    @Override  // this line is optional 
    public boolean equals(Object o) { // note: 'Object', *not* 'RomanNumeral'! 
     // TODO define this method 
    } 

    @Override  // this line is optional 
    public int hashCode() { 
     // TODO define this method 
    } 

} 

注意的是,儘管你似乎什麼被告知,沒有「覆蓋文件」這樣的東西。與其他方法一樣,上述方法在RomanNumeral.java內定義。

+2

所有成員都是繼承的,不僅是方法。如果子類位於同一個包中,則包可見成員僅被繼承。 – zeroflagL 2013-03-11 22:11:46

+0

@zeroflagL:Re:Fields:的確;但由於它們不能被覆蓋,並且通常會更混亂,所以我決定不提這一點。 (我不認爲我的答案意味着它們*不是*,是嗎?它只是沒有提及它們。)Re:包可見成員:排序。這很複雜。它們*是*繼承的,正如你通過在原始包中創建一個新的子類所看到的。相比之下,私有方法永遠不會被繼承:如果'Foo'有一個內部類'Bar',它是它的一個子類,那麼'Bar'可以*看到*'Foo'的私有方法,但不能覆蓋它們。如果沒有upcast等,就不要使用它們。 – ruakh 2013-03-11 22:37:42

+0

有人對這個領域完全陌生可能確實意味着這些字段沒有被繼承。 Me:「只有在子類位於同一個包中時纔會繼承包可見成員」 您:「它們是繼承的,如通過在原始包中創建新的子類所能看到的」 重寫我寫的內容的重點是什麼? – zeroflagL 2013-03-12 09:19:36

0

documentation
在具有相同簽名(名稱,再加上數量及其參數的類型)的子類的實例方法和返回類型的超類的實例方法覆蓋超類的方法。

子類重寫方法的能力允許類從行爲足夠「接近」的超類繼承,然後根據需要修改行爲。重寫方法具有相同的名稱,參數的數量和類型,以及返回類型與其覆蓋的方法相同。

重寫某個方法時,可能需要使用@Override註釋,該註釋指示編譯器打算覆蓋超類中的方法。

0

重寫通過創建方法的新實現來更改實例行爲的方法。每個Java類都繼承Object類的equals(),hashCode()和toString()。

嘗試在您的類中編寫這些方法的新實現,以便toString()將RomanNumber返回爲字母,如果其他對象爲als且具有相同的值並且尊重兩個等於對象需要具有相同的哈希碼。

添加@Override註解你的方法,以紀念他們爲故意變化,因此讓編譯器檢查簽名。

0

你需要做的是重新定義這些方法:

public class RomanNumeral implements Comparable<RomanNumeral>{ 

@Override 
public boolean equals(Object obj) { 
// your conditions and return true or false 
} 

@Override 
public String toString() { 
return "Show the world my representation"; 
} 

public int compareTo(T o) { 
/* your conditions and if returns: 
Less than zero -> instance precedes obj in the sort order. 
Zero -> instance occurs in the same position in the sort order as obj 
Greater than zero -> instance follows obj in the sort order)*/ 
}