作者:卡瓦邦噶
http://www.kawabangga.com/posts/568
1、在Java中,沒有goto陳述句,因為大量使用goto陳述句會降低程式的可讀性和可維護性,所以Java語言取消了goto的使用,同時,為了避免程式員自行使用goto所帶來的混亂,Java語言仍將goto定義為一個關鍵字,但是沒有定義任何語法,故稱為“保留字”,
2 true、false和null在IDE中雖然以不同的顏色顯示,但是并不是關鍵字,而是“字面常量”,就和String型別的abc一樣,
3 定義名稱時盡量避免使用$,因為編譯器在對.java檔案進行編譯的時候,會將”$”編譯成頂層型別與底層型別的連接符,見下例:
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)這段代碼的時候,編譯器會報以下錯誤:Test.java:12: 錯誤: 類重復: com.javastack.Test.Outer.Inner class Inner{ ^
4 Unicode轉義字符處理的非常早,在決議程式之前,例如:
// char c1 = 'u00a';
// char c2 = 'u00d';
在程式中出現這兩行代碼編譯報錯,這兩個Unicode碼分別表示”換行”和”回車”,所以,在編譯器編譯的時候,代碼是這樣的:
// char c1 = '
';
// char c2 = '
';
5 Unicode碼使用16位字符編碼,在Java中用char型別來表示,現在Unicode已經擴展到一百萬個字符,超出16位限制的成為增補字符,所有增補字符都不能用字符常量來表示,
6 當short,byte,char參加運算時,結果為int型,而非與較高的型別相同,如果變數是byte,short,byte型別,當對其賦予編譯時期的常量,而該常量又沒有超過變數的取值范圍時,編譯器就可以進行隱式的收縮轉換,這種隱式的收縮轉換是安全的,因為該收縮轉換只適用于變數的賦值,而不適用于方法呼叫陳述句,即不適用于方法呼叫時的引數傳遞,(詳見java中默認型別轉換的小問題)
7 注意char型別,這是一個無符號型別,因此,char與short或char與byte之間的轉換必須顯示地使用型別轉換, 從byte到char的轉換為擴展收縮轉換,該轉換比較特殊,即先將byte擴展轉換到int,然后再收縮到char,
8 在整型資料間的擴展轉換中,如果運算元是char型別(無符號型別),則進行無符號擴展,擴展位為0.如果運算元是byte,short或int(有符號型別),則進行有符號擴展,擴展位為該變數的符號位,
9 整型資料之間的收縮轉換,僅僅是截斷并丟棄高位,不做任何其他處理,
10 0.1+0.2不等于0.3.System.out.println((double)0.1+(double)0.2);這條陳述句的輸出結果是0.30000000000000004,因為計算機使用二進制來存盤資料,而很多小數都不能夠準確地使用二進制來表示(事實上,大多數地小數都是近似的),就像使用十進制小數不能準確地表示1/3這樣地分數一樣,大多數地浮點型,在計算機中只是近似地存盤其值,而不像整型那樣準確地存盤,又例,這是一個死回圈:for(float f = 10.1f;f != 11;f+=0.1f){}
11 float型別可以保留7~8個有效數字,而double型別可以保留15~16個有效數字,因而當int型別或long型別數值多于double或float地有效數字時,該值的一些最低有效位就會丟失,從而造成精度丟失,這時,就會采用IEEE754最近舍入模式,提取與該整型值最接近的浮點值,盡管整型向浮點型的轉換屬于擴展轉換,但當數值很大或很小(絕對值很大)時,就會產生一定的精度丟失,
12 i+++j如何計算?(這個問題在C/C++)中討論是沒有多大意義的,因為C/C++依賴于實作的硬體結構,不同的環境結果也會不同,不過在Java中,這個結果是固定的,不受其運行的硬體環境與平臺的影響) 答:根據貪心規則,前置++優于后置++,結果是(i++)+j
13 i++和++i其實都是先+1,再賦值,++i,沒什么好說的;i++,以j=i++;為例在底層的實作是:temp = i;i = i + 1; j = temp; 所以,i=15;i=i++;這個運算式的結果是15.(因為加一之后又執行了一次賦值,從16變回15)
14 +0與-0在浮點型別變數存盤中,符號位是不同的,當-0和+0參與浮點型別的相關運算(例如相除與求余運算)時,可以產生不同的結果,
15 浮點的相除與求余運算不同與整型的相除與求余運算,當除數為0時,浮點運算不會產生ArithmeticException例外,
16 String類是非可變類,其物件一旦創建,就不可銷毀,String類那些看似修改字符序列的方法實際上都是回傳新創建的String物件,而不是修改自身物件,
17 由于String物件是不可改變的,因此具有執行緒安全性,可以自由地實作共享,
18 在String類內部,是使用一個字符陣列(char[])來維護字符序列的,String的最大長度也就是字符陣列的最大長度,理論上最大長度為int型別的最大值,即2147483647.在實際中,一般可獲取的最大值小于理論最大值,
19 main()方法在表現行為上,與其他方法基本相同,可以多載,由其他方法呼叫,繼承,隱藏,也可以拋出例外,帶有型別引數,我們也可以在一個程式中通過反射來呼叫main方法(或其他方法),
20 當兩個或多個方法的名稱相同,而引數串列不同時,這幾個方法就構成了多載,多載方法可以根據引數串列對應的型別與引數的個數來區分,但是,引數的名稱、方法的回傳型別,方法的例外串列與型別引數不能作為區分多載方法的條件,
21 究竟選擇哪個方法呼叫,順序是這樣的:
-
在第一階段,自動裝箱(拆箱)與可變引數不予考慮,搜索對應形參型別可以匹配實參型別并且形參個數與實參個數相同的方法;
-
如果在步驟一不存在符合條件的方法,在第二階段,自動裝箱與拆箱將會執行,
-
如果在步驟二中不存在符合條件的方法,在第三階段,可變引數的方法將會考慮,
-
如果3個階段都沒有搜索到符合條件的方法,將會產生編譯錯誤,如果如何條件的方法多于一個,將會選擇最明確的方法,最明確的方法定義為:如果A方法的形參串列型別對應的都可以賦值給B方法的形參串列型別,則A方法比B方法明確,如果無法選出最明確的方法,則會產生編譯錯誤,
22 重寫和隱藏的本質區別是:重寫是動態系結的,根據運行時參考所指向物件的實際型別來決定呼叫相關類的成員,而隱藏是靜態系結的,根據編譯時參考的靜態型別來決定呼叫的相關成員,換句話說,如果子類重寫了父類的方法,當父類的參考指向子類物件時,通過父類的參考呼叫的是子類方法,如果子類隱藏了父類的方法(成員變數),通過父類的參考呼叫的仍是父類的方法(成員變數),
23 構造器是遞回呼叫的,子類的構造器會呼叫父類的構造器,直到呼叫Object類的構造器為止,
24 構造器沒有創建物件,構造器是使用new創建物件時由系統呼叫的,用來初始化類的實體成員,從順序上說,先是創建物件,然后再呼叫構造器的,(構造器并沒有產生新的物件)
25 默認的構造器不為空,該構造器會呼叫父類的無參構造器,并可能執行實體成員變數的初始化,所以,默認的構造器至少呼叫了父類的構造器,它做的作業還可能更多,包括實體變數宣告初始化與實體初始化塊,都是在構造器中執行的,
26 當==或!=運算子的兩個運算元的型別一個是基本資料型別,另一個是包裝類參考型別時,將參考型別拆箱轉換為基本資料型別,然后比較兩個基本資料型別的值是否相等,
27 在Java中,陣列也是類,陣列宣告的參考變數指向陣列型別的物件,所有的陣列都繼承Object類,并且實作了java.lang.Cloneable與java.io.Serializable介面,陣列的成員包括變數length(隱式存在)與從Object類繼承的成員,Cloneable與Serializable是兩個標記的介面,這兩個介面中沒有顯式宣告任何成員,
28 介面是完全抽象的設計,不能實體化,使A用new方式創建的借口型別,實際上是創建了一個匿名類,該匿名類實作了介面型別,
29 如果兩個介面宣告了相同的變數x,則當某介面同時繼承這兩個介面,或者某類同時實作這兩個介面時,通過簡單名稱訪問會產生編譯錯誤,
30 如果兩個介面中宣告了相同名稱的方法m,并且兩個方法沒有構成多載,則當某介面能夠同時繼承這兩個介面,或者某類能夠同時繼承這兩個介面時,必須存在一種方法簽名,使得該簽名同時為兩個m方法簽名的子簽名,并且在方法的回傳型別上,必須存在一種型別,使得該型別同時為兩個m方法回傳型別的可替換型別,
推薦去我的博客閱讀更多:
1.Java JVM、集合、多執行緒、新特性系列教程
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
4.Java、后端、架構、阿里巴巴等大廠最新面試題
覺得不錯,別忘了點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/168188.html
標籤:Java
下一篇:C++使用set集合的問題
