第五章 繼承

類,超類和子類

  • super和this看似有類似的概念, 但實際沒有可比性,this持有對象自己的引用, 能夠賦值給另外一個變量,super則不具有這樣的功能, 它只是一個指示編譯器調用超類方法的關鍵字
  • 調用super()構造器的語句必須是子類構造器的第一條語句

Object: 全部類的超類

  • 判斷兩個對象是否相等可使用Objects.equals()靜態方法, a.equals(b)的方式若是a=null時會報異常
  • equals()方法的最佳實踐:
    1. 參數命名爲otherObject
    2. 檢測this和otherObject是否引用同一對象, if(this==otherObject) return true;
    3. 檢測otherObject是否爲null,爲null則返回false,if(otherObject==null) return false;
    4. 比較this和otherObject是否爲同一個類,若是equals()的語義在每一個子類中有改變, 就使用getClass()檢測, if(this.getClass()!=otherObject.getClass()) return false; 若是全部子類都有統一的語義, 就使用instanceOf檢測
    5. 將otherObject轉化爲相應的類類型變量,ClassName other = (ClassName)otherObject
    6. 對全部的域進行比較,==比較基本類型,equals比較對象,全部均匹配返回true, 若是子類從新定義了equals(),就要在其中包含調用super.equals(other).數組

  • 若是不想讓子類從新實現equals()方法, 就將其定義爲final, 並在其中實現對象的相等比較邏輯
  • Objects.hashCode()方法能夠進行參數安全檢查,若是參數時null該方法返回0,不然對參數調用hashCode()方法
  • 使用靜態的Double.hashCode()來避免建立Double對象,其餘包裝類也能夠這樣使用
  • Objects.hashCode()提供了多參數方法,因此能夠將多個值傳入計算組合的hashcode.
  • Arrays.toString()能夠打印數組,Arrays.deepToString()能夠打印多維數組安全

泛型數組列表

  • 可使用@SuppressWarnings("unchecked")標註來標記變量可以接受類型轉換

對象包裝器和自動裝箱

  • Java能夠對包裝類進行自動裝箱和拆箱, 這就致使包裝類的行爲有點像基本類型,但對於==比較來講不成立,應該使用equals()方法
  • 另外,裝箱對象可能爲null,null作運算會拋出異常(NullPointerException)
  • 裝箱拆箱時編譯器的行爲,而不是虛擬機,生成class字節碼時由編譯器插入必要的方法.
  • 包裝類時不可變的,也就是做爲參數傳遞的包裝類變量不會在方法內改變

參數數量可變的方法

  • 容許將數組傳遞給可變參數方法的最後一個參數

枚舉類

  • 枚舉類比較使用==便可

反射

  • 不建議使用反射,由於反射的大多實現都須要進行類型轉換,使用直接調用或者lamda更好;另外反射比較脆弱,容易出問題,且出了問題很差查找
相關文章
相關標籤/搜索