Java面向物件三大特性-封裝、繼承、多型
在講Java面向三大特性之前,我們先了解一下訪問修飾符的訪問範圍:
(1):private:同類中具有訪問許可權。
(2):protected:本類 和同包以及不同包的子類才具有訪問許可權。
(3):public:統一工程中都具有訪問許可權。
(4):預設 本類和同包範圍內具有訪問許可權。
一、Java面向物件三大特性之封裝。
封裝就是將類的某些資訊隱藏在類的內部,不允許外部程式直接訪問,外部程式需要通過該類提供的方法對隱藏的資訊進行訪問。(比如將類的屬性私有化,通過提供的get 、set方法對私有化的屬性進行操作)。
封裝的好處:外部程式只能通過特定的方法訪問資料,確保資料的安全。隱藏類內部例項細節,方便修改和實現。
二、Java面向物件三大特性之繼承(extends)
2.1、概念:繼承實際上就是一種“is-a”的關係。比如說:運動類和羽毛球運動的關係。羽毛球運動是運動的一種,所以我們可以說 羽毛球運動是運動類(is-a)。這裡的運動類是羽毛球運動的父類或者基類。羽毛球運動是運動的派生類或者叫做子類。
語法規則:子類 extends 父類。
如:public class BadmintonSport extends Sport{
}
2.2、繼承的好處:1):子類可以繼承父類除private修飾的屬性和方法以及構造器外的所有方法和屬性。實現了程式碼的複用。
2):方法的重寫,子類可以根據自身業務需求,對父類繼承過來的方法進行重寫。方法重寫後,呼叫時候就會優先呼叫子類的方法。
2.3、繼承的壞處:基類發生變動所有子類都跟著一起變動。依賴性強。
2.4、繼承的初始化問題。
1):當我們例項化子類物件的時候,Java程式的執行順序是這樣的:父類物件的屬性初始化=======》父類物件的構造方法初始話=====》子類物件屬性初始化=====》子類物件構造方法初始化。
2):子類在構造的過程中必會呼叫父類的構造方法。如果我們沒有顯式的在子類中呼叫父類的構造方法,則預設呼叫父類的午無參構造方法。
3):在子類中顯式的呼叫父類的構造方法時候,呼叫必須是在子類構造方法中的第一行,否則會報錯。
4):注意:如果我們沒有在子類構造 方法中顯式呼叫父類的某個構造方法而父類中又沒有無參構造方法,則程式碼會報錯。
2.5、Java中的繼承都是單繼承。
三、Java面向物件三大特性之多型。
根據我們上面對繼承的講解,我們知道一個類可能有多個子類,不同的子類的具體實現方法都封裝在不同的類中,當我們要使用的時候必須要強制轉換成相應的型別,才能呼叫對應的方法去實現。如果一個類具有多個子類的時候,我們如果都要這樣做的話,會出現很多冗餘的程式碼,使程式變的繁瑣。從程式碼優化角度看,這肯定不是最優的。效能也不是最好的。那麼這個問題如何去解決呢?利用Java多型就能解決這個問題。
多型的概念:不同的事物對同一行為具有不同的 形態。
例:
從程式執行上看,Animal(父類)的引用指向Dog、Cat(子類)的例項,動物都有吃飯和跑的行為,但是每種動物吃的東西和跑的方式可能不同,我們需要將某種動物具體的這種行為進行復寫,不同的例項呼叫體現出不同的結果。這就是多型的一種體現。
2):多型實現的必要條件:繼承或者實現介面、方法重寫、父類引用指向子類物件(向上轉型)
3):向上轉型的有點:繼承使我們知道該類是父類的擴充套件,子類能提供比父類更強大的功能,我們定義一個指向子類物件的父類引用,這樣我們不僅可以使用父類的共性外,還能使用子類更強大的功能。
4):雖然向上轉型能使我們不僅可以使用父類的共性還能使用子類的擴充套件,但是向上轉型也存在一定的缺陷,比如:向上轉型會導致某些屬性和方法的缺失,導致我們不能引用他們,也就是說:父類引用只能呼叫父類具有的屬性和方法,對於那些在子類中特有的方法是不能夠呼叫的。
從執行結果看,我們可以看出,先是執行狗的run()方法,然後執行的是父類Animal 的eat()方法,為什麼呢?因為我們在子類中重寫了Animal 的run()方法,這個方法就是Dog類特有的,所以父類引用ad是不能呼叫的,而我們Animal的eat方法在Dog子類是沒有重寫的,所以ad呼叫的是父類的eat()方法。