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