類中的實例變量,定義時指定初始值和非靜態初始化塊中指定初始值都會在構造塊前執行,並且兩者執行的順序和它們在源代碼中的順序一致。
數組
以下:閉包
第2),3)處的代碼都會在1)處前執行,實際上他們通過編譯器處理以後,2),3)處對應的代碼會被合併到構造器中,而且放在構造器裏面原來的代碼的前面,因此纔會先執行。線程
繼承成員變量和繼承方法的區別。代理
經過例子能夠看出:變量的取值取決於聲明該變量的對象,而方法的行爲則取決於它所實際引用的對象的類型。
對象
3. 爲何內部類中的局部變量要使用final修飾符?繼承
咱們都知道當一個方法中的匿名內部類或局部內部類須要方法方法中的局部變量時,該變量必需要使用final修飾,這跟局部變量的生命週期有關。接口
局部變量的做用域僅在方法內部,方法結束,局部變量也就消失了,可是內部類則可能產生隱式的'閉包',使得局部變量脫離它的方法繼續運行。好比:內部類使用了線程,調用了局部變量,...生命週期
4. HashSet,TreeSet的底層其實也是使用HashMap,TreeMap實現的,全部放在HashSet中的元素實際上由HashMap的key來保存的,而對應的value則是一個PRESENT,一個靜態的Object對象。
作用域
5. 下面的語句建立了幾個字符串對象?字符串
String str = "Hello"+"Java,"+"utest" ;
筆試時可能有遇到的,其實這條代碼就只建立了一個對象,由於str的值能夠在編譯時肯定下來,JVM會在編譯時就計算出str的值「HelloJava,utest」,而後將該字符串放入字符串池中,並讓str指向它 。
6. 靜態方法是屬於類的。
儘管a=null,可是不影響info方法的執行,實際上實例對象調用靜態方法最終仍是轉化成類調用方法。
7. catch塊中若試圖捕獲的異常XxxException是Checked異常,那麼它對應的try必須是有可能拋出XxxException或其子類的異常,不然編譯器將提示改程序編譯錯誤,可是Exception異常除外。
8. 就HashMap來講,若是插入節點時Hash表的節點總數大於「threshold",則會resize這個數組,也就是數組大小會發生擴容,一般擴容爲原來的2倍,在擴容的過程當中會致使一樣的元素計算出來的下標發生改變,所以須要遍歷原有的Hash表的全部節點,即遍歷每個單向鏈表,每一個節點將按照新的hash表來計算出本身的位置,逐個遷移到新的hash表上,咱們一般把這個過程叫作rehash過程。
9. JDK動態代理在生成動態字節碼時,並非經過實現類建立子類的方式,而是經過類所擁有的接口列表來完成的。也就是說,構造出來的類和實際的實現類一點關係都沒有,是一個徹底獨立的類,只有接口的方法名和原始對象的方法名相同而已。
10. Set底層是使用Map實現的,key爲Set添加的對象,value爲Object。