目錄java
有個小故事,今天羣裏面有我的問下面如圖輸出什麼?git
我回答:60。但這是錯的,答案結果是 40 。我知錯能改,而後說了下父子類變量不建議同一個名稱。github
可見,父子變量名相同會使人 「Confusing」。再舉個例子,新建 ParentClass 類:spring
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
下如圖:springboot
debug 後,答案顯然:微信
son
和 parent
兩個 String 的對應指針數同樣,一個爲 440/一個爲 439這就引出了變量的知識點,如手工畫的圖:socket
阿里巴巴 Java 手冊是這樣寫的:學習
【強制】避免在子父類的成員變量之間或者不一樣代碼塊的局部變量之間採用徹底相同的命名方式,那會致使代碼可讀性下降。編碼
說明:子類、父類成員變量名相同,即便屬性是 public 也是能經過編譯,雖然局部變量不在同一方法內的不一樣代碼中同名也是合法的,但避免使用。 setter / getter 的參數名稱也避免成員變量名相同。
具體的反例我也不寫了。爲啥強制,顯而易見有幾點:
正確的例子 ParentClass 類:
public class ParentClass { public String parentName = "parent"; public static void main(String[] args) { ParentClass parentClass = new SonClass(); SonClass sonClass = new SonClass(); System.out.println("parentClass.parentName = " + parentClass.parentName); System.out.println("sonClass.sonName = " + sonClass.sonName); System.out.println("debug..."); } } class SonClass extends ParentClass { public String sonName = "son"; }
兩種寫法的優缺點,一目瞭然。
這裏是說了一種代碼風格,相似味道。自己不影響程序運行,沒有所謂的潛在故障和錯誤。那麼味道的好處總會能體驗到。
* 好比這裏談到繼承,OOP 講究:高內聚,低耦合;多組合,少繼承。好比控制語句,推薦多層嵌套不超過 3 層。那繼承也同樣:推薦繼承關係不超過 3 層。
* 還有 Boolean 成員變量定義,命名不要加 is 前綴。否則 getter 方法會少了 is,部分解析會引發序列化問題。個人作法:在設計數據庫表字段的時候,不考慮 Boolean ,用 Byte 類型去處理。這樣 is 不 is 就不 care 了。
* ...
好的命名規約,好的編碼風格,簡捷清爽,引出無限風光
本文示例讀者能夠經過查看下面倉庫的中的 alibaba/java/ParentClass.java :
若是您對這些感興趣,歡迎 star、follow、收藏、轉發給予支持!