1. 程式人生 > >java語言基礎(三)----面向物件的三大特徵

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;}