编写高质量代码:改善Java的151个建议五(类、对象、方法)31-51
該書籍PDF下載地址:http://download.csdn.net/download/muyeju/10001473
31.接口中不要存在實現代碼
接口中不能存在實現代碼(雖然可以實現,但是如果把實現代碼寫在接口中,那么接口就綁定了可能變化的因素,這就導致實現不在文檔和可靠,是隨時可能被拋棄,被修改,被重構的)
package jsontest;public class Salary {public static void main(String[] args) {B.a.doSomething();} }interface A{public void doSomething() ; }interface B{public static final A a = new A() {public void doSomething() {System.out.println("---------接口中的實現方法");}}; }32.靜態變量一定要先聲明后賦值
靜態變量的加載過程:靜態變量是類初始化時首先被加載的,JVM會去查找類中的所有靜態聲明,然后分配空間,這時候只是完成了地址的分配,還沒有賦值,JVM會根據類中的靜態賦值(靜態類賦值和靜態塊賦值)的先后順序來執行。靜態變量在內存中只有一個拷貝,其后的所以賦值操作都是改變其值,地址不會改變。
33.不要覆寫靜態方法(可以隱藏)
一個實例對象有2個類型,表面類型和實際類型,表面類型是聲明時的類型,實際類型是對象產生時的類型。對于非靜態方法,它是根據對象的實際類型來執行的。而對于靜態方法,一方面靜態方法不依賴實例對象,它是通過類名訪問的;其次可以通過對象訪問靜態方法,如果是通過對象調用靜態方法,JVM會通過對象的表面類型查找靜態方法的入口。
隱藏:在子類中構建與父類相同的方法名、輸入參數、輸出參數、訪問權限、并且父類和子類都是靜態方法,此種行為叫隱藏
隱藏和覆寫的區別:
1.隱藏用于靜態方法,覆寫用于非靜態方法,隱藏沒有@Override
2.隱藏的目地是拋棄父類方法,重現子類方法。而覆寫則是增加或虛弱父類的行為,延續父類的職責
注:通過實例方法訪問靜態方法靜態屬性不是好習慣,給代碼帶來了壞問道,建議戒之
34.構造函數盡量簡單
子類實例化的過程:首先初始化父類的變量,然后調用父類的構造方法,再初始化子類的變量,然后調用子類的構造方法,最后生成實例對象
35.不要在構造函數中初始化其它類
36.使用構造代碼塊精煉程序
構造代碼塊:在類中沒有任何前綴和后綴,并使用{}括起來的代碼片段
構造代碼塊會在每個構造函數內首先執行(需要注意的是:構造代碼塊不是在構造函數之前運行的,它依托于構造函數的執行)
使用場景:
初始化實例變量:如果每個構造函數都要初始化變量,可以通過構造代碼塊實現
初始化實例環境
37.構造代碼塊會想你所想
java編譯器會把構造代碼塊插入到每一個構造函數中,但是如果遇到this關鍵字,則不插入構造代碼塊
38.使用靜態內部類提高封裝性
靜態內部類:在類中的靜態類就是靜態內部類。
內部類:在類中的類
區別:
靜態內部類只能訪問外部類的靜態方法和靜態屬性,而內部類有外部類的引用,可以自由訪問
靜態內部類獨立于外部類存在,而內部類不能脫離外部類存在
普通內部類中,不能聲明static的屬性和方法,而靜態內部類沒有任何限制
39.使用匿名類的構造函數
匿名類的構造函數用構造函數塊來代替
例:Apple a = new Apple{{}}
40.匿名類的構造函數很特殊
41.讓多重繼承成為現實
通過內部類實現(內部類去繼承需要的類)
42.讓工具類不可實例化
保證工具類只能通過類名訪問,不能通過實例對象訪問。(工具類里面的屬性和方法都設為靜態的)
要保證不能被實例化,就要將該類的構造方法設為私有,同時在拋異常。
例:
public class DatesUtil {private DatesUtil(){throw new Error("不要實例化我,請通過類名調用") ;} }43.避免對象的淺拷貝
類實現了Cloneable接口就具備了拷貝的能力,然后覆寫clone方法就完全具備拷貝的能力
Object提供了一個對象的默認拷貝方法,即super.clone(),該方法有缺陷,是一種淺拷貝方式,它是有選擇性的拷貝,規則如下:
1.基本類型只拷貝值
2.對象拷貝地址引用
3.String對象拷貝的是地址引用,但是修改值時它會從字符串池中重新生成新的字符串,原來的字符串保持不變,在此我們可以認為它是一個基本類型
44.推薦使用序列化實現對象的拷貝
類要實現序列化接口,然后調用序列化工具,SerializableUtils.deepCopy方法就可以實現拷貝了
?45-49:實體類中建議重寫toString()、equals()、hashcode()方法
alt+shift+S
equals判斷的時候要考慮null的情況
equals中使用getClass()進行類判斷
重寫toString()是直接打印對象時能看到相關信息,例People [age=20, name=李四, sex=0],不重寫的話就是類似這種jsontest.People@18f0fc6
重寫equals()和hashcode()是判斷是否相等時用到
HashMap的底層機制:是以數組的方式保存Map條目的,其中的關鍵是數組下標的處理機制:依據傳入元素的hashcode的返回值來決定數組的下標,如果數組的位置上已 經有?了Map條目,且與傳入的鍵值相等,則不處理,如果不相等就覆蓋,如果傳入的位置上沒有條目就插入,然后放到Map條目的鏈表中。同理,檢查鍵是否存在,也是根據哈西碼確定位置,然后遍歷查找位置。
50.使用package-info類為包服務(沒細看)
51.不要主動進行垃圾回收
轉載于:https://www.cnblogs.com/-scl/p/7643905.html
總結
以上是生活随笔為你收集整理的编写高质量代码:改善Java的151个建议五(类、对象、方法)31-51的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 09--多线程、进程
- 下一篇: Linux Hbase1.2.6 安装及