java語言基礎(三)----面向物件的三大特徵
1.面向物件的三大特徵
(1)封裝:隱藏物件的屬性和實現細節,僅對外提供公共訪問方式。
(2)繼承:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件。
通過繼承建立的新類稱為“子類”或“派生類”。
被繼承的類稱為“基類”、“父類”或“超類”。
繼承的過程,就是從一般到特殊的過程。
要實現繼承,可以通過“繼承”(Inheritance)和“組合”(Composition)來實現。
在某些 OOP 語言中,一個子類可以繼承多個基類。但是一般情況下,一個子類只能有一個基類,要實現多重繼承,可以通過多級繼承來實現。
優點:1.提高程式碼的複用性2.讓類與類之間產生關係,給多型提供前提。
缺點:打破了封裝性。
單繼承:一個子類只能有一個直接父類
多繼承:一個子類可以有多個直接父類。但是java中不允許出現,會出現不確定性,因為多個父類可能有相同成員。
在Java中可以用多實現來解決問題(實現多個介面),或者多層繼承。
注意:當本類中的成員和區域性變數同名用this區分
當子類與父類成員變數同名用super區分。this代表一個本類物件引用,super代表一個父類空間。
當子類與父類出現一模一樣的成員函式,會執行子類的函式,這種現象稱為覆蓋操作。
覆蓋注意事項:子類覆蓋父類方法時,子類許可權必須大於父類許可權。 靜態只能覆蓋靜態。
什麼時候執行覆蓋操作? 當對一個子類進行擴充套件時,子類需要保留父類的功能宣告,但又要定義子類中該功能的特有內容時,就要使用覆蓋操作來完成。
為什麼子類例項化的時候要訪問父類的建構函式? 子類繼承了父類,獲取了父類的屬性,所以在使用父類內容前要先看父類是 如何對自己內容初始化的。
(3)多型:指允許不同類的物件對同一訊息作出響應。即同一訊息可以根據傳送物件的不同而採取多種不同的行為方式。(訊息指的就是函式呼叫)
前提:繼承,重寫,父類只想子類物件。
作用:消除型別之間的耦合關係。
優點:提高擴充套件性,後期可維護性。
Java中多型的實現方式:介面實現,繼承父類進行方法重寫,同一個類中進行方法過載。
在java中,多型大致可以分為以下幾種情況:
1)person為父類,student為子類。那麼:person p=new student();
2)fliable為介面,bird為實現介面的類,那麼:fliable f=new bird();
3)fliable為抽象類,bird為繼承fliable的類,那麼:fliablef=new bird();
多型時需要說明p宣告為父類的引用,但他實際為子類引用。但是他只能呼叫父類中的方法。如果子類中的方法覆蓋了父類方法,那麼將呼叫父類方法(虛方法呼叫)。介面多型也是同樣的,也許你會問,如果f要呼叫自己的方法,那豈不是出錯了?其實這裡也是方法的覆蓋,因為實現介面的子類肯定會實現介面中的方法, 所以此種情況下呼叫的是bird中的方法。但是如果bird有一個方法在介面中沒有定義,那麼f不能呼叫。
那麼如果我聲明瞭person p=new student();我想將p轉為student的可不可以?當然可以,但是就得強制轉換了(兒子想成為父親直接來,父親想成為兒子你就強來)。也稱為向下轉型。通常用instanceof判斷物件的具體型別。
如:if(p instanceof student) { student s=(student)p;}