核心Java面試問題可以幫助您準備基於Java的面試。無論您是新手還是經驗豐富的專業人士,核心Java在任何Java/JEE面試中都扮演著至關重要的角色。
核心Java是大多數面試中最受歡迎的領域,並且在決定您面試結果中起著至關重要的作用。
本帖直接來自於我14年以上的Java編程和大量的面試經驗。Java 16最近已經發布,我已經更新了帖子,包括了一些最新版本的問題。
核心Java面試問題和答案
I have already written a lot about java interview questions for specific topics such as String, Collections, and Multithreading.
這裡我提供了一些重要的Java核心面試問題和答案,你應該知道。在去面試之前,你可以收藏這篇文章來複習知識。
1. Java 14版本的一些重要特性是什麼?
Java 14於2020年3月17日發布。這是一個非LTS版本。一些開發者專用的Java 14特性包括:
- Switch表達式 – JEP 361
- instanceof運算符的模式匹配改進 – 預覽特性,JEP 305
- 有用的NullPointerException消息 – JEP 358
- 文本塊 – 第二次預覽,JEP 368
- Records – 數據類,預覽特性,JEP 359。
2. Java 13版本的一些重要特性是什麼?
Java 13於2019年9月17日發布。這是一個非LTS版本。一些開發者專用的Java 13特性包括:
- 文本塊 – 預覽特性,JEP 355
- 開關表達式 – 預覽功能,JEP 354
- 重新實現Java Sockets API – JEP 353
- 動態CDS存檔 – JEP 350
- FileSystems.newFileSystem() 方法
- 具有命名空間支持的DOM和SAX工廠
- Unicode 12.1 支持
- ZGC 改進以返回未使用的記憶體 – JEP 351
3. 列舉Java 12 發行版的一些重要功能?
Java 12 於 2019 年 3 月 19 日發佈。它是一個非 LTS 版本。一些 Java 12 功能 包括:
- JVM 變更 – JEP 189、JEP 346、JEP 344 和 JEP 230。
- 開關表達式
- 文件不匹配() 方法
- 緊湊數字格式化
- 串流 API 中的 T 操作收集器
- String 類中的新方法
- JEP 334: JVM 常量 API
- JEP 305: instanceof 模式匹配
- 從 JDK 12 中移除了原始字符串文字。
4. Java 11版本的重要功能有哪些?
Java 11是Java 8之后的第二个LTS版本。他们已经改变了许可和支持模型,这意味着如果您下载Java 11 Oracle JDK,将需要为商业用途付费。如果您想使用免费版本,可以从OpenJDK网站下载。
Java 11的一些重要功能包括:
- 我们可以通过
java
命令直接运行Java程序。源文件将隐式编译和执行。这是JEP 330功能实现的一部分。 - String类中添加了6个新方法 – isBlank()、lines()、strip()、stripLeading()、stripTrailing()和repeat()。您可以在我们的Java String类文章中详细了解它们。
- Files类新增了两个读取/写入字符串数据的方法 – readString()和writeString()。
- 我们也可以在lambda表达式中使用“var”。这是JEP 323实现的一部分。
- Epsilon:用于测试环境的No-Op垃圾收集器。这是一个实验性功能,是JEP 318的一部分。
- Java EE和CORBA模块已从标准JDK构建中删除。Nashorn JavaScript引擎也已被弃用。
- 新的HTTP客户端(JEP 321)和飞行记录器(JEP 328)
有关完整概述,请阅读Java 11功能。
5. Java 10发布的重要功能是什么?
Java 10是来自Oracle公司的首次每六个月发布,因此不像早期版本那样是一个主要版本。但是,Java 10的一些重要功能包括:
- 局部变量类型推断
- 增强了java.util.Locale和相关API,以实现BCP 47语言标记的附加Unicode扩展。
- 启用HotSpot VM在用户指定的替代内存设备上分配Java对象堆,例如NV-DIMM。
- 在JDK中提供一组默认的根证书颁发机构(CA)证书。
Java 10主要是一个维护版本,但我特别喜欢局部变量类型推断功能。有关Java 10的详细概述,请参阅Java 10功能。
6. Java 9 發布的重要特性是什麼?
Java 9 是一個重要的版本,帶來了許多功能。其中一些重要特性包括:
- Java 9 REPL (JShell)
- Java 9 模組系統
- 不可變列表、集合、映射和映射項的工廠方法
- 介面中的私有方法
- 反應式流
- 垃圾回收器(Garbage Collector)改進
您可以在Java 9 特性中找到更多詳細信息。
7. Java 8 發布的重要特性是什麼?
Java 8 於 2014 年 3 月發布,因此是 Java 面試問題中的熱門話題之一。如果您清楚地回答了這個問題,將表明您喜歡隨時了解最新的技術。
Java 8 是 Java 5 注釋和泛型之後的一個重大發布。Java 8 的一些重要特性包括:
I strongly recommend to go through above links to get proper understanding of each one of them, also read Java 8 Features.
8.在Java中命名一些面向對象的概念?
Java基於面向對象編程概念,以下是Java編程中實現的一些OOPS概念。
- 抽象化
- 封裝
- 多態性
- 繼承
- 關聯
- 聚合
- 組合
在Java中的OOPS概念中了解更多。
9. Java 的平台獨立性是什麼意思?
平台獨立性意味著您可以在任何操作系統上運行相同的 Java 程式。例如,您可以在 Windows 中編寫 Java 程式,並在 Mac OS 上運行它。
10. 什麼是 JVM?它是否平台獨立?
Java 虛擬機(JVM)是 Java 程式語言的核心。JVM 負責將字節碼轉換為機器可讀的代碼。JVM 不是平台獨立的,這就是為什麼不同操作系統需要不同的 JVM。我們可以使用 Java 選項來自定義 JVM,例如為 JVM 分配最小和最大內存。它被稱為虛擬,是因為它提供的接口不依賴於底層操作系統。
11. JDK 和 JVM 之間的區別是什麼?
Java 開發工具包(JDK)用於開發目的,而 JVM 是其中的一部分,用於執行 Java 程式。
JDK 提供了編譯、調試和執行 Java 程序所需的所有工具、可執行文件和二進制文件。執行部分由 JVM 處理,以提供機器獨立性。
12. JVM 和 JRE 之間有什麼區別?
Java Runtime Environment(JRE)是 JVM 的實現。JRE 包括 JVM 和 Java 二進制文件以及其他類,以成功執行任何程序。JRE 不包含任何開發工具,如 Java 編譯器、調試器等。如果要執行任何 Java 程序,您應該安裝 JRE。
13. 哪個類是所有類的超類?
java.lang.Object
是所有 Java 類的根類,我們不需要擴展它。
14. 為什麼 Java 不支持多重繼承?
Java 不支援類別中的多重繼承,這是因為「鑽石問題」。要了解更多關於鑽石問題的資訊及範例,請閱讀Java 中的多重繼承。
然而,介面中支援多重繼承。介面可以擴展多個介面,因為它們僅聲明方法,實作將存在於實作類別中。所以在介面中並不存在鑽石問題。
15. 為什麼 Java 不是一種純物件導向語言?
Java 不被視為純粹的物件導向,因為它支援像 int、byte、short、long 等原始型別。我認為這使語言編寫起來更加簡單。Java 可以為原始型別提供包裝器物件,但僅僅是為了表示,它們不會提供任何好處。
正如我們所知,對於所有原始型別,我們都有像 Integer、Long 等的包裝器類別,提供一些額外的方法。
16. 路徑和類別路徑變數之間的區別是什麼?
PATH是操作系統使用的環境變量,用於定位可執行文件。這就是為什麼當我們安裝Java或希望任何可執行文件被操作系統找到時,我們需要將目錄位置添加到PATH變量中。如果您使用Windows操作系統,請閱讀此文章以了解如何在Windows上設置PATH變量。
Classpath是Java特有的,由java可執行文件用於定位類文件。我們可以在運行java應用程序時提供類路徑位置,它可以是目錄、ZIP文件、JAR文件等。
main()方法是任何獨立Java應用程序的入口點。main方法的語法是public static void main(String args[])。
Java的main方法是公共的和靜態的,因此Java運行時可以在不初始化類的情況下訪問它。輸入參數是一個字符串數組,通過它我們可以將運行時參數傳遞給Java程序。請查看此文章以了解如何編譯和運行Java程序。
18. 在Java中什麼是方法重載和方法覆寫?
當在同一個類中有多個方法具有相同的名稱但參數不同時,這稱為方法重載。
覆寫的概念是在繼承中出現的,當父類中有一個方法與子類中的另一個方法具有相同的簽名時。我們可以在子類覆蓋的方法中使用@Override註釋,以確保如果父類方法被更改,子類也將被更改。
19. 我們可以重載main()方法嗎?
是的,我們可以在同一個類中有多個名稱為“main”的方法。但是,如果我們運行該類,Java運行時環境將尋找具有語法的主要方法public static void main(String args[])
。
20. 我們能在一個Java源文件中有多個公共類嗎?
在單個Java源文件中,我們不能有多個公共類。一個源文件可以有多個不是公共的類。
21. 什麼是Java套件,預設導入了哪個套件?
Java套件是一種根據功能或模組進行分組的機制,用於組織Java類。Java類的完全分類名包含包名和類名。例如,java.lang.Object
是 java.lang
套件中的 Object
類的完全分類名。
預設導入了 java.lang
套件,我們無需顯式地從此套件導入任何類。
22. Java中的訪問修飾符是什麼?
Java 通過 public、private 和 protected 存取修飾詞關鍵字提供存取控制。當沒有使用這些修飾詞之一時,稱為默認存取修飾詞。
A java class can only have public or default access modifier. Read Java Access Modifiers to learn more about these in detail.
23. 什麼是 final 關鍵字?
final 關鍵字與類一起使用,以確保沒有其他類可以擴展它。例如,String 類是 final 的,我們無法擴展它。
我們可以使用 final 關鍵字與方法一起使用,以確保子類別無法覆蓋它。
Java 的 final 關鍵字可以與變量一起使用,以確保它只能被分配一次。但是變量的狀態可以改變,例如,我們只能將 final 變量分配給對象一次,但對象的變量稍後可以更改。
Java 接口變量默認為 final 和 static。
24. 什麼是 static 關鍵字?
static 關鍵字可與類級變量一起使用,使其成為全局變量,即所有對象將共享相同的變量。
我們也可以將 static 關鍵字與方法一起使用。靜態方法只能訪問類的靜態變量並調用類的靜態方法。
詳細了解java static 關鍵字。
25. 在 Java 中 finally 和 finalize 是什麼?
finally 區塊與 try-catch 一起使用,用於放置您希望始終執行的程式碼,即使 try-catch 區塊拋出異常也是如此。 finally 區塊通常用於釋放在 try 區塊中創建的資源。
finalize() 是 Object 類中的一個特殊方法,我們可以在我們的類中覆寫它。 當物件被垃圾回收器回收時,垃圾回收器會調用此方法。 通常覆寫此方法以在物件被垃圾回收時釋放系統資源。
26. 我們可以將類聲明為 static 嗎?
我們無法將頂級類聲明為 static,但是內部類可以聲明為 static。 如果內部類聲明為 static,則稱為靜態嵌套類。
靜態嵌套類與任何其他頂級類相同,僅用於方便封裝而已。
詳細了解內部類在java 內部類。
27. 靜態導入是什麼?
如果我們必須使用其他類的任何靜態變數或方法,通常我們會導入該類,然後使用類名稱與方法/變數。
我們可以通過僅導入靜態方法或變數,然後將其用於類中,就像它屬於該類一樣來執行相同的操作。
過度使用靜態導入可能會造成混淆,所以最好避免使用它。過度使用靜態導入可能會使您的程序難以閱讀和維護。
28. Java 中的 try-with-resources 是什麼?
Java 7 的一個功能是 try-with-resources 語句,用於自動資源管理。在 Java 7 之前,沒有自動資源管理,我們應該明確地關閉資源。通常,這是在 try-catch 語句的 finally 块中完成的。當我們忘記關閉資源時,這種方法通常會導致內存洩漏。
從Java 7開始,我們可以在try塊內創建資源並使用它。Java會在try-catch塊完成後立即關閉它。詳情請參閱Java自動資源管理。
29. Java中的多捕獲塊是什麼?
Java 7的一項改進是多捕獲塊,其中我們可以在單個catch塊中捕獲多個異常。當每個catch塊具有類似的程式碼時,這使我們的程式碼更短、更清潔。
如果一個catch塊處理多個異常,您可以使用管道(|)將它們分開,而在這種情況下,異常參數(ex)是final的,因此您無法更改它。
詳情請參閱Java多捕獲塊。
30. 靜態塊是什麼?
Java靜態代碼塊是一組語句,在Java ClassLoader將類加載到內存時執行。它用於初始化類的靜態變量。大多數情況下,它用於在類被加載時創建靜態資源。
31. 什麼是接口?
接口是Java編程語言的核心概念,在JDK中被廣泛使用,也被用於Java設計模式,大多數框架和工具。接口提供了一種在Java中實現抽象的方式,並用於定義子類實現的合同。
接口是定義類型並在代碼中創建頂層層次結構的起點。由於Java類可以實現多個接口,因此在大多數情況下最好將接口用作超類。在java接口中了解更多信息。
32. 什麼是抽象類?
抽象類在Java中用於創建具有一些默認方法實現的類供子類使用。抽象類可以有沒有主體的抽象方法,也可以有具體實現的方法。
抽象關鍵字用於創建抽象類。抽象類無法被實例化,主要用於提供子類擴展並實現抽象方法以及覆蓋或使用抽象類中實現的方法。閱讀有關抽象類的重要點,請參閱java抽象類。
33. 抽象類和接口之間有什麼區別?
- 使用抽象關鍵字創建抽象類,而interface是界面的關鍵字。
- 抽象類可以有方法實現,而界面則不能。
- A class can extend only one abstract class but it can implement multiple interfaces.
- 如果抽象類具有main()方法,則可以運行抽象類,而無法運行界面。
更多詳細的差異請參閱抽象類和接口的區別。
34. 一個接口可以實現或擴展另一個接口嗎?
接口不实现另一个接口,而是扩展它。由于接口不能有方法实现,所以不存在菱形问题。这就是为什么我们在接口中有多重继承,即一个接口可以扩展多个接口。
从Java 8开始,接口可以有默认方法实现。因此,当一个公共默认方法存在于多个接口中时,必须在实现它们的类中提供方法的实现来处理菱形问题。有关详细信息和示例,请阅读Java 8 接口变更。
35. 什么是标记接口?
A marker interface is an empty interface without any method but used to force some functionality in implementing classes by Java. Some of the well known marker interfaces are Serializable and Cloneable.
36. 什么是包装类?
Java 包装类是 java 中八种原始类型的对象表示。Java 中的所有包装类都是不可变的和最终的。Java 5 中的自动装箱和拆箱允许在原始类型和相应的包装类之间进行简单的转换。
详细了解请参阅Java 中的包装类。
37. 在 Java 中,Enum 是什麼?
Enum 是在 Java 1.5 中引入的一種新類型,其字段由一組固定的常量組成。例如,在 Java 中,我們可以創建 Direction 作為一個枚舉類,其固定字段為 EAST、WEST、NORTH、SOUTH。
enum 是創建枚舉類型的關鍵字,類似於類。枚舉常量隱式地是靜態和最終的。詳細了解請參閱 java enum。
38. Java 注解是什麼?
Java注解提供了有关代码的信息,它们对其注释的代码没有直接影响。注解是在Java 5中引入的。注解是嵌入在程序本身中的程序元数据。它可以被注解解析工具或编译器解析。我们还可以指定注解的可用性,要么只能在编译时使用,要么在运行时都可以使用。Java内置的注解包括@Override、@Deprecated和@SuppressWarnings。更多信息请参阅java注解。
39. Java反射API是什么,为什么它如此重要?
Java反射API提供了检查和修改Java应用程序运行时行为的能力。我们可以检查Java类、接口、枚举,并获取它们的方法和字段详情。反射API是一个高级主题,在正常编程中应避免使用它。反射API的使用可能会破坏设计模式,例如通过调用私有构造函数来违反访问修饰符的规则,从而破坏单例模式。
即使我們在正常編程中不使用反射 API,它也非常重要。我們不能沒有任何框架,如 Spring、Hibernate 或者伺服器,如 Tomcat、JBoss,沒有反射 API。它們通過反射 API 調用適當的方法並通過反射來實例化類,並且在其他處理中大量使用它。
閱讀Java 反射教程以深入了解反射 API。
40. 什麼是 Java 中的 Composition?
Composition 是在類中實現 has-a 關係的設計技術。我們可以使用對象組合進行代碼重用。
Java 的 Composition 是通過使用引用其他對象的實例變量來實現的。使用 Composition 的好處是我們可以控制客戶類對其他對象的可見性,並僅重用我們需要的部分。在Java Composition示例中查看更多詳細信息。
41. Composition 與 Inheritance 相比的好處是什麼?
Java編程的最佳實踐之一是「優先使用組合而非繼承」。一些可能的原因包括:
- 即使我們可能不使用超類的方法,但超類的任何變更都可能影響子類。例如,如果我們在子類中有一個方法test(),突然有人在超類中引入了一個方法test(),我們將在子類中得到編譯錯誤。組合永遠不會遇到此問題,因為我們只使用我們需要的方法。
- 繼承將所有超類的方法和變量暴露給客戶端,如果我們無法控制設計超類,這可能導致安全漏洞。組合允許我們對方法提供受限訪問,因此更安全。
- 在組合中,我們可以獲得運行時綁定,而繼承會在編譯時綁定類。因此,組合在調用方法時提供了靈活性。
您可以在Java組合與繼承中了解更多關於組合優於繼承的好處。
42. 如何在Java中對自定義對象集合進行排序?
我們需要實現Comparable介面以支援在集合中對自定義物件進行排序。Comparable介面具有compareTo(T obj)方法,排序方法使用此方法,通過提供此方法的實現,我們可以提供自定義物件集合的默認排序方式。
但是,如果要根據不同的標準進行排序,例如根據薪水或年齡對員工集合進行排序,那麼我們可以創建Comparator實例並將其作為排序方法。有關更多詳情,請閱讀Java Comparable和Comparator。
43. 什麼是Java中的內部類?
我們可以在類內部定義一個類,這些類稱為嵌套類。任何非靜態嵌套類都被稱為內部類。內部類與該類的對象相關聯,它們可以訪問外部類的所有變量和方法。由於內部類與實例關聯,因此我們不能在其中擁有任何靜態變量。
我們可以在類內部擁有局部內部類或匿名內部類。有關更多詳情,請閱讀java內部類。
44. 什麼是匿名內部類別?
A local inner class without a name is known as an anonymous inner class. An anonymous class is defined and instantiated in a single statement. Anonymous inner class always extend a class or implement an interface.
由於匿名類別沒有名稱,因此無法為匿名類別定義構造函數。匿名內部類別只能在定義它的地方訪問。
45. 什麼是Java中的類加載器?
Java類加載器是在我們想要訪問任何類時將字節碼程序加載到內存中的程序。我們可以通過擴展ClassLoader類並覆蓋loadClass(String name)方法來創建自己的類加載器。在 java classloader 中了解更多信息。
46. 有哪些不同類型的類加載器?
Java中有三種內建的類加載器。
- Bootstrap ClassLoader – 它加載JDK內部類,通常加載rt.jar和其他核心類。
- 擴展類加載器 – 它從JDK擴展目錄中加載類,通常是$JAVA_HOME/lib/ext目錄。
- 系統類加載器 – 它從當前的類路徑中加載類,可以在調用程序時使用 -cp 或 -classpath 命令行選項進行設置。
47. 什麼是Java中的三元運算符?
Java三元運算符是唯一接受三個運算元的條件運算符。它是if-then-else語句的一行替代,並在Java編程中被廣泛使用。我們可以使用三元運算符進行if-else條件或甚至使用嵌套的三元運算符進行switch條件。一個例子可以在java三元運算符找到。
48. super關鍵字的作用是什麼?
當您在子類中重寫了方法時,可以使用super關鍵字來訪問超類方法。
我們可以在子類構造函數中使用super關鍵字來調用超類構造函數,但在這種情況下,它應該是構造函數方法中的第一個語句。
可以在下面的子類實現中看到super關鍵字的用法。
49. 什麼是 break 和 continue 陳述?
我們可以使用 break 陳述來終止 for、while 或 do-while 迴圈。我們可以在 switch 陳述中使用 break 陳述來退出 switch case。您可以在 java break 看到 break 陳述的示例。我們可以與標籤一起使用 break 來終止巢狀迴圈。
continue 陳述跳過 for、while 或 do-while 迴圈的當前迭代。我們可以與標籤一起使用 continue 陳述來跳過最外層迴圈的當前迭代。
50. Java 中的 this 關鍵字是什麼?
this 關鍵字提供對當前對象的引用,主要用於確保使用對象變數,而不是具有相同名稱的局部變數。
我們還可以使用這個關鍵字來從構造函數中調用其他構造函數。
51. 什麼是默認構造函數?
類的無參數構造函數被稱為默認構造函數。當我們不為類定義任何構造函數時,Java編譯器會自動為該類創建默認的無參數構造函數。如果已經定義了其他構造函數,則編譯器不會為我們創建默認的構造函數。
52. 我們可以只有 try 而沒有 catch 嗎?
是的,我們可以使用 try-finally 陳述式,從而避免 catch 塊。
53. 什麼是垃圾回收?
垃圾回收是一種查看堆內存、識別正在使用的對象和未使用的對象,並刪除未使用對象的過程。在Java中,內存的釋放過程由垃圾回收器自動處理。
我們可以使用代碼Runtime.getRuntime().gc()
運行垃圾收集器,或者使用實用程序方法System.gc()
。有關堆內存和垃圾收集的詳細分析,請閱讀Java垃圾收集。
54. 什麼是序列化和反序列化?
我們可以將Java對象轉換為稱為序列化的流。一旦將對象轉換為流,就可以將其保存到文件中,或者通過網絡發送,或者在套接字連接中使用。
該對象應該實現Serializable接口,我們可以使用java.io.ObjectOutputStream將對象寫入文件或任何OutputStream對象中。在Java序列化中了解更多信息。
通過將通過序列化創建的流數據轉換為對象的過程稱為反序列化。在Java反序列化中了解更多信息。
55. 如何透過命令提示字元運行 JAR 檔案?
我們可以使用 java 命令運行 JAR 檔案,但這需要在 JAR 清單檔案中有 Main-Class 項目。Main-Class 是 JAR 的入口點,由 java 命令用於執行該類。了解更多:java jar 檔案。
56. System 類的用途是什麼?
Java 的 System 類是核心類之一。進行偵錯的最簡單方式之一是使用 System.out.print() 方法進行信息記錄。
System 類是 final 的,因此我們無法通過繼承來子類化並覆蓋其行為。System 類不提供任何公共建構函式,因此我們無法實例化此類,這就是為什麼它的所有方法都是靜態的。
System 類的一些實用方法用於陣列複製、獲取當前時間、讀取環境變數等。閱讀更多:Java System 類。
57. instanceof 關鍵字是什麼?
我們可以使用 instanceof 關鍵字來檢查一個物件是否屬於某個類別。我們應該盡量避免使用它。示例用法如下:
由於 str 在運行時是 String 型別,第一個 if 陳述式評估為 true,第二個則為 false。
58. 我們可以在 switch case 中使用 String 嗎?
Java 7 的一個特性是改進了 switch case 以允許使用 String。因此,如果您使用的是 Java 7 或更高版本,您可以在 switch-case 陳述式中使用 String。閱讀更多信息:Java switch-case String 範例。
59. Java 是傳值還是傳址呢?
這是一個非常混亂的問題,我們知道物件變數包含對堆空間中物件的引用。當我們調用任何方法時,這些變數的副本會被傳遞並存儲在該方法的堆棧內存中。通過一個簡單的通用交換方法,我們可以測試任何語言是按引用傳遞還是按值傳遞,要了解更多請閱讀Java是按值傳遞而不是按引用傳遞。
60. 堆和堆疊內存的區別是什麼?
堆和堆疊內存的主要區別如下:
- 堆內存被應用程序的所有部分使用,而堆疊內存僅由一個執行緒使用。
- 每次創建對象時,它都會始終存儲在堆空間中,而堆疊內存包含對其的引用。堆疊內存僅包含本地基本變數和對堆空間中對象的引用變數。
- 堆疊中的內存管理是以LIFO方式進行的,而堆內存的管理更加複雜,因為它在全局範圍內使用。
有關詳細解釋和示例程序,請閱讀Java堆內存 vs 堆疊內存。
61. Java Compiler 存儲在 JDK、JRE 還是 JVM 中?
Java 編譯器的任務是將 Java 程式轉換為字節碼,我們使用 javac 可執行文件來實現這一目的。因此,它必須存儲在 JDK 中,而在 JRE 中我們不需要它,而 JVM 僅是規範。
62. 以下程序的輸出是什麼?
上下文:類中的靜態方法
答案:該代碼將無法編譯,因為我們無法在 Object 類方法中使用 static 關鍵字。請注意,Object 類具有 toString() 方法。您將獲得編譯時錯誤,即“此靜態方法無法隱藏來自 Object 的實例方法”。原因是靜態方法屬於類,由於每個類的基礎都是 Object,因此我們無法在實例中和類中都擁有相同的方法。如果將方法名從 toString() 更改為不存在於超類 Object 中的其他名稱,則不會出現此錯誤。
上下文:靜態方法調用
答案:嗯,這是一個奇怪的情況。我們都曾看過當我們在為NULL對象調用方法時的NullPointerException
。但在這裡,這個程序將會運行並打印出“Test foo called”。
這是因為Java編譯器的代碼優化。當Java代碼被編譯為字節碼時,它發現foo()
是一個靜態方法,應該使用類來調用。因此,它將方法調用obj.foo()
更改為Test.foo()
,因此沒有NullPointerException
。
I must admit that it’s a very tricky question and if you are interviewing someone, this will blow his mind off. ?
這就是所有的核心Java面試問題和答案。我將不斷添加更多問題到列表中,如果您認為我漏掉了任何重要的問題,請通過評論讓我知道。
Source:
https://www.digitalocean.com/community/tutorials/core-java-interview-questions-and-answers