阿里 Java 手冊系列教程:為啥強制子類、父類變量名不同?

摘要: 原創出處 https://www.bysocket.com 「公眾號:泥瓦匠BYSocket 」歡迎關注和轉載,保留摘要,謝謝!

目錄

  1. 父子類變量名相同會咋樣?
  2. 為啥強制子類、父類變量名不同?
  3. 可落地項目小思考

一、父子類變量名相同會咋樣?

有個小故事,今天群里面有個人問下面如圖輸出什么?

file

我回答:60。但這是錯的,答案結果是 40 。我知錯能改,然后說了下父子類變量不建議同一個名稱。

可見,父子變量名相同會令人 “Confusing”。再舉個例子,新建 ParentClass 類:

public class ParentClass {
    public String name = "parent";

    public static void main(String[] args) {
        ParentClass parentClass = new SonClass();
        SonClass sonClass = new SonClass();

        System.out.println("parentClass.name = " + parentClass.name);
        System.out.println("sonClass.name = " + sonClass.name);
        System.out.println("debug...");
    }
}

class SonClass extends ParentClass {
    public String name = "son";
}

上面如果答對的,這個肯定知道結果。運行程序打印如下:

parentClass.name = parent
sonClass.name = son
debug...

斷點到 System.out.println("debug..."); 該行,debug 下如圖:

file

debug 后,答案顯然:

  • 前面兩行,new 出來兩個不同 SonClass 實例
  • 每個實例都會有子類的成員變量以及父類的成員變量,這個叫做實例變量
  • 如果是 String 的值,都會指向 JVM 常量池。所以看出 son 和 parent 兩個 String 的對應指針數一樣,一個為 440/一個為 439

這就引出了變量的知識點,如手工畫的圖:

file

二、為啥強制子類、父類變量名不同?

阿里巴巴 Java 手冊是這樣寫的:

【強制】避免在子父類的成員變量之間或者不同代碼塊的局部變量之間采用完全相同的命名方式,那會導致代碼可讀性降低。

說明:子類、父類成員變量名相同,即使屬性是 public 也是能通過編譯,雖然局部變量不在同一方法內的不同代碼中同名也是合法的,但避免使用。 setter / getter 的參數名稱也避免成員變量名相同。

具體的反例我也不寫了。為啥強制,顯而易見有幾