文章目錄
- 1. 你是怎樣理解 OOP面向對象?
- 2. 重載與重寫區別
- 3. 接口與抽象類的區別
- 4. 深拷貝與淺拷貝的理解
- 5. 什么是自動拆裝箱? int和 Integer有什么區別
- 6. ==和 equals()區別
- 7. String類 能被繼承嗎為什么用 final修飾
- 8. final、finally、finalize區別
1. 你是怎樣理解 OOP面向對象?
面向對象是利于語言對現實事物進行抽象。面向對象具有以下特征:
- 繼承:繼承是從已有類得到繼承信息創建新類的過程
- 封裝:封裝是把數據和操作數據的方法綁定起來,對數據的訪問只能通過已定義
的接口 - 多態性:多態性是指允許不同子類型的對象對同一消息作出不同的響應
2. 重載與重寫區別
- 重載發生在本類,重寫發生在父類與子類之間
- 重載的方法名必須相同,重寫的方法名相同且返回值類型必須相同
- 重載的參數列表不同,重寫的參數列表必須相同
- 重寫的訪問權限不能比父類中被重寫的方法的訪問權限更低
- 構造方法不能被重寫
3. 接口與抽象類的區別
- 抽象類要被子類繼承,接口要被類實現
- 抽象類可以有構造器、接口不能有構造器
- 抽象類:可以有成員變量;接口:只能聲明常量
4. 深拷貝與淺拷貝的理解
深拷貝和淺拷貝就是指對象的拷貝,一個對象中存在兩種類型的屬性,一種是基本數據類型,一種是實例對象的引用。
- 淺拷貝是指,只會拷貝基本數據類型的值,以及實例對象的引用地址,并不會復
制一份引用地址所指向的對象,也就是淺拷貝出來的對象,內部的類屬性指向的
是同一個對象 - 深拷貝是指,既會拷貝基本數據類型的值,也會針對實例對象的引用地址所指向
的對象進行復制,深拷貝出來的對象,內部的類執行指向的不是同一個對象
5. 什么是自動拆裝箱? int和 Integer有什么區別
- 裝箱:將基本類型轉換成包裝類對象
- 拆箱:將包裝類對象轉換成基本類型的值
java 為什么要引入自動裝箱和拆箱的功能?
主要是用于 java集合中,List list=new ArrayList();
list 集合如果要放整數的話,只能放對象,不能放基本類型,因此需要將整數自動裝箱成對象。
區別:
- Integer是 int的包裝類,int則是 java的一種基本數據類型
- Integer變量必須實例化后才能使用,而 int變量不需要
- Integer實際是對象的引用,當 new一個 Integer時,實際上是生成一個指針指向此對象;而 int則是直接存儲數據值
- Integer的默認值是 null,int的默認值是 0
6. ==和 equals()區別
- ==
- 如果比較的是基本數據類型,那么比較的是變量的值
- 如果比較的是引用數據類型,那么比較的是地址值(兩個對象是否指向同一塊內
存)
- equals
- 如果沒重寫 equals方法比較的是兩個對象的地址值
- 如果重寫了 equals方法后我們往往比較的是對象中的屬性的內容
- equals 方法是從 Object類中繼承的,默認的實現就是使用==
很多類(如 String, Integer 等)都重寫了 equals() 方法,以提供邏輯上的比較。
7. String類 能被繼承嗎為什么用 final修飾
- 不能被繼承,因為 String類有 final修飾符,而 final修飾的類是不能被繼承的
- String 類是最常用的類之一,為了效率,禁止被繼承和重寫。
- 為了安全。String類中如果方法可以重寫,可能被植入惡意代碼,破壞程序。Java的安全性也體現在這里。
8. final、finally、finalize區別
-
final
final 是一個關鍵字,用于限定變量、方法、和類的行為:- 變量:當 final 修飾一個變量時,這意味著該變量一旦被初始化之后,其值就不能再被修改(即常量)。
- 方法:final 修飾的方法不能被子類重寫。
- 類:final 修飾的類不能被繼承。
-
finally
finally 是一個塊,通常與try和catch塊一起使用,在異常處理中起到關鍵作用。finally 塊中的代碼段總是會執行,無論try塊中的代碼是否拋出異常。這使得finally塊非常適合用于清理資源,比如關閉文件流或數據庫連接。
例如:
try {// 嘗試執行的代碼,可能會拋出異常
} catch (Exception e) {// 處理異常
} finally {// 清理代碼,無論是否發生異常都會執行
}
- finalize
finalize 用于對象被垃圾回收前的清理工作,但不建議使用。因為它是不可預測的,通常也不是必須的,而且可能導致性能問題。
@Override
protected void finalize() throws Throwable {try {// 清理資源等操作} finally {super.finalize();}
}