Java的常見誤區和細節

1  定義名稱時儘量避免使用$,因爲編譯器在對.java文件進行編譯的時候,會將”$”編譯成頂層類型與底層類型的連接符。

2  當shortbytechar參加運算時,結果爲int型,而非與較高的類型相同。如果變量是byteshortbyte類型,當對其賦予編譯時期的常量,而該常量又沒有超過變量的取值範圍時,編譯器就可以進行隱式的收縮轉換。這種隱式的收縮轉換是安全的,因爲該收縮轉換隻適用於變量的賦值,而不適用於方法調用語句,即不適用於方法調用時的參數傳遞。

3  注意char類型,這是一個無符號類型。因此,charshortcharbyte之間的轉換必須顯示地使用類型轉換。 從bytechar的轉換爲擴展收縮轉換,該轉換比較特殊,即先將byte擴展轉換到int,然後再收縮到char

4  0.1+0.2不等於0.3. System .out. println((double)0.1+(double)0.2);這條語句的輸出結果是0.30000000000000004。因爲計算機使用二進制來存儲數據,而很多小數都不能夠準確地使用二進制來表示(事實上,大多數地小數都是近似的),就像使用十進制小數不能準確地表示1/3這樣地分數一樣。大多數地浮點型,在計算機中只是近似地存儲其值,而不像整型那樣準確地存儲。又例,這是一個死循環:for(float f = 10.1 f;f != 11;f+=0.1 f){}

5  float類型可以保留7~8個有效數字,而double類型可以保留15~16個有效數字,因而當int類型或long類型數值多於double或float地有效數字時,該值的一些最低有效位就會丟失,從而造成精度丟失,這時,就會採用IEEE754最近舍入模式,提取與該整型值最接近的浮點值。儘管整型向浮點型的轉換屬於擴展轉換,但當數值很大或很小(絕對值很大)時,就會產生一定的精度丟失。

 String類是非可變類,其對象一旦創建,就不可銷燬。String類那些看似修改字符序列的方法實際上都是返回新創建的String對象,而不是修改自身對象。由於String對象是不可改變的,因此具有線程安全性,可以自由地實現共享。

7 當兩個或多個方法的名稱相同,而參數列表不同時,這幾個方法就構成了重載。重載方法可以根據參數列表對應的類型與參數的個數來區分,但是,參數的名稱、方法的返回類型,方法的異常列表與類型參數不能作爲區分重載方法的條件。

究竟選擇哪個方法調用,順序是這樣的:

  • 在第一階段,自動裝箱(拆箱)與可變參數不予考慮,搜索對應形參類型可以匹配實參類型並且形參個數與實參個數相同的方法;

  • 如果在步驟一不存在符合條件的方法,在第二階段,自動裝箱與拆箱將會執行。

  • 如果在步驟二中不存在符合條件的方法,在第三階段,可變參數的方法將會考慮。

  • 如果3個階段都沒有搜索到符合條件的方法,將會產生編譯錯誤。如果如何條件的方法多於一個,將會選擇最明確的方法。最明確的方法定義爲:如果A方法的形參列表類型對應的都可以賦值給B方法的形參列表類型,則A方法比B方法明確。如果無法選出最明確的方法,則會產生編譯錯誤。

8  構造器是遞歸調用的,子類的構造器會調用父類的構造器,直到調用Object類的構造器爲止。

9  構造器沒有創建對象,構造器是使用new創建對象時由系統調用的,用來初始化類的實例成員。從順序上說,先是創建對象,然後再調用構造器的。(構造器並沒有產生新的對象)

10 當==或!=運算符的兩個操作數的類型一個是基本數據類型,另一個是包裝類引用類型時,將引用類型拆箱轉換爲基本數據類型,然後比較兩個基本數據類型的值是否相等。

11 在Java中,數組也是類,數組聲明的引用變量指向數組類型的對象。所有的數組都繼承Object類,並且實現了java . lang. Cloneablejava .io. Serializable接口。數組的成員包括變量length(隱式存在)與從Object類繼承的成員。

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