java面試題1000道
1. JDK與JRE之間的區別
答:JDK是java開發工具包的一個標准,它包含了一些工具,以及為開發java程序所需要的庫,它也包含編譯器,調試工具。
JRE是java運行時環境,它包含在JDK當中,JRE提供必要的庫以及JVM,因為這是運行java程序所必須的。
2. 什么是java虛擬機
答:java虛擬機(java Virturl Machine JVM)是一個抽象的機器,用於執行java字節碼,不同的硬件平台JVM是不同的,JVM本身是平台相關的,JVM負責加載驗證以及執行字節碼。
3. JVM的內存區域有哪些類型
答:在java當中,JVM分配內存給不同的進程、方法、還有對象,內存區域划分如下:
- 類加載器:它屬於JVM的一個組件用於加載類文件
- 類(方法)區:它存儲了每個類的結構比如運行時的常量池,字段和方法數據,以及方法的代碼。
- 堆:堆是運行時創建的,它包含了那些在運行時為對象分配的數據。
- 棧:棧存儲局部變量和部分的運行時結果,它也有助於方法調用和返回,每個線程在其線程創建的時候創建一個私有的JVM棧。
- 程序計數器:這個內存區域包含了JVM目前正在執行的指令地址。
- 本地方法棧:這個區域是為應用程序當中所有的本地方法所保留的內存區域。
4. 什么是JIT編譯器
答:JIT全稱:just in time,及時的,及時編譯器主要用於改善java的性能,它默認是開啟的,它是編譯時更早的處理以便運行時更良好的運行,java已經通過在JVM當中廣泛的使用JIT編譯器。
5. java與其它語言不一樣的地方
答:java最大的特點是它的平台無關性,java編譯器將java源代碼編譯為字節碼然后由JVM負責解釋執行,對於世界上絕大多數流行的平台都有其對應的JVM,java字節碼可以運行在有JVM支持的平台上,其它的語言往往需要為特定的平台編譯特定的庫。
6. 為什么說java是一次編寫,到處運行
答:可以在Windows上編寫Java代碼並在Windows中編譯它。從Windows中獲得的類和jar文件可以在UNIX環境下運行,真正的實現了跨平台。所有這些可移植性的背后都是Java字節碼。Java編譯器生成的字節碼可以由任何JVM來解釋。因此,編寫Java程序變得更加容易,這些程序幾乎可以在任何平台上運行。java編譯器負責編譯,JVM負責解釋執行。
7. java當中的類加載器如何工作
答:在java當中,類加載器用於加載類文件,它可以從指定的物理位置,比如文件系統,或者網絡位置等等獲取。
主要有三種方式:
- Bootstrap ClassLoader 這是第一個類加載器,它從RT.jar文件加載類。
- Extension ClassLoader:(擴展類加載器),它從jre/lib/ext加載類文件。
- Application ClassLoader:它依賴於類路徑查找類文件的位置,如果你在類路徑當中指定了jar,那么類加載將會加載它們。
8. main這個單詞用於main方法你認為它是關鍵字嗎?
答:不是,它就是一個方法名而已,我們可以在一個類當中取別的同名的方法,它不是一個關鍵字。
9. main方法可以修改為public void static形式嗎?
答:不能,任何方法都必須先寫限定符然后才能是返回值,順序不能修改。但是改為
static public void main()是可以的。
10. 在Java中我們對局部變量不指定任何值,那么它的默認值是什么?
答:Java不會幫我們進行初始化我們的局部變量,所以它的值是null,但是並沒有顯式賦值為null,所以如果你嘗試直接使用未賦值的局部變量將會得到錯誤。
11. 我們運行一個Java的類不需要傳遞參數,那么數組String[]args的值到底是什么?
答:如果沒有傳遞參數,那么這個數組將會是沒有元素的空數組,但是它不是null。
12. Java當中byte和char這兩種數據類型有何區別?
答:二者本質上都是數字類型,只是用於展示不同的數據范圍,它們之間最主要的區別在於,byte可以用於存儲二進制數據,而char用於存儲字符串文本數據。
比如
char ch = 'x';
byte數據范圍為-128到127
一個byte等於8bits。但是char是16bits所以它等於兩個bytes
char=2bytes=16bits。
13 OOP的基本原則有哪些?
答:
- 抽象
- 封裝
- 繼承
- 多態
14 面向對象的語言和基於對象的語言之間的區別是什么?
答:面向對象的編程語言如Java和C++遵循OOPS(如封裝、抽象、多態性和繼承)等概念。基於對象的編程語言遵循OOOPS的一些特性,但它們不支持多態性和繼承,javaScript、VBScript等基於對象的編程語言為Objectsand提供了支持,可以從構造函數構建對象。他們的語言支持封裝。這些也被稱為原型語言。
15 在Java當中成員變量的引用類型數據默認值是什么?
答:Java中的所有成員變量的引用類型對象默認值都是null。
16 為什么需要構造器?
答:java是一種面向對象的語言,在其中我們創建和使用對象。構造函數是類似於方法的一段代碼。它是用於創建對象並設置對象的初始狀態。構造函數是一個與類同名的特殊函數。沒有構造函數,就沒有其他方法來創建對象。默認情況下,Java為每個對象提供默認構造函數。如果我們重載一個構造函數,那么我們必須實現默認的構造函數。
17 Java當中為什么需要默認構造器?
答:默認構造函數是在沒有定義其他構造函數的情況下由Java自動生成的無參數構造函數。Java規范表明,如果類中沒有重載構造函數,它將提供默認構造函數。但它並沒有說明在一個類中編寫一個覆蓋過多的構造函數的情況。我們需要至少一個構造函數來創建一個對象。
18 Java構造器有返回值嗎?
答:沒有,根據sun的規范說明:
Constructor declarations look like method declarations—except that they use the name of the class and have no return type.
構造器聲明很像方法的聲明,特殊的是它使用的名字必須是類名並且沒有返回值類型。
19 Java當中可以繼承構造器嗎?
答:Java不支持繼承構造器。
20. 為什么構造器不能被final static abstract 修飾?
答:如果我們把一個方法設為final,那就意味着我們不希望任何類重寫它。但是構造函數(按Java語言編寫
規范)不能被重寫。所以修飾它是沒有用的。
如果我們將一個方法設置為抽象的,這意味着它沒有主體,應該在子類中實現。但是當使用新關鍵字時,構造函數是隱含調用的。因此它需要方法體。
如果我們將方法設為靜態,則意味着它屬於類,不屬於一個特定的對象。初始化對象總是使用構造器來完成的。因此,標記構造函數靜態是沒有用的。
21. this關鍵字的作用?
答:在Java中,“這個”關鍵字指的是對象的當前實例。這對於區分實例變量和局部變量是有用的。它可以用來調用構造函數。或者它可以用來指代實例。在方法重寫的情況下,可以調用當前類的方法。
22. 解釋一下繼承這個概念
答:繼承是面向對象程序設計中的一個重要概念。有些對象具有某些特征和行為。通過繼承,我們可以將共同的行為和特性放在一個基類中,也稱為超類,然后所有具有共同行為的對象從這個基類繼承。它表現為一種is a的關系。繼承可以促進代碼重用,方法重寫和多態性。
23. java當中哪個類是所有類的超類?
答: Object.
24. java為何不支持多繼承?
答:多重繼承意味着一個類可以繼承來自兩個或多個父類的行為。多重繼承的問題是父類可能對同一方法有不同的實現。所以他們有不同的方法來做同樣的事情。現在,子類應該選擇哪種實現方式?這導致多重繼承的模糊性。這是Java不支持實現多繼承的主要原因。
假設你有一個類電視和另一個類原子彈。有方法switchOn(),但只有TV有switchOff()方法。如果你的類繼承了這兩個類,那么你同時從兩個父類繼承了switchOn方法,如果要switchOn就容易困惑,但是switchOff只會切到電視又可以唯一確定,種種不確定性提高了編程難度,所以java選擇不支持多繼承。為了彌補不能多繼承的缺陷,在Java中實現多個接口。
25. OOP當中,何謂組合?
答:組合也被成為HAS-A關系,他涉及到兩個類,比如說汽車類有駕駛輪,如果一個類保存另一個類的實例,那么它被稱為組合。
26. 聚合與組合這兩個概念的區別?
答:在OOPS中,聚合和組合是關聯關系的類型。組合是一種強關系。如果混合對象被銷毀,那么它的所有部分都被銷毀。汽車有方向盤。如果汽車被破壞,那么方向盤就沒有意義了。
對於聚合關系則沒有組合關系那么強,比如一個圖書館有學生,如果一個圖書館被摧毀了,學生還是存在的,所以圖書館和學生的關系是聚合關系,一個圖書館有數,如果圖書館被銷毀,那么書籍也會被銷毀,圖書館的書不能脫離這個圖書館而存在,所以書和圖書的關系是組合關系。
27. java當中為何沒有指針?
答:java當中使用引用代替指針,這些引用指向對象的內存空間,但是並不是直接的訪問這些內存地址,JVM可以在VM內存當中自由的移動對象。
指針的移除有助於java管理內存以及提高垃圾回收效率,他也幫助了開發者,不再需要擔心內存分配以及回收的問題。
28. 如果在java當中沒有指針,為什么我們還有NullPointerException?
答:在java當中,指針等同於引用,當我們使用a.這種方式的時候,JVM使用指針在操作,但是開發者僅僅能看到的是對象的引用。當一個對象引用指向空的時候,並且我們又嘗試使用它去訪問方法或者成員變量,我們就會得到一個空指針異常。
29. super關鍵字的作用?
答:super關鍵字可以用在子類的方法當中或者構造器當中,它指的對象的直接父類對象,通過使用super我們可以調用父類當中的方法。也可以在構造器當中調用父類的構造器。
30. 構造函數當中是否可以同時使用this()與super()?
答:不能,java不允許在同一個構造器當中同時使用this()與super(),java規范表明,super()或者this()在構造器當中只能出現在第一行。