Java學習-06-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注意點:
-
super呼叫父類的構造方法,必須在構造方法的第一行。
-
super必須只能出現在子類的方法或者構造方法中。
-
super()和this()不能同時呼叫構造方法,因為它們都要放在第一行,有衝突。
this代表本身呼叫者這個物件
super代表父類物件
this()本類的構造,super()父類的構造。
重寫
因為靜態方法是類的方法,而非靜態方法是物件的方法。(靜態屬於類,非靜態屬於物件)
有static時,b呼叫了B類的方法,因為b是用B類定義的。
沒有static時,b呼叫了A類的方法,因為b是用A類new的。
重寫:需要有繼承關係,子類重寫父類的方法!
-
方法名必須相同。
-
引數列表必須相同。
-
修飾符:範圍可以擴大但不能縮小, public > protected > default > private
-
丟擲的異常:範圍,可以被縮小,但不能擴大;ClassNotFoundException --> Exception(大)
重寫,子類的方法和父類必須一致;方法體不同。static、final、private方法不能重寫。
為什麼需要重寫:
-
父類的功能,子類不一定需要,或者不一定滿足需求。
多型
即同一個方法可以根據傳送物件的不同而採取多種不同的行為方式。
1 Student s1 = new Student(); 2 Person s2 = new Student(); 3 Object s3 = new Student(); 4 // 這三個物件呼叫同一個方法時,結果可能不一樣,因為方法重寫了,該情況就是多型。
一個物件的實際型別是確定的,但可以指向物件的引用的型別有很多。
多型存在的條件:
-
有繼承關係。
-
子類重寫父類方法。
-
父類引用指向子類物件。
多型注意事項:
-
多型是方法的多型,屬性沒有多型性。
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