1. 程式人生 > 其它 >Java學習-06-Java面向物件

Java學習-06-Java面向物件

Java面向物件

內容概要:

1. 面向物件程式設計

2. 類與物件的關係

3. 建立和初始化物件

4. 構造器

5. 建立物件記憶體分析

6. 封裝

7. 繼承

8. 多型

9. 抽象類

10. 介面

11. 介面&抽象類

12. 內部類

面向物件程式設計

面向物件程式設計(Object-Oriented Programming,OOP)的本質就是:以類的方式組織程式碼,以物件的形式封裝資料。

抽象:程式設計思想!持續學習

三大特性:

  • 封裝

  • 繼承

  • 多型

從認識論角度考慮是先有物件後有類。物件,是具體的事物。類,是抽象的,是對物件的抽象。

從程式碼執行角度考慮是先有類後有物件。類是物件的模板。

面向過程&面向物件

面向過程思想:

  • 步驟清晰簡單,第一步做什麼,第二步做什麼......

  • 面向過程適合處理一些較為簡單的問題。

面向物件思想:

  • 物以類聚,分類的思維模式,思考問題首先會解決問題需要哪些分類,然後對這些分類進行單獨思考,最後,才對某個分類下的細節進行面向過程的思索。

  • 面向物件適合處理複雜的問題,適合處理需要多人協作的問題。

對於描述複雜的事物,為了從巨集觀上把握、從整體上合理分析,我們需要使用面向物件的思路來分析整個系統。但是,具體到微觀操作,任然需要面向過程的思路去處理。

類與物件的關係

類是一種抽象的資料型別,它是對某一類事物的整體描述或定義,但是並不能代表某一個具體的事物。如:動物、植物等。

物件是抽象概念的具體例項。例如:張三就是人的一個具體例項。

建立和初始化物件

使用new關鍵字建立物件

使用new關鍵字建立的時候,除了分配記憶體空間之外,還會給建立好的物件進行預設的初始化以及對類中構造器的呼叫。

類中的構造器也稱為構造方法,是在進行建立物件的時候必須要呼叫的。並且構造器有以下2個特點:

  • 必須和類的名字相同

  • 必須沒有返回型別,void也不能寫。

構造器

構造器:

  • 和類同名

  • 沒有返回值

作用:

  • new本質就是在呼叫構造方法

  • 初始化物件的值

注意點:

  • 定義了有參構造之後,如果想使用無參構造,需要顯示的定義一個無參構造。

建立物件記憶體分析

封裝

該露的露,該藏的藏

  • 我們程式設計要追求”高內聚,低耦合“。高內聚就是類的內部資料操作細節自己完成,不允許外部干涉;低耦合:僅暴露少量的方法給外部使用。

封裝(資料的隱藏)

  • 通常,應禁止直接訪問一個物件中資料的實際表示,而應通過操作介面來訪問,這稱為資訊隱藏。

記住這句話就夠了:屬性私有,get/set

封裝的好處

  • 提高程式的安全性,保護資料。

  • 隱藏程式碼的實現細節。

  • 統一介面。

  • 提高系統的可維護性。

繼承

繼承的本質是對某一批類的抽象,從而實現對現實世界更好的建模。

extends的意思是擴充套件。子類是父類的擴充套件。

Java中類只有單繼承,沒有多繼承!

繼承是類和類之間的一種關係。除此之外,類和類之間的關係還有依賴、組合、聚合等。

繼承關係的兩個類,一個為子類(派生類),一個為父類(基類)。子類繼承父類,使用關鍵字extends來表示。

子類和父類之間,從意義上講應該具有”is a“的關係。

子類擁有父類的屬性和方法(非私有的)。私有的東西無法被繼承。

Object類是所有類的父類。

super注意點:

  1. super呼叫父類的構造方法,必須在構造方法的第一行。

  2. super必須只能出現在子類的方法或者構造方法中。

  3. super()和this()不能同時呼叫構造方法,因為它們都要放在第一行,有衝突。

this代表本身呼叫者這個物件

super代表父類物件

this()本類的構造,super()父類的構造。

重寫

因為靜態方法是類的方法,而非靜態方法是物件的方法。(靜態屬於類,非靜態屬於物件)

有static時,b呼叫了B類的方法,因為b是用B類定義的。

沒有static時,b呼叫了A類的方法,因為b是用A類new的。

重寫:需要有繼承關係,子類重寫父類的方法!

  1. 方法名必須相同。

  2. 引數列表必須相同。

  3. 修飾符:範圍可以擴大但不能縮小, public > protected > default > private

  4. 丟擲的異常:範圍,可以被縮小,但不能擴大;ClassNotFoundException --> Exception(大)

重寫,子類的方法和父類必須一致;方法體不同。static、final、private方法不能重寫。

為什麼需要重寫:

  1. 父類的功能,子類不一定需要,或者不一定滿足需求。

多型

即同一個方法可以根據傳送物件的不同而採取多種不同的行為方式。

1  Student s1 = new Student();
2  Person s2 = new Student();
3  Object s3 = new Student();
4  // 這三個物件呼叫同一個方法時,結果可能不一樣,因為方法重寫了,該情況就是多型。

一個物件的實際型別是確定的,但可以指向物件的引用的型別有很多。

多型存在的條件:

  • 有繼承關係。

  • 子類重寫父類方法。

  • 父類引用指向子類物件。

多型注意事項:

  1. 多型是方法的多型,屬性沒有多型性

參考:java父類強制轉換為子類

1  // 父類強制轉子類
2  Father f = new Father();
3  Son s = (Son)f;// 出錯 ClassCastException
4  // “假的”父類強制轉子類
5  Father f = new Son();
6  Son s = (Son)f;// 可以
7  // 子類強制轉父類
8  Son s = new Son();
9  Father f = (Father)s;// 可以

instanceof關鍵字 判斷一個物件是什麼型別

用來測試一個物件是否為一個類的例項。

擴充套件:靜態匯入包:呼叫是可以直接寫方法名進行呼叫。(不常用,瞭解即可)

抽象類

abstract修飾符可以用來修飾方法也可以修飾類,如果修飾方法,那麼該方法就是抽象方法,如果修飾類,那麼改類就是抽象類。

抽象類中可以沒有抽象方法,但是有抽象方法的類一定是宣告為抽象類。

抽象類,不能使用new關鍵字來建立物件,它是用來讓子類繼承的。

抽象方法,只有方法的宣告,沒有方法的實現,它是用來讓子類實現的。

子類繼承抽象類,那麼就必須實現抽象類沒有實現的抽象方法,否則該子類也要宣告為抽象類。

抽象類存在構造方法,構造方法不可繼承,但是可以供子類用super()或者super(引數,引數。。。。)呼叫。

介面

普通類:只有具體實現。

抽象類:具體實現和規範(抽象方法)都有。

介面:只有規範(抽象方法)。

介面就是規範,定義的是一組規則,體現了現實世界中“如果你是...則必須能...”的思想。如果你是天使,則必須飛。如果你是汽車,則必須跑...

介面的本質是契約,就像我們人間的法律一樣。置定好以後大家都遵守。

介面不能被例項化,介面中沒有構造方法。

OOP的精髓就是對物件的抽象,最能體現這一點的就是介面。

介面&抽象類

“以用為本”。在討論介面和抽象類的區別時,我也想從“用”的角度試著總結一下區別,所以我想到了設計目的。

介面的設計目的,是對類的行為進行約束,可以強制要求不同的類具有相同的行為。它只約束了行為的有無,但不對如何實現行為進行限制。而抽象類的設計目的,是程式碼複用。可以將很多類共有的方法提取出來,構成一個抽象類,讓子類繼承。

參考:知乎介面和抽象類有什麼區別

內部類

內部類就是在一個類的內部再定義一個類,比如,A類中定義一個B類,那麼B類相對A類來說就稱為內部類,而A類相對B類來說就是外部類了。

  • 成員內部類

  • 靜態內部類

  • 區域性內部類

  • 匿名內部類

參考課程:狂神說Java