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程序員精選高頻面試筆試真題,來幫助大家攻下BAT的offer,題目範圍從初級的Java基礎到高級的分佈式架構等等一系列的面試題和答案,用於給大家作爲參考,需要的可以加入爬坑之路:【860113481】免費獲取

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章