Java面試寶典摘抄

 1,ClassLoader知識java

加載流程:當運行一個程序時,JVM啓動,運行bootstrap classloader,該classloader加載Java核心API(此時ExtClassLoader和AppClassLoader也在此時被加載),而後調用ExtClassLoader加載lib/ext中的類,AppClassLoader加載用戶定義的類這就是基本流程編程

ClassLoader和Class.forName的區別:JVM加載類的時候分三步,裝載,鏈接,初始化,        bootstrap

裝載是指JVM找到相應的class文件。在默認狀況下,ClassLoader加載類並不會對類進行解釋和初始化,而Class.forName則在加載的時候對類進行解釋和初始化,也就是說,用Class.forName來加載的類,都應該包含空參數的構造函數緩存

2,函數

 JVM使用的是unicode編碼方法,編碼

 j=j++這個易錯點,由於Java用了中間緩存變量的機制,spa

 java的數值類型的包裝類過分類型轉換。code

3,類型轉換問題對象

system.out.println((a<5)?10.9:9);輸出什麼?答案是9.0,由於前面有一個10.9,因此,會自動轉換爲9.0而不是9。blog

Int i=10;

Char x=’x’;

system.out.println(false?i:x);

system.out.println(false?10:x);

輸出分別爲120,x

緣由:第一個i是變量,因此,i和x都轉換爲int類型了,這時候輸出x的值,120,第二個,java編程規範中提到,當兩個表達式一個是常量,一個是類型T時,而常量表達式可以被T表示時,輸出結果類型爲T,也就是輸出爲x

相似:short x=1;x=x+1;出錯,而shrot x=1;x+=1是正常的

結論:變量二者相加,先提高,而後相加,常量相加,先加法,看結果是否是再賦值的範圍類型內

4, 邏輯字符&|^短路字符「&&」,「||」,「^^」,前者是判斷是符號兩邊的都執行,後者是一旦一個條件符合,則不執行下一個條件判斷

5,Final,finally,finalize的區別

  • Final修飾符,修飾變量表示初始化賦值以後就是常量了,修飾類表示不支持繼承,修飾方法表示不支持重寫
  • Finally是try,catch後面的,catch exception後執行
  • Finalize是垃圾收集器清理對象的功能

6,傳遞和引用

基本原則:不管java參數的類型是什麼,一概傳遞的是參數的副本,若是是值,則傳遞的是值的副本,若是是引用,則傳遞的是引用的副本,而引用是堆內存加棧地址,而這裏傳遞的就是棧地址的副本,傳遞進去以後,若是這個引用改變,則其改變,若new一個新的對象,則這個地址就會指向新的對象,此時,引用的改變不會對原來的引用產生任何影響

7,靜態方法能夠調用非靜態方法或者非靜態變量麼?

能夠,能夠傳遞帶有非靜態變量的對象做爲形參

8,java的IO操做有面向字節和麪向字符兩種方式,面向字節的是以inputstream和outputstream爲後綴的字節流,以reader,writer結尾的都是字符流

具體的類以下圖所示:

9,序列化

實現serializable接口,就是將實現這個街交口的對象轉換爲一組byte,而後往後要用這個對象的時候,能把這些byte數據恢復出來

10,內存管理模塊

內存管理,垃圾回收機制

判斷一塊內存空間是否符合垃圾回收的標準是知足下面兩條中的一條

1,  給對象賦予了空值null,之後再也沒有調用過

2,  給對象賦予了新值,即從新分配了內存空間

典型的內存泄漏緣由以下

1,  全局集合,解決方法,a,週期性的運行某種清除任務,清除不需用的數據,b,使用反向鏈表計數,當反向鏈接數目爲零時,該元素就能夠從集合中移除

2,  緩存,用於快速查找已經執行的操做結果,解決方法,儘可能移除緩存最久的對象

3,  Classloader,

11,Clone方法在object類中,可是須要實現Cloneable接口來實現

12,不經過構造函數也能建立對象麼?能夠

1,  用new語句建立對象,這個最經常使用

2,  運用反射手段,調用java.lang.class,或者java.lang.reflect.Constructor類的newInstance()實例方法

3,  運用對象的clone()方法

4,  運用反序列化手段,調用java.io.objectinputstream對象的readobject()方法

 13,多態中成員訪問特色

  • 成員變量,編譯看左邊,運行也看左邊
  • 成員方法,編譯看左邊,運行但看右邊
  • 靜態方法,編譯看左邊,運行也看左邊,緣由,靜態方法是和類相關的,和對象無關,因此不存在靜態方法的重寫。注意,與類相關,與對象無關
  • 結論,因爲成員方法存在方法重寫,因此,其運行看右邊

針對第三條,最容易犯錯,例如,父類和子類有同一個靜態方法jingtai(),若是father c = new child(),那麼此時c.jingtai()執行的是父類的靜態而不是子類的靜態,這個就按照上面說的,靜態方法與類相關,與對象無關,因此不存在靜態方法的重寫,因此,這個靜態方法是哪一個類的,就調用那個類的靜態方法,很明顯,c是father類的。

14,java接口的注意事項

通俗的講,你認爲要變化的東西,都不能放到接口中,只能放到你的實現中,放在接口中的都是虛方法或者常量。接口是對一類事物的屬性和行爲的更高層次的抽象。對修改關閉,對擴展開放,接口是對開閉原則的一種體現。因此,接口的方法默認是public abstract,接口中不能夠定義變量,只能定義常量,用final來修飾,因此接口的屬性默認是public static final常量,且必須賦初值

15

相關文章
相關標籤/搜索