更新時間:2020-03-31 09:55:41 來源:動力節點 瀏覽4539次
如今正是金三銀四的好時機,企業招聘已經陸續開始了,小編在這關鍵時刻為你匯總Java面試題,有了小編的面試法寶讓你參加Java面試更輕松。
什么情況下會觸發類的初始化?
(1)、遇到 new, getstatic, putstatic, invokestatic 這4條字節碼指令。
(2)、使用 java.lang.reflect 包的方法對類進行反射調用。
(3)、初始化一個類的時候,如果發現其父類還沒有進行過初始化,則先初始化其父類(注意:
如果是接口的話,則不要求初始化父類)。
(4)、當虛擬機啟動時,用戶需要指定一個要執行的主類(包含 main()方法的那個類),虛擬機會先初始化這個主類。
(5)、當使用JDK 1.7 的動態語言支持時,如果一個 java.lang.invoke.MethodHandle 實例最后的解析結果 REF_getstatic, REF_putstatic, REF_invokeStatic的方法句柄,并且這個方法句柄所對應的類沒有進行過初始化,則先觸發其初始化。
外加幾種不會初始化的例子:
(1)、同類子類引用父類的靜態字段,不會導致子類初始化。至于是否會觸發子類的加載和驗證,則取決于虛擬機的具體實現。
(2)、通過數組定義來引用類,也不會觸發類的初始化。例如下面這個語句:
1Animal[] a = new Animao[10];
并不會觸發 Animal 類的初始化。
(3)、引用一個類的常量也不會觸發初始化。
談談你對解析與分派的認識。
1.方法在程序真正運行之前就有一個可確定的調用版本,并且這個方法的調用版本在運行期間是不可變的,即“編譯時可知,運行不可以變”,這類目標的方法的調用稱之為解析。
Java 語言中符合“編譯器可知,運行期不可變”這個要求的方法,主要包括靜態方法和私有方法兩大類。
2.解析調用一定是個靜態的過程,在編譯期就完全確定,在類加載的解析階段就將涉及的符號引用全部轉變為可以確定的直接引用,不會延遲到運行期再去完成。而分派(Dispatch)調用則可能是靜態的也可能是動態的。于是分派方式就有靜態分派和動態分派。
如何?定義?個類加載器?你使?過哪些或者你在什么場景下需要?個?定義的類加載器嗎?
可以把自己自定義的類加載器繼承 ClassLoader,然后重寫 findClass() 方法,把自己的類加載邏輯寫到 findClass() 方法中去。
使用類加載器的場景:
加載特定路徑的 class 文件
熱部署加載 class 文件
從網絡中加載一個加密的 class 文件
java中 == 和equals() 和 hashCode() 的區別
(1)、== 是運算符,a == b 比較的是 a,b的數值是否相等。
(2)、equals 是 Object 類的一個方法,默認情況下比較兩個對象是否是同一個對象,內部的實現是通過 == 來比較兩個對象的內存地址是否相等,其源碼如下
1 public boolean equals(Object obj) {2 return (this == obj);3 }
如果想比較兩個對象的其他內容,則可以通過重寫 equals方法,例如 String 類就重寫了 equals 方法,改成了對象的內容是否相等。
(3)、hashCode 也是Object 類的一個方法,返回值是該對象的哈希碼,同一個對象的哈希碼一定相等,但不同對象的哈希碼也是有可能相等的。
(4)、hashCode() 與 equals() 的關系:如果兩個對象根據 equals() 方法比較相等,那么這兩個對象的 hashCode() 返回值一定相等;如果兩個對象根據 equals() 方法比較不相等,那么這兩個對象的 hashCode() 返回值不一定不相等
int與integer的區別
int 是一個基本數值類型,Integer 是一個對象,Integer 是 int 的一個包裝類型,兩者可以通過拆箱和裝箱自動轉換。
拓展一下:
1Integer a, b;
對于 a == b,比較的是 a 與 b 是否是同一個對象,但是如果運算符 == 左右兩邊算術運算的話,則 a,b會自動拆箱成 int 類型來進行比較。
以上就是動力節點java培訓機構的小編針對“2020年Java面試題及答案匯總”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習