2011-10-12 39 views
1

我對擴展的用法有些疑問,我不明白。 對於示例,我將使用兩個類:在Java中重新定義引用(擴展用法)

public class Father { 

    protected String message="Father"; 


    public void printme(){ 
     System.out.println(this.message); 
    } 
} 

而且

public final class Son extends Father { 

    protected String message="Son"; 

} 

我的問題是,爲什麼如果我叫:

new Son().printme(); 

它打印出 「父親」?我如何解決只改變「兒子」課程?

在此先感謝

+0

'父'不能是最後的或'子'不能繼承。 – Jim

+0

錯字...從父親刪除最終 –

回答

5

選項:

  • 覆蓋的printme方法。
  • 而是在Son宣佈一個新的領域,改變Father字段的值(從Son,你可以這樣做,因爲它的保護 - urgh)

字段是多態性。 Father中的代碼是指message字段,總是是指在Father內聲明的變量。

我強烈建議:

  • 你總是讓私人領域,所以在這種情況下,你想也想提供(比方說)一個公共的getter和內Father
  • 受保護的setter不要影子領域尚且如此,一方面是因爲經驗的開發人員錯誤地認爲有某種壓倒一切的事情
1

重寫printme()以及將其定義爲。

@Override public void printme(){ 
    System.out.println(message); 
} 

Father.printme()中的this.message解析爲Father的消息。

1

只能通過改變son類解決:(注:Father不能final,因此改變)

public class Father { 

protected String message="Father"; 


public void printme(){ 
    System.out.println(this.message); 
} 
} 

final class Son extends Father { 

protected String message="Son"; 
public void printme(){ 
    System.out.println(this.message); 
}} 
0

如果你可以改變父類,另一種選擇是在父類中更改場一種方法:

public class Father { 
    protected String message() { return "Father"; } 

    public void printme(){ 
     System.out.println(this.message()); 
    } 
} 

public final class Son extends Father { 
    @Override 
    protected String message() { return "Son"; } 
} 

方法(與字段不同)是多態的,所以這可以按你的意願工作。

相關問題