1. 程式人生 > >Java面向對象知道這些就夠了

Java面向對象知道這些就夠了

每一個 多個 原則 動手 str 思維方式 code 產生 對象的引用

面向對象

面向對象是一種思維方式,相對於面向過程而言的。
面向過程在流程中關註動作執行的每一個細節 — 自己動手做
面向對象重點找這個對象,只要找到了對象,那麽這個對象所具有的功能就能夠被使用 — 找別人做
類與對象的關系
根據一類對象進行抽取和總結,將這類對象的特征抽取成了屬性,將這類對象的行為抽取成了方法,用類表示這一類對象 -> 類是對象的抽取和概括的過程

面向對象的特征


封裝
將代碼進行提取和總結,抽取成不同的形式 — 封裝
體現形式:方法、類(屬性的私有化 - 將屬性限制為私有的,然後提供對外的設置和獲取的方法,然後在方法中進行限制使數據更加符合常理)
優勢:提高了代碼的復用性,保證了數據的合法性
權限修飾符
指在Java中用於限定使用範圍的關鍵字
本類中 子類中 同包類中 其他類中
public 可以 可以 可以 可以
protected 可以 可以 可以 不可以
默認 可以 同包子類可以 可以 不可以
private 可以 不可以 不可以 不可以
繼承


如果一些類中含有相同的代碼,那麽可以將這些相同的代碼提取到一個新的類中,然後通過extends關鍵字讓原來的類和新的類產生關系 — 繼承。 通過繼承,原來的類就稱之為了子類(派生類),新的類就成了父類(超類/基類)。
子類通過繼承父類可以使用父類中的一部分方法和屬性
註意:子類繼承了父類的全部的數據域(方法+屬性),但是繼承之後只有一部分數據域對子類可見
在Java中,支持的是類和類之間的單繼承 -> 一個子類只能繼承一個父類,但是一個父類可以有多個子類
單繼承一定優於多繼承嗎? - 不對
多繼承比單繼承能夠更好的提高代碼的復用性

1 class A {
2     public
int m(){return 9;} 3 } 4 class B { 5 public boolean m(){return false;} 6 } 7 class C extends A, B{} 8 C c = new C(); 9 c.m(); // 返回值類型能確定嗎?

多繼承導致在調用方法的時候可能產生歧義
優勢:提高代碼的復用性,避免方法的調用產生歧義
super關鍵字
在子類中用於表示父類對象的引用,可以在子類中調用父類中的方法的屬性。
super語句 — 子類在繼承父類之後,子類的構造方法中會含有一個super語句。如果沒有手動指定super語句,那麽默認使用super()調用父類無參的構造;如果父類只提供了含參構造,那麽子類就必須手動提供對應形式的super語句 — super語句必須在子類構造方法的首行
方法的重寫/覆蓋


在父子類中存在了方法簽名相同的非靜態方法。遵循 “兩等兩小一大”原則:
1. 方法簽名相同
2. 如果父類中的方法的返回值類型是基本類型/void,那麽子類重寫的方法的返回值類型與父類一致

1 class A {
2     public void m(){}
3 }
4 class B extends A {
5     public void m(){}
6 }

3.如果父類中的方法的返回值類型是引用類型,那麽子類在重寫方法的時候,返回值類型要麽與父類一致,要麽是父類方法返回值類型的子類

1 class A {}
2 class B extends A {}
3 class  C {
4     public A m(){return null;}
5 }
6 class D extends C {
7     public B m(){return null;}
8 }

4.子類重寫的方法的權限修飾符的範圍要大於等於父類中對應方法的權限修飾符的範圍

1 class A {
2     public void m(){}
3 }
4 class B extends A {
5     public void m(){}
6 }

註意:如果父類中的方法用private修飾,那麽這個方法對子類不可見,所以此時與子類中的方法構不成重寫

多態

編譯時多態:方法的重載
add(2, 4) -> add(int, int)
add(3, 1, 7) -> add(int, int, int)
運行時多態:向上造型和方法的重寫 — 基於繼承的
註意:如果使用向上造型來創建對象,那麽這個對象所能調用的方法看的是父類中的聲明,方法如何執行看的是子類中的實現過程
重寫的理解
1. 子類重寫的方法的權限修飾符的範圍要大於等於父類中對應方法的權限修飾符的範圍
2. 如果父類中的方法的返回值類型是引用類型,那麽子類在重寫方法的時候,返回值類型要麽與父類一致,要麽是父類方法返回值類型的子類
註意:Java中所有的基本類型之間沒有繼承關系,之所以能夠自動提升,是因為所表示的範圍是否能夠包含

Java面向對象知道這些就夠了