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

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

目錄java

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

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

有個小故事,今天羣裏面有我的問下面如圖輸出什麼?git

file

我回答: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

file

debug 後,答案顯然:微信

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

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

file

2、爲啥強制子類、父類變量名不一樣?

阿里巴巴 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"; } 

兩種寫法的優缺點,一目瞭然。

3、可落地小總結

這裏是說了一種代碼風格,相似味道。自己不影響程序運行,沒有所謂的潛在故障和錯誤。那麼味道的好處總會能體驗到。
* 好比這裏談到繼承,OOP 講究:高內聚,低耦合;多組合,少繼承。好比控制語句,推薦多層嵌套不超過 3 層。那繼承也同樣:推薦繼承關係不超過 3 層。
* 還有 Boolean 成員變量定義,命名不要加 is 前綴。否則 getter 方法會少了 is,部分解析會引發序列化問題。個人作法:在設計數據庫表字段的時候,不考慮 Boolean ,用 Byte 類型去處理。這樣 is 不 is 就不 care 了。
* ...

好的命名規約,好的編碼風格,簡捷清爽,引出無限風光

代碼示例

本文示例讀者能夠經過查看下面倉庫的中的 alibaba/java/ParentClass.java :

若是您對這些感興趣,歡迎 star、follow、收藏、轉發給予支持!

參考資料

  • 阿里 Java 手冊系列教程:https://www.bysocket.com/archives/2100
  • 《阿里巴巴 Java 開發手冊》

如下專題教程也許您會有興趣

  (關注微信公衆號,領取 Java 精選乾貨學習資料)
相關文章
相關標籤/搜索