- 相關(guān)推薦
Java常見(jiàn)誤區與細節有哪些呢
Java的常見(jiàn)誤區與細節有哪些呢?看了下面的內容相信你就會(huì )清楚了。更多內容請關(guān)注應屆畢業(yè)生考試網(wǎng)!
一Java語(yǔ)言基礎中的誤區
1 在Java中,沒(méi)有 goto語(yǔ)句。因為大量使用 goto語(yǔ)句會(huì )降低程序的可讀性和可維護性,所以Java語(yǔ)言取消了 goto的使用。同時(shí),為了避免程序員自行使用 goto所帶來(lái)的混亂,Java語(yǔ)言仍將 goto定義為一個(gè)關(guān)鍵字,但是沒(méi)有定義任何語(yǔ)法,故稱(chēng)為“保留字”。
2 true、 false和 null在IDE中雖然以不同的顏色顯示了, 但是并不是關(guān)鍵字,而是“字面常量”,就和 String類(lèi)型的 abc一樣。
3 定義名稱(chēng)時(shí)盡量避免使用 $,因為 編譯器在對.java文件進(jìn)行編譯的時(shí)候,會(huì )將”$”編譯成頂層類(lèi)型與底層類(lèi)型的連接符。 見(jiàn)下例:
使用$定義變量名
package com.laixintao.Test;
public class Outer$Inner {
public static void main(String[] args) {
Outer o = new Outer();
Outer.Inner i = o.new Inner();
i.innerPrint();
}
}
class Outer {
class Inner {
void innerPrint() {
System.out.println("Inner Print!");
}
}
}
在編譯( javac Test3.java )這段代碼的時(shí)候,編譯器會(huì )報以下錯誤: Test.java:12: 錯誤: 類(lèi)重復: com.laixintao.Test.Outer.Inner class Inner{ ^
4 Unicode轉義字符處理的非常早,在解析程序之前。 例如:
Unicode編譯錯誤
// char c1 = '\u00a';
// char c2 = '\u00d';
在程序中出現這兩行代碼編譯報錯。這兩個(gè)Unicode碼分別表示”換行”和”回車(chē)”,所以,在編譯器編譯的時(shí)候,代碼是這樣的:
Unicode編譯
// char c1 = '
';
// char c2 = '
';
5 Unicode碼使用16位字符編碼,在Java中用 char類(lèi)型來(lái)表示,F在Unicode已經(jīng)擴展到一百萬(wàn)個(gè)字符,超出16位限制的成為增補字符。 所有增補字符都不能用字符常量來(lái)表示。
6 當 short, byte, char參加運算時(shí),結果為 int型,而非與較高的類(lèi)型相同。
如果變量是 byte, short, byte類(lèi)型,當對其賦予編譯時(shí)期的常量,而該常量又沒(méi)有超過(guò)變量的'取值范圍時(shí),,編譯器就可以進(jìn)行隱式的收縮轉換。這種隱式的收縮轉換是安全的,因為該收縮轉換只適用于變量的賦值,而不適用于方法調用語(yǔ)句,即不適用于方法調用時(shí)的參數傳遞。
7 注意 char類(lèi)型,這是一個(gè)無(wú)符號類(lèi)型。因此, char與 short或 char與 byte之間的轉換必須顯示地使用類(lèi)型轉換。 從 byte到 char的轉換為擴展收縮轉換,該轉換比較特殊,即先將 byte擴展轉換到 int,然后再收縮到 char。
8 在整型數據間的擴展轉換中,如果操作數事 char類(lèi)型(無(wú)符號類(lèi)型),則進(jìn)行無(wú)符號擴展,擴展位為0.如果操作數是 byte, short或 int(有符號類(lèi)型),則進(jìn)行有符號擴展,擴展位為該變量的符號位。
9 整型數據之間的收縮轉換,僅僅是截斷并丟棄高位,不做任何其他處理。 1 0.1+0.2不等于0.3.System.out.println((double)0.1+(double)0.2);這條語(yǔ)句的輸出結果是 / /http://www.pprar.com 0.30000000000000004。因為計算機使用二進(jìn)制來(lái)存儲數據,而很多小數都不能夠準確地使用二進(jìn)制來(lái)表示(事實(shí)上,大多數地小數都是近似的),就像使用十進(jìn)制小數不能準確地表示1/3這樣地分數一樣。大多數地浮點(diǎn)型,在計算機中只是近似地存儲其值,而不像整型那樣準確地存儲。又例,這是一個(gè)死循環(huán): for(float f = 10.1f;f != 11;f+=0.1f){}
10 float類(lèi)型可以保留7~8個(gè)有效數字,而 double類(lèi)型可以保留15~16個(gè)有效數字,因而當 int類(lèi)型或long類(lèi)型數值多于 double或 float地有效數字時(shí),該值的一些最低有效位就會(huì )丟失,從而造成精度丟失,這時(shí),就會(huì )采用IEEE754最近舍入模式,提取與該整型值最接近的浮點(diǎn)值。 盡管整型向浮點(diǎn)型的轉換屬于擴展轉換,但當數值很大或很小(絕對值很大)時(shí),就會(huì )產(chǎn)生一定的精度丟失。
11 i+++j如何計算?(這個(gè)問(wèn)題在C/C++)中討論是沒(méi)有多大意義的,因為C/C++依賴(lài)于實(shí)現的硬件結構,不同的環(huán)境結果也會(huì )不同。不過(guò)在Java中,這個(gè)結果是固定的,不受其運行的硬件環(huán)境與平臺的影響) 答:根據貪心規則,前置++優(yōu)于后置++,結果是 (i++)+j
12 i++和++i其實(shí)都是先+1,再賦值。++i,沒(méi)什么好說(shuō)的;i++,以 j=i++;為例在底層的實(shí)現是: temp = i;i = i + 1; j = temp; 所以, i=15;i=i++;這個(gè)表達式的結果是15.(因為加一之后又執行了一次賦值,從16變回15)
13 +0與-0在浮點(diǎn)類(lèi)型變量存儲中,符號位是不同的。當-0和+0參與浮點(diǎn)類(lèi)型的相關(guān)運算(例如相除與求余運算)時(shí),可以產(chǎn)生不同的結果。
14 浮點(diǎn)的相除與求余運算不同與整型的相除與求余運算,當除數為0時(shí),浮點(diǎn)運算不會(huì )產(chǎn)生 ArithmeticException異常。
二、Java面向對象中的誤區
15 String類(lèi)是非可變類(lèi),其對象一旦創(chuàng )建,就不可銷(xiāo)毀。 String類(lèi)那些看似修改字符序列的方法實(shí)際上都是返回新創(chuàng )建的 String對象,而不是修改自身對象。
16 由于 String對象是不可改變的,因此具有線(xiàn)程安全性,可以自由地實(shí)現共享。
17 在 String類(lèi)內部,是使用一個(gè)字符數組( char[])來(lái)維護字符序列的。 String的最大長(cháng)度也就是字符數組的最大長(cháng)度,理論上最大長(cháng)度為int類(lèi)型的最大值,即2147483647.在實(shí)際中,一般可獲取的最大值小于理論最大值。
18 main()方法在表現行為上,與其他方法基本相同,可以重載,由其他方法調用,繼承,隱藏,也可以?huà)伋霎惓,帶有?lèi)型參數。我們也可以在一個(gè)程序中通過(guò)反射來(lái)調用 main方法 (或其他方法)。 2當兩個(gè)或多個(gè)方法的名稱(chēng)相同,而參數列表不同時(shí),這幾個(gè)方法就構成了重載。重載方法可以根據參數列表對應的類(lèi)型與參數的個(gè)數來(lái)區分,但是,參數的名稱(chēng)、方法的返回類(lèi)型,方法的異常列表與類(lèi)型參數不能作為區分重載方法的條件。
19 究竟選擇哪個(gè)方法調用,順序是這樣的:
在第一階段,自動(dòng)裝箱(拆箱)與可變參數不予考慮,搜索對應形參類(lèi)型可以匹配實(shí)參類(lèi)型并且形參個(gè)數與實(shí)參個(gè)數相同的方法;
如果在步驟一不存在符合條件的方法,在第二階段,自動(dòng)裝箱與拆箱將會(huì )執行。
如果在步驟二中不存在符合條件的方法,在第三階段,可變參數的方法將會(huì )考慮。
如果3個(gè)階段都沒(méi)有搜索到符合條件的方法,將會(huì )產(chǎn)生編譯錯誤。如果如何條件的方法多于一個(gè),將會(huì )選擇最明確的方法。最明確的方法定義為:如果A方法的形參列表類(lèi)型對應的都可以賦值給B方法的形參列表類(lèi)型,則A方法比B方法明確。如果無(wú)法選出最明確的方法,則會(huì )產(chǎn)生編譯錯誤。
20 重寫(xiě)和隱藏的.本質(zhì)區別是:重寫(xiě)是動(dòng)態(tài)綁定的,根據運行時(shí)引用所指向對象的實(shí)際類(lèi)型來(lái)決定調用相關(guān)類(lèi)的成員。而隱藏是靜態(tài)綁定的,根據編譯時(shí)引用的靜態(tài)類(lèi)型來(lái)決定調用的相關(guān)成員。換句話(huà)說(shuō),如果子類(lèi)重寫(xiě)了父類(lèi)的方法,當父類(lèi)的引用指向子類(lèi)對象時(shí),通過(guò)父類(lèi)的引用調用的是子類(lèi)方法。如果子類(lèi)隱藏了父類(lèi)的方法(成員變量),通過(guò)父類(lèi)的引用調用的仍是父類(lèi)的方法(成員變量)。
21 構造器是遞歸調用的,子類(lèi)的構造器會(huì )調用父類(lèi)的構造器,直到調用Object類(lèi)的構造器為止。
22 構造器沒(méi)有創(chuàng )建對象,構造器是使用new創(chuàng )建對象時(shí)由系統調用的,用來(lái)初始化類(lèi)的實(shí)例成員。從順序上說(shuō),先是創(chuàng )建對象,然后再調用構造器的。 (構造器并沒(méi)有產(chǎn)生新的對象)
23 默認的構造器不為空,該構造器會(huì )調用父類(lèi)的無(wú)參構造器,并可能執行實(shí)例成員變量的初始化。所以,默認的構造器至少調用了父類(lèi)的構造器,它做的工作還可能更多,包括實(shí)例變量聲明初始化與實(shí)例初始化塊,都是在構造器中執行的。
24 當==或!=運算符的兩個(gè)操作數的類(lèi)型一個(gè)是基本數據類(lèi)型,另一個(gè)是包裝類(lèi)引用類(lèi)型時(shí),將引用類(lèi)型拆箱轉換為基本數據類(lèi)型,然后比較兩個(gè)基本數據類(lèi)型的值是否相等。
25 在Java中,數組也是類(lèi),數組聲明的引用變量指向數組類(lèi)型的對象。所有的數組都繼承 Object類(lèi),并且實(shí)現了 java.lang.Cloneable與 java.io.Serializable接口。數組的成員包括變量 length(隱式存在)與從Object類(lèi)繼承的成員。 Cloneable與 Serializable是兩個(gè)標記的接口,這兩個(gè)接口中沒(méi)有顯式聲明任何成員。
三、Java接口中的誤區
26 接口是完全抽象的設計,不能實(shí)例化。使A用 new方式創(chuàng )建的借口類(lèi)型,實(shí)際上是創(chuàng )建了一個(gè)匿名類(lèi),該匿名類(lèi)實(shí)現了接口類(lèi)型。
27 如果兩個(gè)接口聲明了相同的變量x,則當某接口同時(shí)繼承這兩個(gè)接口,或者某類(lèi)同時(shí)實(shí)現這兩個(gè)接口時(shí),通過(guò)簡(jiǎn)單名稱(chēng)訪(fǎng)問(wèn)會(huì )產(chǎn)生編譯錯誤。
28 如果兩個(gè)接口中聲明了相同名稱(chēng)的方法m,并且兩個(gè)方法沒(méi)有構成重載,則當某接口能夠同時(shí)繼承這兩個(gè)接口,或者某類(lèi)能夠同時(shí)繼承這兩個(gè)接口時(shí),必須存在一種方法簽名,使得該簽名同時(shí)為兩個(gè)m方法簽名的'子簽名,并且在方法的返回類(lèi)型上,必須存在一種類(lèi)型,使得該類(lèi)型同時(shí)為兩個(gè)m方法返回類(lèi)型的可替換類(lèi)型。
【Java常見(jiàn)誤區與細節有哪些呢】相關(guān)文章:
Java語(yǔ)言常見(jiàn)名稱(chēng)有哪些02-09
java建模誤區有哪些07-26
常見(jiàn)的統計誤區有哪些07-23
常見(jiàn)的財稅誤區有哪些05-03
Java語(yǔ)言常見(jiàn)的知識點(diǎn)混淆問(wèn)題有哪些03-28
java有哪些優(yōu)勢03-15