JAVA SE 之三大特性:封裝、繼承、多態
一、封裝
1.概念
將類的某些信息隱藏在類的內部,不允許外部程序的直接訪問,而是通過該類提供的方法來實現對隱藏信息的操作和訪問。
2.好處
- 只能通過規定的方法訪問數據
- 隱藏類的實例細節,方便修改和實現
3.封裝的實現步驟
- 修改屬性的可見性 列如:設爲private
- 創建getter/setter方法:用於屬性的讀寫
- 在getter/setter方法中加入屬性的控制語句:對屬性的合法性進行判斷
補充:
Java中的訪問修飾符
訪問修飾符: 可以修飾屬性和方法的訪問範圍
訪問修飾符 | 本類 | 同包 | 子類 | 其他 |
---|---|---|---|---|
private | √ | |||
默認 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
Java中this關鍵字
this關鍵字代表當前對象
this屬性 操作當前對象的屬性
this方法 調用當前對象的方法
總結:
封裝把一個對象的屬性私有化,同時提供一些可以被外界訪問的屬性的方法,如果屬性不想被外界訪問,我們大可不必提供方法給外界訪問。但是如果一個類沒有提供給外界訪問的方法,那麼這個類也沒有什麼意義了。
二、繼承
1.概念
繼承是類與類之間的一種關係,
注意:
-
Java中的繼承是單繼承(一個類只有一個父類)
-
private屬性不能被子類繼承
2.繼承的好處:
- 子類擁有父類的所有屬性和方法
- 實現代碼的複用
3.語法規則
class 子類 extends 父類
class Dog extends Animal{
.....
}
4.方法的重寫
- 如果子類對父類的方法不滿意,是可以重寫父類繼承的方法的,當調用方法時會優先調用子類的方法。
- 語法規則 a:返回值類型 b:方法名 c:參數類型及個數 都要與父類繼承的方法相同,才叫方法的重寫。
5.繼承的初始化順序
①初始化父類在初始子類
②先執行初始化對象中的屬性,再執行構造方法中的初始化
圖解:
父類對象-----》屬性初始化-----》構造柱方法
|
|
|
/
子類對象-----》屬性初始化-----》構造柱方法
6.final關鍵字
- 使用final關鍵字做標識有“最終的含義”
- final可以修飾類、方法、屬性和變量
- final修飾類:則該類不允許被繼承
- final修飾方法:則該方法不予許被覆蓋(重寫)
- final修飾屬性:則該類的屬性不會進行隱試的初始化(類的初始化必須有值)或者在構造方法中賦值(但只能選擇其一)
- final修飾變量:則該變量的值只能賦一次值,即變爲常量
7.super關鍵字
在對象的內部使用,可以代表父類的對象
-
訪問父類的屬性
super.age
-
訪問父類的方法
super.eat()
注意:
- 子類的構造的過程當中必須調用其父類的構造方法
- 如果子類的構造方法沒有顯示父類的構造方法,則系統默認調用父類無參的構造方法。
- 如果顯示的調用構造方法,必須在子類的構造方法的第一行
- 如果子類構造方法中既沒有顯示調用父類的構造方法,而父類又沒得無參的構造方法,則編譯出錯
8.Object類
Object類是所有類的父類,如果一個類沒有使用extends關鍵字明確標識繼承另外 的一個類,那麼這個類默認繼承Object類,Object類中的方法。適合所有子類
- toString()方法
- 在Object類裏面定義toString()方法的時候返回的對象的哈希code(對象地址字符串)
- equals()方法
- 比較的是對象的引用是否是指向同一塊內存地址
總結:
繼承是使用已存在的類的定義作爲基礎建立新類的技術,新類的定義可以增加新的數據或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。通過使用繼承我們能夠非常方便地複用以前的代碼。
三、多態
1.概念:
對象的多種形態
- 引用多態
- 父類的引用可以指向本類的對象
- 父類的引用可以指向子類的對象
- 方法多態
- 創建本類對象時,調用的方法時本類的方法
- 創建子類的方法時,調用的方法爲子類重寫的方法或者是繼承的方法
2.引用類型轉換
- 向上類型的轉換(隱式/自動類型轉換),是小類型到大類型的轉換
- 向下類型的轉換(強制類型的轉換),是大類型到小類型
- instanceof運算符,來解決引用對象的類型,避免類型轉換的安全性問題
3.抽象類
- 語法定義:抽象類前使用abstract關鍵字修飾,則該類爲抽象類
- 應用場景
- 在某些情況下,某個父類只是知道其子類應該包含怎樣的方法,但無法準確知道這些子類如何實現這些方法
- 從多個具有相同特徵的類中抽出一個抽象類,以這個抽象類作爲子類的模板,從而避免子類設計的歲隨意性
- 作用:限制規定自子類實現某些方法。但不關注實現細節
- 使用規則
- abstract 定義抽象類
- abstract 定義抽象方法,只有聲明,不需要實現
- 包含抽象方法的類是抽象類
- 抽象方法可以包括普通方法,也可以沒有抽象方法
- 抽象類不能直接創建,可以定義引用變量
4.接口
-
接口概念:接口可以理解爲一種特殊的類。由全局常量和公共的抽象方法所組成
-
類是一種具體的實現體,而接口定義某一批所需要遵守的規範,接口不關心這些類的內部數據,也不關心這些類方法的實現細節,它只規定這些類裏必須提供某些方法
-
接口定義:
- 和類定義不同,定義接口不再使用class關鍵字,而是使用interface關鍵字
- 常量中的屬性是常量,即使定義時不添加,public static final 修飾符 ,系統也會自動加上
- 接口中的方法只能是抽象方法,總是使用,即使定義時不添加public abstract 修飾符 ,系統也會自動加上
-
語法格式
[修飾符] interface 接口名[extends 父接口1,父接口2..] { 零個到多個常量定義... 零個到多個抽象方法的定義... }
注意:
接口就是用來被繼承的,被實現的,修飾符一般建議用public
不能使用private 和protected修飾接口
接口是可以多繼承的
-
使用接口
-
一個類可以實現一個或者多個接口,實現接口使用implements關鍵字,Java中的一個類只能繼承一個父類,是不夠靈活的,通過實現多個接口可以做補充。
-
繼承父類實現接口的語法
[修飾符] class 類名 extends 父類 implements 接口1,接口2... { 類體部分//如果繼承了抽象類,需要實現繼承的抽象方法;要實現接口中的抽象方法。 }
注意:
如果要繼承父類,繼承父類必須在實現接口之前
總結:
所謂多態就是指程序中定義的引用變量所指向的具體類型和通過該引用變量發出的方法調用在編程時並不確定,而是在程序運行期間才確定,即一個引用變量到底會指向哪個類的實例對象,該引用變量發出的方法調用到底是哪個類中實現的方法,必須在由程序運行期間才能決定。
在Java中有兩種形式可以實現多態:繼承(多個子類對同一方法的重寫)和接口(實現接口並覆蓋接口中同一方法)。
-