2016-11-15 262 views
1

我有一個類如何訪問子方法內的子類中的父類變量?

public class A { 
    private String name; 

    public void setName(String name){ 
     this.name = name; 
    } 

    public string getName(){return name;} 

    public String toString() { 
     StringBuilder builder = new StringBuilder(); 
     builder.append(name).append(", "); 
     return builder.toString(); 
    } 
} 

我有延伸的一個子類B和我不得不從在toString方法訪問名字B.我寫了下面的代碼,但不知道這是否一個好的做法?

public class B extends A { 
    private String gender; 

    public void setGender(String gender){ 
     this.gender = gender; 
    } 

    public string getGender(){return gender;} 

    @Override 
    public String toString() { 
     c = new A(); 
     StringBuilder builder = new StringBuilder(); 
     builder.append(c.getName()).append(", "); 
     builder.append(gender).append(", "); 
     return builder.toString(); 
    } 
} 

編輯: 如果我不能在B類訪問私人字符串名稱,我用super.setName(name)@Override setName()?在那種情況下,如果我不想使用A的任何對象,那麼它與使用類B不同的地方有什麼不同?

我剛開始使用JAVA來修改服務。

+0

您可以使用'super'關鍵字來使用模式類方法或實例變量。 like'super.name' – seal

+0

不,這不是很好的做法。首先,'c'變量中的'name'值從來沒有被設置爲任何東西,所以它總是默認的。您可以從派生類中訪問基類的getter和setter,爲什麼不使用這些呢? – David

回答

4

當你繼承一個類時,你也繼承所有來自繼承的公共和保護的方法和變量。所以,你可以做

@Override 
public String toString() { 
    StringBuilder builder = new StringBuilder(); 
    builder.append(this.getName()).append(", "); 
    builder.append(this.getGender()).append(", "); 
    return builder.toString(); 
} 
3

簡單地通過調用你的toString方法getName()super.getName()

,如:

@Override 
public String toString() { 
    StringBuilder builder = new StringBuilder(); 
    builder.append(getName()).append(", "); 
    builder.append(gender).append(", "); 
    return builder.toString(); 
} 
2

永遠不要忘記一句老話:你沒有繼承你父母的私處。

如果你想B有機會獲得A.name,你有兩個選擇:

  • 變化name是要麼publicA(壞)或protected(更好)。
  • 訪問nameA的設置者和吸氣劑,例如, this.getName()
  • 使用reflection

什麼你做目前剛剛返回的A.name默認值,而不是實際屬於你的B實例名稱的值。

+0

我無法更改父類,它正在幾個不同的項目中使用。而且我忘了提及A類屬於不同的包裝。 – spod

+1

@spod它所在的包與「public」或「protected」級別無關。無論如何,你最好的選擇是隻使用提供的setters/getters或者在需要時使用反射。 –