2013-02-16 59 views
7

這裏是什麼,我想問問的Java多態性如何調用父類方法的子類對象

超Name.java

public class Name{ 
    protected String first; 
    protected String last; 

     public Name(String firstName, String lastName){ 
     this.first = firstName; 
     this.last = lastName; 
     } 

     public String initials(){ 
     String theInitials = 
      first.substring(0, 1) + ". " + 
      last.substring(0, 1) + "."; 
     return theInitials; 
     } 

一個例子,然後在子類是ThreeNames.java

public class ThreeNames extends Name{ 
    private String middle; 

    public ThreeNames(String aFirst, String aMiddle, String aLast){ 
    super(aFirst, aLast); 
    this.middle = aMiddle; 
    } 

    public String initials(){ 
    String theInitials = 
     super.first.substring(0, 1) + ". " + 
     middle.substring(0, 1) + ". " + 
     super.last.substring(0, 1) + "."; 
    return theInitials; 
    } 

所以,如果我創建一個Threename物體ThreeNames example1 = new ThreeNames("Bobby", "Sue" "Smith"),然後調用System.out.println(example1.initials());我會得到B.S.S.我明白了。

我的問題是有沒有辦法來調用的縮寫方法是在名稱類,使我的輸出就是B.S.

+0

非常感謝您的答案! – 2013-02-16 06:00:34

+0

[使用子類對象訪問超類函數](http://stackoverflow.com/questions/2432249/accessing-super-class-function-using-subclass-object) – 2015-01-20 23:16:27

回答

11

no。一旦你重寫了一個方法,那麼從外部調用該方法將被路由到你重寫的方法(當然,如果它繼續沿着繼承鏈進一步重寫)。 你只能從自己的覆蓋方法中調用超級方法,像這樣:

public String someMethod() { 
    String superResult = super.someMethod(); 
    // go on from here 
} 

但那不是什麼youre這裏尋找。 也許你可以把你的方法爲:

public List<String> getNameAbbreviations() { 
    //return a list with a single element 
} 

,然後在子類中做到這一點:

public List<String> getNameAbbreviations() { 
    List fromSuper = super.getNameAbbreviations(); 
    //add the 3 letter variant and return the list 
} 
+0

這很有道理,就像一個方法可能是在子類中使用,他們爲什麼要重寫?只需將該塊放在另一個方法中,並在將要被覆蓋的父方法中調用該方法。 – 2017-01-20 09:34:23

5

有很多方法可以做到這一點。一種方法:不要在ThreeNames中覆蓋Names#initials()

另一種方法是向ThreeNames添加方法,該方法委託給Names#initials()

public class ThreeNames extends Name { 
    // snip... 

    public String basicInitials() { 
     return super.initials(); 
    } 
} 
1

我反而獨自離開縮寫在超和介紹,將返回完整的新方法縮寫。因此,在您的代碼中,我只需將ThreeNames中的首字母縮寫方法重命名爲其他名稱即可。這樣,你的姓名首字母縮寫的方法是相同的名稱

相關問題