簡體   English   中英

JAVA:當我調用 object 的 getter 方法時發生了什么,它實際上是從它的超類擴展方法

[英]JAVA: what happend when i call a getter method of a object which actually extend the method from it's superClass

我有兩個 class

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());
    }
}

  1. 代碼 teacher.getName() 的 output 是 "person" 為什么?

**無論名稱屬性的修改是私有的還是公共的,結果始終是“人”,但到目前為止我所學到的告訴我,如果子類從超類擴展,它也會包含超類的方法,所以當我調用該方法時子類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,那么您需要執行以下操作之一:

  1. 使變量protected (僅對 class 及其子類可見),並在子類的構造函數中對其進行賦值。 或者,
  2. 在你的基礎 class 中公開一個 setter function,並在你的構造函數中調用它。 如果您想限制對子類的訪問並且不允許 package 之外的類修改它,則可以保護它。 或者,
  3. 只需覆蓋子類中的 getter function,以便它返回子類的私有變量。 (此外,如果您不需要該值是可變的,您可以簡單地return "teacher"; )。 如果這樣做,請記住您正在分配一個碰巧共享相同名稱的變量; 它與 state 的基類視圖不同。
  4. (編輯添加)您還可以使邏輯在基類 class 構造函數中設置名稱,並在任何基類中調用super(name) ,就像@tgdavies 所做的那樣。 如果設置名稱是所有子類的一個相當關鍵的行為,這個解決方案連同上面的#1 和#2,確保名稱只有一個真實來源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM