java第五至七天學習內容回顧——java白皮書第五章

java學習過程出現第一次滯後,背景:清明節以及持續1周的雨。

  1. 方法簽名=方法名+參數列表。

  2. 在覆蓋方法時需要注意:1.覆蓋後的方法返回類型的兼容性;2.新的方法的可見性必須不低於原方法的可見性。

  3. 這裏有一個因果:每次調用方法都要進行搜索開銷很大,所以 虛擬機 會預先爲 每一個類 建立方法表,使用時直接查表,此外,除了private,static,final方法,所有的方法都是動態鏈接。

  4. 調用 某個方法 的實際解析過程 詳述於白皮書P160;

  5. final 修飾的類將不允許出現繼承,此類中所有的方法都相當於被final修飾,但數據域並不沒有被final修飾。final 修飾的方法將不允許被覆蓋。final 修飾的數據域 相當於const只能被初始化賦值,不能改變。

  6. final 修飾的類或方法的目的:防止目標在子類中改變語義

  7. java中內聯產生條件:代碼簡單、調用頻繁、不會被覆蓋的方法。

  8. 對於類的類型轉換說明事項:a.只能在 繼承層次 中進行。b.子類可以強制轉換爲超類。c.在超類強制轉換爲子類時,應該是失敗。爲代碼嚴謹,在類對象進行類型轉換前應該測試,加上測試 if(需要轉換的變量名 instanceof 需要轉換成的類型名) {轉換成功do}

  9. abstract關鍵字——抽象類,方法。

  10. 抽象類不能存在實例,但可以存在引用,並且這個引用應該引用抽象類的子類實例,因爲抽象類本身不能存在實例。抽象方法只能聲明,不能加上{}進行定義,並且需要被abstract修飾。詳述於白皮書P164.

  11. 類即使不含有抽象方法,也可以使用abstract,將其定義爲抽象類;如果子類中依然存在未定義的抽象方法,那麼這個子類需要使用abstract修飾,因此也不能存在實例,這裏與C++不同,在C++中,只要存在純虛函數,這個類就自動變爲抽象類

  12. java中的protect修飾關鍵字,其修飾的內容對兩者可見 a.子類 b.同包中的類,作者曾經提到不推薦使用protect,但確實存在某種情況使用protect更好一些。

  13. Object 類是java種所有類的子類,其中需要注意java的數組無論是基本類型還是對象數組,應該視作爲某個類,所以它們也是Object的子類。

  14. 這裏有一個因果:因爲13,所以,Object類型的變量可以引用任何類的對象實例,這裏需要注意,在引用後的使用過程中很有可能使用(強制類型轉換)來使用原本類的某些方法。這裏有一個補充說明:java中,只有基本類型不屬於類對象。這裏有一個與C++的對比:C++中不存在根類(類似JAVA中的Object),但存在一種指針(void*),任何類型的指針都可以強制轉換爲此類指針。

  15. Object 類中的equals方法,只是檢測兩個對象是否引用的同一實例而已,並沒有進行真正意義上的根據數據域進行對比得出結論。這裏有一個改進:雖然a.equals(b)可能實現a與b的引用地址的比較,但是二者可能有null的存在,所以使用靜態方法Objects.equals(a,b)可以預防這種現象,該方法返回值:當a=b=null時爲true;a,b有一個是null時爲false,否則調用a.equals(b)並返回相應結構。

  16. 在子類中(如果需要的話)對超類equals進行覆蓋時,需要先用超類的equals方法進行檢測,然後再對比子類中的特有數據域。詳述與白皮書P170,對於equals方法的重定義規範,詳述於P179~P173;

  17. 對於數組的處理總是特殊的,其中數組equals方法更應該利用Arrays.equals靜態方法

  18. 這裏有一個小技巧:在覆蓋超類方法的前頭加上@Override 可以用於檢測 覆蓋失敗而是添加了一個無關方法(這種情況的產生是由於 參數列表錯誤)。

  19. 每個類對象都有一個散列碼(所以數組也有),使用hashcode()方法或者hash方法或者自定義的方法得到。其中String類的散列碼的計算與其內容有關,所以內容相同的String對象導出的散列碼相同,StringBuffer類 並沒有覆蓋hashcode方法,所以使用的是Object方法,所以得到的是地址信息。這裏有一個注意:如果覆蓋額equals方法,就必須同時覆蓋掉hashcode方法,這裏可以看出調用hashcode方法是需要 (對象名).hashcode(),這樣做是爲了用戶可以將對象插入散列表。所以這裏還有一個注意,equals中利用到的判斷是否相等的數據域,新hashcode方法需要同樣使用它們作爲參數用於計算,對於基本類型參數無法調用.hashcode,可以通過裝箱調用,也可以使用Object靜態方法hash()計算,詳述於白皮書p175。數組對象Arrays.hashcod()方法。

  20. 可以使用getClass().getName()得到對象的類型名,每個Object類都有一個toString方法,用於顯示數據域,達到輔助測試的效果,可以有兩種方式調用,a.x.toString(),直接通過對象變量名調用,b.“”+x,自動調用x.toString,然後與“"相連接,此外,.println(x)中,將自動調用x的toString方法。對於數組對象,使用靜態方法Arrays.toString,作者建議爲每一個自定義類添加toString方法,用於反應狀態域信息。對於多維數組,使用Arrays.deepToString()靜態方法

  21. 使用getSuperClass方法可以得到超類信息。

  22. 泛型數組列表:在添加刪除數組元素時有自動調節數組長度的功能,其中設計到菱形語法。詳述於P181,白皮書。ArrayList<類型名> 變量名 = new ArrayList<可添入類型名>();變量名.add()添加元素,變量名.size()返回數組列表容量,變量名.ensureCapacity(數量),以及一些具體使用方法詳述於P181,白皮書。這裏需要注意一點,所涉及的索引i是包括0在內的,所以使用時需要將索引與真實數組索引等同。,toArray方法可以將數組列表中的內容導出到數組中。

  23. 對象包裝器與自動裝箱 P187白皮書,以及可以修改數值參數的方法是通過holder類型變量,例如IntHolder類型。

  24. 類型化數組列表與原始數組列表之間的兼容問題,詳述於P186,白皮書。

  25. 變參方法,詳述於P190,實際上,printf接收兩個參數,1個是格式字符串,另一個是Object[]數組,如果在Object[]數組中存在基本類型,那麼將會自動裝箱。最後一個參數是數組的方法,可以被重定義爲變參方法,但不需要破壞現有代碼。

  26. 枚舉類型/類 ,詳述於P191,可以使用==判斷兩個枚舉類型變量是否相同,因爲這兩個都是引用枚舉類型常量的地址,沒有創建新的實例,所以可以通過地址來判斷是否相同。

  27. .常量名.toString得到常量名,變量=Enum.valueOf(枚舉類型名.class,枚舉常量名),設置變量爲特定枚舉常量,每一個枚舉類型都包含values方法,該方法返回該類中的所有枚舉常量,注意用枚舉類型的數組接收,ordinal是枚舉類型常量的方法,返回該常量的值(位置,從0開始)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章