![](/img/trans.png)
[英]In java, if I call, from a subclass, a superclass method that calls an overriden method, which class' method will be called?
[英]JAVA: what happend when i call a getter method of a object which actually extend the method from it's superClass
public class Person {
public String name = "person";
public String getName(){
return name;
};
}
public class Teacher extends Person{
public String name ="teacher";
public static void main(String[] args) {
Teacher teacher = new Teacher();
System.out.println(teacher.getName());
}
}
**無論名稱屬性的修改是私有的還是公共的,結果始終是“人”,但到目前為止我所學到的告訴我,如果子類從超類擴展,它也會包含超類的方法,所以當我調用該方法時子類object,方法中的名稱應該是this.name,這應該是老師吧?,但為什么我仍然得到超類的名稱? **
子類中名為name
的變量隱藏了super class中的同名變量。參見https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#d5e12172
您可能希望在超類中只有一個字段name
,並希望在構造 object 時設置它:
class Person {
private final String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
class Teacher extends Person {
public Teacher(String name) {
super(name);
}
public static void main(String[] args) {
Teacher teacher = new Teacher("teacher");
System.out.println(teacher.getName());
}
}
這基本上是范圍界定的問題。 private
變量只能由定義的 class 訪問。在您的例子中,基數 class 負責實現 getter function,它只會知道自己的變量。
基礎 class 不知道子類中定義的變量(這可以說是過於簡單化了,下面的建議中有一些解釋性細節,但至少應該讓你走上正確的道路)。
如果您希望子類能夠修改變量值,而不僅僅是 function,那么您需要執行以下操作之一:
protected
(僅對 class 及其子類可見),並在子類的構造函數中對其進行賦值。 或者,return "teacher";
)。 如果這樣做,請記住您正在分配一個碰巧共享相同名稱的新變量; 它與 state 的基類視圖不同。super(name)
,就像@tgdavies 所做的那樣。 如果設置名稱是所有子類的一個相當關鍵的行為,這個解決方案連同上面的#1 和#2,確保名稱只有一個真實來源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.