小豹子的 Java 面試知識點(一)基本功 Part 1

鳴謝:本文中 Java 知識點題目來源於微信公衆號「服務端思惟」,經做者受權後,做答併發布至掘金。數據庫

1 基本功

1.1 面向對象的特徵

封裝、繼承、多態。微信

  • 封裝:把客觀事物封裝成抽象的類,對調用者屏蔽細節,控制數據和方法的權限。
  • 繼承:使用現有類的全部功能,並在無需從新編寫原來的類的狀況下對這些功能進行擴展。
    繼承概念的實現方式有三類:實現繼承接口繼承可視繼承
    實現繼承是指使用基類的屬性和方法而無需額外編碼的能力;
    接口繼承是指僅使用屬性和方法的名稱、可是子類必須提供實現的能力;
    可視繼承是指子窗體(類)使用基窗體(類)的外觀和實現代碼的能力。
  • 多態:計算機程序運行時,相同的消息可能會送給多個不一樣的類別之對象,而系統可依據對象所屬類別,引起對應類別的方法,而有不一樣的行爲。簡單來講,所謂多態意指相同的消息給予不一樣的對象會引起不一樣的動做稱之。
    多態可分爲變量多態與函數多態。變量多態是指:基類型的變量(對於 Java 是引用)能夠被賦值基類型對象,也能夠被賦值派生類型的對象。函數多態是指,相同的函數調用界面(函數名與實參表),傳送給一個對象變量,能夠有不一樣的行爲,這視該對象變量所指向的對象類型而定。所以,變量多態是函數多態的基礎。

1.2 final, finally, finalize 的區別

  • final:用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
  • finally:是異常處理語句結構的一部分,表示老是執行。
  • finalize:是 Object 類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,能夠覆蓋此方法提供垃圾收集時的其餘資源回收,例如關閉文件等。JVM 不保證此方法總被調用。

PS:除了長得像,還有啥類似之處麼?併發

1.3 int 和 Integer 有什麼區別

項目 int Integer
是否爲對象
位於內存
默認值 0 null
什麼時候回收 隨執行棧彈出而回收 由 gc 回收
判斷值相等 == equals

擴展:

a. int 與 Integer 的應用場景分別是什麼

在阿里巴巴 Java 開發手冊的第一章第四項第八條中,有以下規定:框架

關於基本數據類型與包裝數據類型的使用標準以下:
1)【強制】全部的 POJO 類屬性必須使用包裝數據類型。
2)【強制】 RPC 方法的返回值和參數必須使用包裝數據類型。
3)【推薦】全部的局部變量使用基本數據類型。
說明:POJO 類屬性沒有初值是提醒使用者在須要使用時,必須本身顯式地進行賦值,任何 NPE 問題,或者入庫檢查,都由使用者來保證。
正例:數據庫的查詢結果多是 null,由於自動拆箱,用基本數據類型接收有 NPE 風險。
反例:好比顯示成交總額漲跌狀況,即正負 x%,x 爲基本數據類型,調用的 RPC 服務,調用不成功時,返回的是默認值,頁面顯示爲 0%,這是不合理的,應該顯示成中劃線。因此包裝數據類型的 null 值,可以表示額外的信息,如:遠程調用失敗,異常退出。ide

所以咱們得出,在業務邏輯上 null 值具備必定意義的,應該使用 Integer;不然使用 int 效率高。函數

b. 爲何 Integer 在 -128 至 127 範圍內時能夠用 == 判斷值相等

對於 Integer var = ? 在-128 至 127 範圍內的賦值,Integer 對象是在 IntegerCache.cache 產生,會複用已有對象,這個區間內的 Integer 值能夠直接使用 == 進行 判斷,可是這個區間以外的全部數據,都會在堆上產生,並不會複用已有對象,這是一個大坑, 推薦使用 equals 方法進行判斷。編碼

摘自阿里巴巴 Java 開發手冊。代理

1.4 重載和重寫的區別

重載(Overload)對象

重載是在一個類裏面,方法名字相同,而參數不一樣。返回類型能夠相同也能夠不一樣。每一個重載的方法(或者構造函數)都必須有一個獨一無二的參數類型列表。繼承

重載規則:

  • 被重載的方法必須改變參數列表(參數個數或類型或順序不同);
  • 被重載的方法能夠改變返回類型;
  • 被重載的方法能夠改變訪問修飾符;
  • 被重載的方法能夠聲明新的或更廣的檢查異常;
  • 方法可以在同一個類中或者在一個子類中被重載。
  • 沒法以返回值類型做爲重載函數的區分標準。

重寫(Override)

重寫是子類對父類的容許訪問的方法的實現過程進行從新編寫, 返回值和形參都不能改變。

方法的重寫規則

  • 參數列表必須徹底與被重寫方法的相同;
  • 返回類型必須徹底與被重寫方法的返回類型相同;
  • 訪問權限不能比父類中被重寫的方法的訪問權限更低。例如:若是父類的一個方法被聲明爲 public ,那麼在子類中重寫該方法就不能聲明爲 protected。
  • 父類的成員方法只能被它的子類重寫。
  • 聲明爲 final 的方法不能被重寫。
  • 聲明爲 static 的方法不能被重寫,可是可以被再次聲明。
  • 子類和父類在同一個包中,那麼子類能夠重寫父類全部方法,除了聲明爲 private 和 final 的方法。
  • 子類和父類不在同一個包中,那麼子類只可以重寫父類的聲明爲 public 和 protected 的非 final 方法。
  • 重寫的方法可以拋出任何非強制異常,不管被重寫的方法是否拋出異常。可是,重寫的方法不能拋出新的強制性異常,或者比被重寫方法聲明的更普遍的強制性異常,反之則能夠。
  • 構造方法不能被重寫。
  • 若是不能繼承一個方法,則不能重寫這個方法。

1.5 抽象類和接口有什麼區別

  • 抽象類能夠有方法實現,也能夠不實現方法;接口根本不存在方法的實現(Java 1.8 中添加了接口默認方法)。
  • 抽象類的子類使用 extends 來繼承抽象類,一個子類只能繼承一個父類(包括抽象類);接口的實現類使用 implements 來實現接口,實現類能夠實現多個接口。
  • 抽象類能夠有構造器;接口不能有構造器
  • 抽象方法能夠有public、protected和default這些修飾符;接口方法默認修飾符是public。你不可使用其它修飾符(Java 1.8 中容許在接口中使用 default)。

1.6 說說反射的用途及實現

反射,我的通俗的理解是:經過某種方式在運行期任意類進行操做(查找方法、字段,獲取方法參數表,執行方法,修改方法等),這種方式稱爲反射。 反射最大的應用就是框架,經過傳遞一個字符串值 去調用某一個類的方法。例如 Web框架中的路由器,絕大多數基於反射。另外註解操做、動態代理也要基於反射。

反射的實如今 Java 應用層面上講,是經過對 Class 對象的操做實現的,Class 對象爲咱們提供了一系列方法對類進行操做。在 Jvm 這個角度來講,Class 文件是一組以 8 位字節爲基礎單位的二進制流,各個數據項目按嚴格的順序緊湊的排列在 Class 文件中,裏面包含了類、方法、字段等等相關數據。經過對 Claas 數據流的處理咱們便可獲得字段、方法等數據。

相關文章
相關標籤/搜索