2014-03-13 51 views
-1
public class Occupant { 

    private Position pos; 

    public Occupant(Position iniPos) { 
     this.pos = iniPos; 
    } 

    public Position getPosition() { 
     return pos; 
    } 

    public void setPosition(Position newPos) { 
     this.pos = newPos; 
    } 

    public String getStringRepresentation() { 
     return " "; 
    } 
} 

我需要覆蓋getStringRepresenation在其子類X,這是我寫的。@Override表示法應該在哪裏?

public class Mine extends Occupant { 
    private Position pos; 

    public Mine(Position iniPos) { 
     this.pos = iniPos; 
    } 

    public String getStringRepresentation() { 
     return "X"; 
    } 
} 

我不確定在哪裏使用super和@Override,該類將不會編譯。

+0

它不會允許我通過公開Mine(位置iniPos){ this.pos = iniPos; } – user3413917

+0

它在測試文件中有testMine = new Mine(position);我以爲多數民衆贊成我需要寫在班上 – user3413917

+0

檢查我更新的答案 –

回答

2

在子類Mine的方法前面,您需要添加@Override註釋。

@Override 
public String getStringRepresentation() { 
     return "X"; 
} 

而且,在您的子類Constructor中,您必須調用超類Constructor。

public Mine(Position iniPos) { 
     super(iniPos); // you need to call super class constructor 
     this.pos = iniPos; 
    } 
0

您使用@Override標註在方法,你的意圖重寫只是爲了確保在編譯的時候,我們真正覆蓋方法,還增加了量好代碼的可讀性。

@Override 
public String getStringRepresentation() { 
} 

如果你的方法會覆蓋其父類的方法之一,您可以通過使用關鍵字super的調用重寫的方法。

現在您要訪問的getStringRepresentationsuperclass可以使用super.getStringRepresentation()

1

類不能編譯,因爲Occupant有一個構造函數的參數。因此在構造函數Mine中,需要調用超類的構造函數。這是super關鍵字在沒有與方法名稱一起使用時的功能。

您不需要需要使用@Override註釋but it's recommended

當覆蓋一個方法時,您可能想要使用@Override註釋來指示編譯器,您打算覆蓋超類中的方法。如果出於某種原因,編譯器檢測到該方法在其中一個超類中不存在,則會產生錯誤。

public class Mine extends Occupant { 
    public Mine(Position iniPos) { 
     // call super constructor 
     super(iniPos); 
    } 

    // annotate 
    @Override 
    public String getStringRepresentation() { 
     return "X"; 
    } 
} 

注意Mine可能並不需要另一個Position因爲超已經有一個。只需將構造函數參數傳遞給超類。不得不自己調用構造函數只是Java繼承的一個方面。構造函數不會被繼承,所以如果超類沒有無參數構造函數,則必須明確地調用它。如果超類沒有參數構造函數,並且沒有顯式構造函數調用,編譯器會爲您插入一個​​。