首頁  >  文章  >  Java  >  java面試題最容易犯錯的8道

java面試題最容易犯錯的8道

(*-*)浩
(*-*)浩原創
2019-11-11 14:21:362004瀏覽

java面試題最容易犯錯的8道

1. static 與final 的用法

#static 的作用從三個面向來談,分別是靜態變數、靜態方法、靜態類。

靜態變數:宣告為static 的靜態變數實質上就是全域變量,當宣告一個物件時,並不會產生static 變數的拷貝,而是該類別所有實例變數共用同一個static 變數。也就是說這個靜態變數只載入一次,只分配一塊儲存空間。

靜態方法: 宣告為static的靜態方法有以下幾個特點:

(1)靜態方法只能呼叫靜態方法;

# (2)靜態方法只能存取靜態資料;

(3)靜態方法不能以任何方式引用this或super;

靜態類別:通常一個普通類別不允許宣告為靜態,只有一個內部類別才可以(main方法就是一個典型),這時這個宣告的靜態類別可以直接當作一個普通類別來使用,而不需要實例一個外部類別。

final 的作用從變數、方法、類別三個面向來理解:

final修飾的變數的值不能被修改,是一個常數;

final修飾的方法不能被重寫;

final修飾的類別不能被繼承;

#2. 抽象類別和介面的區別,類別可以繼承多個類別嗎,介面可以繼承多個介面嗎,類別可以實作多個介面嗎?

抽象類別和介面都不能直接實例化,如果要實例化,抽象類別變數必須指向實作所有抽象方法的子類別對象,介面變數必須指向實作所有介面方法的類別物件。

抽象類別要被子類別繼承,介面要被類別實作。

介面只能做方法聲明,抽象類別中可以做方法聲明,也可以做方法實作

介面裡定義的變數只能是公共的靜態的常數,抽象類別中的變數是普通變數。

抽象類別裡的抽象方法必須全部被子類別所實現,如果子類別不能全部實作父類別抽象方法,那麼該子類別只能是抽象類別。同樣,一個實作介面的時候,如不能全部實作介面方法,那麼該類別也只能為抽象類別。

抽象方法只能申明,不能實現。 abstract void abc();不能寫成abstract void abc(){}。

抽象類別裡可以沒有抽象方法 。

如果一個類別裡有抽象方法,那麼這個類別只能是抽象類別 。

抽象方法要實現,所以不能是靜態的,也不能是私有的。

介面可繼承接口,並可多繼承接口,但類別只能單根繼承。

3. this和super的功能和用法

#this :

(1) 能存取建構方法以外所有的屬性、方法,透過this.來呼叫方法和屬性

(2) 不可以在靜態方法中使用

(3) 在建構方法中使用this(參數列表) 調用本類的其它構造方法,必須放在構造方法的第一句。

super :存取父類別的方法和屬性

(1) 存取父類別的方法和屬性;

(2) 在建構方法中透過super(參數列表) 來呼叫父類別的建構方法,必須放在子類別建構方法裡的第一行。

4. final, finally, finalize 的差異?

#final:修飾符(關鍵字)有三種用法:如果一個類別被宣告為final,則意味著它不能再派生出新的子類,即不能被繼承。將變數宣告為final,可以保證它們在使用中不被改變,被宣告為final 的變數在初始化以後的參考中只能讀取不可修改。被宣告為 final 的方法也同樣只能使用,不能在子類別中被重寫。

finally:通常放在try…catch的後面構造總是執行程式碼區塊,這就意味著程式無論正常執行或發生異常,這裡的程式碼只要JVM不關閉都能執行,可以將釋放外部資源的程式碼寫在finally區塊中。

finalize:Object類別中定義的方法,Java中允許使用finalize() 方法在垃圾收集器將物件從記憶體中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在銷毀物件時呼叫的,透過重寫finalize() 方法可以整理系統資源或執行其他清理工作。

5. Error 和Exception 有什麼區別?

Error 表示系統級的錯誤和程式不必處理的異常,是恢復不是不可能但很困難的情況下的一種嚴重問題;例如記憶體溢出,不可能指望程式能處理這樣的情況;

Exception 表示需要捕捉或需要程式處理的異常,是一種設計或實作問題;也就是說,它表示如果程式運作正常,從不會發生的情況。

6. 說出Servlet的生命週期,並說出Servlet和CGI的差異。

Servlet被伺服器實例化後,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,當伺服器決定將實例銷毀的時候呼叫其destroy()方法。

與CGI的區別在於Servlet處於伺服器進程中,它透過多執行緒方式運行其service方法,一個實例可以服務於多個請求,且其實例一般不會銷毀,而CGI對每個請求都產生新的進程,服務完成後就會銷毀,所以效率上低於Servlet。

7. 如何防止快取雪崩?

原因:

快取雪崩可能是因為資料未載入到快取中,或是快取同一時間大面積的失效,從而導致所有請求都去查資料庫,導致資料庫CPU和記憶體負載過高,甚至宕機。

對應解決:

採用加鎖計數,或使用合理的佇列數量來避免快取失效時對資料庫造成太大的壓力。這種辦法雖然能緩解資料庫的壓力,但是同時又降低了系統的吞吐量。

分析使用者行為,盡量讓失效時間點均勻分佈。避免緩存雪崩的出現。

如果是因為某台快取伺服器宕機,可以考慮做主備,例如:redis主備,但是雙重快取涉及到更新交易的問題,update可能讀到髒數據,需要好好解決。

8. 談談你對MVC的理解

MVC是Model—View—Controler的簡稱。即模型—視圖—控制器。 MVC是一種設計模式,它強制性的把應用程式的輸入、處理和輸出分開。

MVC中的模型、視圖、控制器它們分別擔負著不同的任務。

視圖: 視圖是使用者看到並與之互動的介面。視圖向使用者顯示相關的數據,並接受使用者的輸入。視圖不進行任何業務邏輯處理。

模型: 模型表示業務資料和業務處理,相當於JavaBean。一個模型能為多個視圖提供資料。這提高了應用程式的重用性。

控制器: 當使用者點擊Web頁面中的提交按鈕時,控制器接受請求並呼叫對應的模型去處理請求,然後根據處理的結果呼叫對應的視圖來顯示處理的結果。

MVC的處理過程:首先控制器接受使用者的請求,呼叫對應的模型來進行業務處理,並傳回資料給控制器。控制器呼叫對應的視圖來顯示處理的結果。並透過視圖呈現給使用者。

以上是java面試題最容易犯錯的8道的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn