1. 程式人生 > >最容易犯錯的8 道java面試題,看你會不會踩雷?

最容易犯錯的8 道java面試題,看你會不會踩雷?

0x0. static 和 final 的用法

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

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

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

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

(2)靜態方法只能訪問靜態資料;

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

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

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

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

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

final修飾的類不能被繼承;

0x1. 抽象類和介面的區別,類可以繼承多個類嗎,介面可以繼承多個介面嗎,類可以實現多個介面嗎?

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

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

介面只能做方法宣告,抽象類中可以做方法宣告,也可以做方法實現

接口裡定義的變數只能是公共的靜態的常量,抽象類中的變數是普通變數。

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

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

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

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

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

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

小編是一個有著5年工作經驗的java程式設計師,對於java,自己有做資料的整合,一個完整學習java的路線,學習資料和工具,相信這裡有很多學習java的小夥伴,我創立了一個2000人學習扣群,479121291。每晚都有java的直播課程。無論是初級還是進階的小夥伴小編我都歡迎!

0x2. 說出Servlet的生命週期,並說出Servlet和CGI的區別。

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

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

0x3. 談談你對MVC的理解

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

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

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

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

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

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

0x4. 如何防止快取雪崩?

原因:

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

對應解決:

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

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

如果是因為某臺快取伺服器宕機,可以考慮做主備,比如:redis主備,但是雙快取涉及到更新事務的問題,update可能讀到髒資料,需要好好解決。

0x5. this和super的功能和用法

this :

(1) 能訪問除構造方法以外所有的屬性、方法,通過this.來呼叫方法和屬性

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

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

super :訪問父類的方法和屬性

(1) 訪問父類的方法和屬性;

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

0x6. final, finally, finalize 的區別?

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

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

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

0x7. Error 和 Exception 有什麼區別?

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

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