1. 程式人生 > >201個核心Java面試問題彙總(1)

201個核心Java面試問題彙總(1)

基礎部分:

1.JVM,JDK,JRE之間的區別?

  • JVM是Java虛擬機器的首字母縮寫,它是一種提供了Java位元組碼執行時環境的規範。JVM,JRE和JDK都是平臺相關的,這是因為它們在不同平臺(OS)上的配置是不一樣的,但是Java是平臺(OS)無關的。JVM對很多的軟體和硬體平臺都適用(比如語言無關性的建立,只關注位元組碼的操作),JVM的主要任務:載入,驗證,執行,提供執行時環境。
  • JRE是JVM的實現,它是物理存在的,包含了JVM,libraries(jar包)和其他的一些JVM在執行時會用到的檔案。
  • JDK是Java Development Kit的首字母縮寫,它也是物理存在的,JDK是JRE+一些開發工具(javac,Javap)。
  • 上面我們可以看出三者間的層次結構。

2.JVM的記憶體分配區有幾種型別?

JVM的內部架構

  • 看圖說話,上圖是Java虛擬機器的內部架構,包含三部分:類載入器,記憶體區,執行引擎。在這我們只關注中間的部分。
  • Class Area:儲存了每個class的結構:比如執行時常量池,欄位和方法的資料,方法的code。
  • Heap:存放物件的執行時資料。
  • Stack:Stack以幀儲存,它儲存local變數和部分結果,在invoke和return的時候起作用。每個執行緒都有一個Stack,與建立執行緒同時。一個新的幀在一個方法invoke的時候建立,在invoke結束的時候丟棄這個幀。
  • 程式計數器:它儲存了Java虛擬機器正在執行的指令的地址。
  • 本地方法棧:它儲存了APP中使用的所有的本地方法(Native method)。

3.什麼是JIT編譯器?

  • JIT編譯器是提升效能的。JIT編譯位元組碼中部分在相同時間內功能相同的部分,因此可以減少編譯是所需時間。這裡”編譯器“表示將JVM指令集裝換為CPU指令集的轉換器。

4.什麼是平臺(platform)?

  • 平臺是程式執行所需的基礎的硬體或者軟體環境環境,兩種型別:基於硬體的和基於軟體的。Java提供的平臺是基於軟體的。

5.Java平臺和其他平臺有什麼不一樣?

  • java平臺是建立在其它基於硬體的平臺的頂層的基於軟體的平臺架構,它有兩部分組成:執行時環境和APP的介面。

6.什麼性質給予了”Java一次編譯,到處執行“的特性?

  • 位元組碼。Java是被編譯成位元組碼,位元組碼是介於Java原始碼和機器碼之間的一種中間語言,這種位元組碼與平臺無關,因此可以用於任何平臺。

7.什麼是類載入器?

  • 類載入器是JVM的子系統,用於載入類和介面,有許多種類的類載入器。Bootstrap classloader, Extension classloader, System classloader, Plugin classloader etc.

8. .java檔名是有效的檔案嗎?是的。

9.delete,next,main,exit or null是關鍵字嗎?不是。

10.如果在命令列不提供任何引數,那麼main的String[]是空的還是null?是空的,但是不是null。

11.如果我使用static public void代替public static void可以嗎?可以,編譯和執行不會出現任何問題。

12.區域性變數的預設值是多少?區域性變數不會初始化為任何預設值,無論是原始資料型別還是物件引用都是如此。

面向物件的概念:

13.面向物件程式語言和基於物件程式語言的區別?

  • 基於物件程式語言沿用了OOPS語言的所有特性處理除了繼承。基於物件的語言有JavaScript, VBScript。

14.被定義為一個例項變數的物件引用的初始值是多少?Java中的物件引用初始化為null.

15.什麼是構造器?構造器用來初始化一個物件的狀態,在物件建立的同一時間被呼叫。

    -

16.建立預設構造器的目的是什麼?

  • 預設構造器給給物件提供一個預設的值,當這個物件的類中沒有構造器的時候。

17.構造器return值嗎?是的,那是當前例項,你不能return type但是可以return value。

18.構造器(constructer)可以繼承嗎?不能被繼承。

19.構造器可以用final修飾嗎?不可以。

static關鍵字

20.什麼是靜態變數(static variable)?

  • 靜態變數用於引用物件的公共屬性(對於每個物件來說不是唯一的),比如員工的公司名字,學生的學校名字。
  • 靜態變數在class載入的時候獲得記憶體,在Class Area區域。

21.什麼是靜態方法(static method)?

  • 靜態方法屬於類而不屬於類的物件。
  • 不需要建立類的例項就可以呼叫靜態方法。
  • 靜態方法可以訪問靜態資料成員並且修改它。

22.為什麼main method是靜態的(static)?

  • 因為呼叫靜態方法的時候不需要物件,如果main是非 靜態的,那麼首先JVM需要建立一個物件,然後才能呼叫main,這會造成額外的記憶體分配的問題。

23.什麼是靜態塊(static block)?

  • 用來初始化靜態資料成員。
  • 它在類載入的時候被刪除,在main之前。

24.不使用main的話可以執行程式嗎?可以,使用靜態程式碼塊(static block)。

25.如果把static從main方法中移出去,會出現什麼問題?

  • 編譯成功。但是執行時會丟擲NoSuchMethodError。

26.static method和instance method方法的不同之處?

  • 有static的叫做靜態方法,沒有static的方法叫做例項方法(instance method)。
  • call static method的時候不需要物件,但是call instance method的時候需要物件。
  • instance(Non-static)成員無法直接訪問靜態的context(比如static method, static block and static nested class),但是static method和instance method都可以訪問instance method。

繼承

27.什麼是this?就是一個引用(refer)當前物件的關鍵字。

28.什麼是繼承?

  • 繼承是一種機制,一個物件獲取另外一個物件的所有屬性和行為的機制。
  • 展現了IS-A 關係,可用於程式碼重用和方法覆蓋。

29.所有class的superclass是什麼?Object class。

30.為什麼Java中不支援多重繼承?

  • 為了降低程式碼的複雜度,簡化語言,Java在類上是不支援多重繼承的,但是在介面上是支援的。

31.什麼是組合(composition)?

  • 就是在一些類中儲存另外一些類的引用,叫做組合。

32.聚合(aggregation)和組合(composition)的區別?

  • aggregation(聚合)是強關係,組合是弱關係。
  • For example: bike has an indicator (aggregation) but bike has an engine (compostion).//無法理解。。。。

33.為什麼Java不支援指標(pointers)?

  • 指標是指向記憶體地址的變數。Java不用指標:它直接操作記憶體不安全,理解起來很複雜。

34.Java中的super?

  • 它是它是一個引用直接父類物件的關鍵字。

35.構造器中可以同時使用super()和this()嗎?

  • 不行,它們兩個都是必須在方法中的第一行語句使用,同時使用衝突。

36.什麼是物件克隆?

  • 物件克隆用於建立物件的精確副本。

method overloading

37.什麼是方法過載(method overloading)?

  • 如果一個class中有許多method的名字相同但是注入引數不同,那麼就叫做方法過載(method overloading),它提高了程式的可讀性。

38.通過改變方法的return型別來實現方法過載為什麼不行?

  • 因為模糊//納尼。。。。

39.main方法可以過載嗎?

  • 當然可以。通過方法過載,一個類中可以有很多main方法。//記得加程式碼例項.

Method Overriding

40.什麼是方法重寫(method overriding)?

  • 如果一個子類(subclass)提供了一個方法的具體實現,這個方法已經被它的superclass提供過了,這個叫做方法重寫(method overriding)。
  • 它被用在執行時多型方法的具體實現

41.可以重寫靜態方法(static method)嗎?

  • 不可以。因為靜態方法是類的一部分,二不是物件的一部分。//和JVM有關,參考42。

42.為什麼不能重寫靜態方法(static method)?

  • 靜態方法是class的一部分並且它和class繫結,但是例項化方法(instance method,非靜態)和物件繫結。
  • 靜態方法的記憶體區域在Class Area,而instance method的記憶體區域在heap。

43.我們可以重寫過載的方法嗎?當然可以。

44.方法重寫和方法過載的區別?

  • 方法過載提高了程式的可讀性,方法重寫在子類中提供了父類已經提供的類的具體實現。
  • 方法過載在類中發生,方法重寫在兩個具有IS-A關係的類中發生。
  • 方法過載的引數是不能相同的,但是方法重寫的引數必須相同。

45.Java中可以有虛擬函式嗎?

  • 當然可以,Java中的函式預設都是虛擬的。

46.什麼是協變(covariant)返回型別?

  • Java5之後,重寫一個方法可以通過改變它的返回值(如果它的返回值是子類的型別)來實現,這個就叫做協變返回型別。