1. 程式人生 > >java面試12題(一)

java面試12題(一)

java面試12題(一)

文章目錄


1. 為什麼java被稱作“平臺無關的程式語言”?

答:java語言是所以跨平臺,是因為java編譯後的.class位元組碼檔案是跨平臺的;java位元組碼檔案經過java虛擬機器解釋成對應平臺的機器碼執行;所以java的跨平臺就是在不同的平臺上安裝了java虛擬機器(JVM)。


2. 什麼是java虛擬機器(JVM)?

答:java虛擬機器就是可以執行java位元組碼的虛擬機器程序。


3.JDK和JRE的區別

答:jdk是java開發工具包,jre是java執行時環境;
jdk包含jre,可以讓開發者開發、編譯、執行java應用程式。
jre包含java虛擬機器、java核心類和其他支援檔案。


4. static關鍵字的四種用法

答:被static關鍵字修飾的方法或者變數不需要依賴於物件來進行訪問,只要類被載入了,就可以通過類名去進行訪問;方便在沒有建立物件的情況下來進行呼叫(方法/變數)。
static主要有四種用法:

  1. 修飾成員變數,將其變為類的成員,從而實現所有物件對於該成員的共享;
  2. 修飾成員方法,將其變為類方法,可以直接使用“類名.方法名”的方式呼叫,常用於工具類;
  3. 靜態塊用法,將多個類成員放在一起初始化,使得程式更加規整,其中理解物件的初始化過程非常關鍵;
  4. 靜態導包用法,將類的方法直接匯入到當前類中,從而直接使用“方法名”即可呼叫類方法,更加方便。

5. java中是否可以覆蓋private方法或是static方法?

答:java的static方法不能被覆蓋,因為方法覆蓋是基於執行時動態繫結的,而static方法是編譯時靜態繫結的。
java中也不能覆蓋private方法,因為private修飾的變數和方法只能在當前類中使用,如果是其他類繼承當前類是不鞥訪問到private變數和方法的。所以能覆蓋。


6. 是否可以在static環境中訪問非static變數?

答:不可以在 static 環境中訪問非 static 變數。
因為 static 成員是在類被載入時被載入的,而非 static 成員則是在類被例項化時建立的,只能通過例項進行訪問。
當在 static 環境中訪問非 static 成員時,此時例項很可能還沒有被建立,所以不能訪問非 static 成員。所以在 static 環境中不可訪問非 static成員。


7. java支援多繼承嗎?

答:java的類只支援單繼承,不支援多繼承;但是java的介面支援多繼承;
介面可以擴充套件多個功能,當類實現介面的時候,類就可以擴充套件對應的功能。


8. 什麼是自動裝箱拆箱?

答:自動裝箱是Java編譯器在基本資料型別和對應的物件包裝型別之間做的一個轉化。比如:把int轉化成Integer,double轉化成Double,等等。反之就是自動拆箱。
自動裝箱就是Java編譯器在基本資料型別和對應的物件包裝型別間的轉化,即int轉化為Integer,自動拆箱是Integer呼叫其方法將其轉化為int的過程

Java支援的資料型別包括兩種:
一種是基本資料型別,包含byte,char,short, boolean ,int , long, float,double;
另一種是引用型別:如String等,其實是物件的引用,JVM中虛擬棧中存的是物件的地址,建立的物件實質在堆中,通過地址來找到堆中的物件的過程,即為引用型別。


9. 什麼是值傳遞、引用傳遞?

答:值傳遞是針對基本資料型別的變數來說的,傳遞的只是該變數的副本,改變副本的值不會改變原來變數的值;
引用傳遞是針對引用型別變數來說的,傳遞的是物件的地址,同一個地址指向兩個的變數,所以兩個變數的值都相同,會被同時發生變化。


10. 程序和執行緒的區別

答:程序是執行的應用程式,執行緒是程序內部的執行序列,
一個程序可以有多個執行緒,執行緒又叫輕量級程序。

執行緒和程序的區別歸納:

區別 程序 、 執行緒
a. 地址空間和其他資源: 程序之間相互獨立;同一程序的執行緒間共享 某程序的執行緒不能再其他程序中看見。
b. 通訊 程序間通訊ICP,執行緒間可以直接讀寫程序資料段來進行通訊,需要程序同步和互斥手段的輔助,來保護資料的一致性。
c. 排程和切換 執行緒的上下文切換比程序上下文切換快得多。
d. 在多執行緒的OS中,程序不是一個可執行的實體

11. 建立執行緒有幾種不同的方式?哪一種比較受歡迎?為什麼?

答:有三種方式:
①繼承Thread類
②實現Runnable介面,並重寫裡面的run方法。
③使用Executor框架建立執行緒池。
一般情況下,常見的是第二種。

  • Runnable介面有如下好處:
    ①避免點繼承的侷限,一個類可以繼承多個介面。
    ②適合於資源的共享

繼承於Thread類的執行緒類,可以直接呼叫start方法啟動執行緒(使用static也可以實現資源共享).一個執行緒(物件)只能夠執行一次start(),而且不能通過Thread實現類物件的run()去啟動一個執行緒。

實現Runnable介面的類需要再次用Thread類包裝後才能呼叫start方法。(三個Thread物件包裝一個類物件,就實現了資源共享)。

Executor框架是juc裡提供的執行緒池的實現。呼叫執行緒的start():啟動此執行緒;呼叫相應的run()方法
執行緒的使用的話,注意鎖和同步的使用。(多執行緒訪問共享資源容易出現執行緒安全問題)


12. 方法過載和方法覆蓋是什麼意思?

答:方法過載是發生在一個類中,方法的名稱相同,但是引數的個數和型別不同;方法覆蓋是說子類重新定義父類的方法。方法覆蓋必須有相同的方法名,引數列表和返回型別。
注意:只有返回值型別不同的方法不算過載