學習Java繼承之前,我們想回憶一下Java面向對象需要特別註意的幾個關鍵點。 面向對象是將複雜的事情簡單化了,它通過封裝的方式使得代碼的重用性更高和安全性更強。平時我們要學會用面向對象的方式去思考,去描述事物或行為。 想要使用OOP,一定要清楚其三個主要特征: 1.對象的行為(behavior): ...
學習Java繼承之前,我們想回憶一下Java面向對象需要特別註意的幾個關鍵點。
面向對象是將複雜的事情簡單化了,它通過封裝的方式使得代碼的重用性更高和安全性更強。平時我們要學會用面向對象的方式去思考,去描述事物或行為。
想要使用OOP,一定要清楚其三個主要特征:
1.對象的行為(behavior):你可以對對象施加哪些操作,或可以對對象施加哪些方法。
2.對象的狀態(state):當施加那些操作時,對象會如何響應。
3.對象標識(identity):如何辨別具有相同行為與狀態的不同對象。
同一個類的所有對象實例,由於支持相同的行為而具有家族式的相似性。對象的行為是可調用的方法定義的。此外,每個對象都保持著描述當前特征的信息。對象的狀態可能會隨著時間而發生改變,但是這種改變不會是自發的。對象的改變必須通過調用方法實現。
一、類之間的關係
* 依賴(“uses-a”)
* 聚合("has-a")
* 繼承(“is-a”)
在這裡我舉一個我們日常購物的小慄子,來簡單說明一下這三種關係的不同之處。我們在某寶上下了一筆訂單,在訂單的處理系統中就會出現一些名詞:
比如:商品(Item)、訂單(Order)、送貨地址(Shipping address)、付款(payment)、賬戶(Account)等。它們被程式員設置到不同的類當中。
依賴,就好比一個類的方法操縱另一個類的對象。你下單的時候,Order類可能會使用Account類,應為Order對象要訪問Account對象的信用信息。(你可以往大數據或銀行信用借代那方面想象)
聚合,聚合意味著類A的對象包含類B的對象。就像一個Order對象必將包含Item對象。
繼承(inheritance),就像RushOrder類是由Order類繼承而來的。下麵我們將具體介紹繼承的相關知識點。
二、繼承的重要講解
在我看來,繼承是一種積極的勇於擁抱變化的樂觀心態的具體實現方法。是從已有類當中創建新類的過程。從繼承當中能夠看到產品的派生、升級和擴展。
1.繼承的語法
關鍵字extends表明新類派生於一個已經存在的類中。這個已經存在的類叫做父類,派生出來的類叫做子類。
比如:
class A extends B { }//A類派生於B類
2.繼承中的初始化順序
簡單來說,類的內部結構常見形態有四種:
1)屬性(包括類屬性和實例屬性)
2)方法(包括類方法和實例方法)
3)構造器
4)初始化塊(包括類的初始化塊和實例的初始化塊)
對於繼承中的初始化順序,可分為類的初始化和對象的初始化。
1)繼承中類的初始化:(前提:父類中的屬性和方法沒有private修飾)
在JVM裝在類的準備階段,先為類的所有類屬性和類初始化塊分配記憶體空間。併在首次初始化階段蘇紅為其進行初始化,類屬性和類初始化塊之間的定義時的順序決定了其初始化的順序。若存在父類,則首先初始化父類屬性和類初始化塊,一種上溯到Object類最先執行。
2)繼承中對象初始化:(前提:父類中的屬性和方法沒有private修飾)
在new創建新對象時,首先對對象屬性和初始化代碼塊分配記憶體,並執行預設的初始化。如果存在父類,則先搞好父類的。然後執行父類構造器中的初始化程式,接著才開始對子類的對象屬性和初始化執行初始化。
3.繼承中的隱藏
訪問控制符的帶來的訪問許可權,在上一篇的博客中我已經用表格的形式展示了。這裡不再贅述。
當子類繼承父類,子類可以繼承父類中具有訪問控制許可權的屬性和方法(不要被private修飾就可以了),對於用了private修飾的的父類所有的屬性和方法,子類就繼承不來了。
當子類需要改變繼承過來的方法時,就需要用到重寫方法了。一旦重寫後,父類的方法對子類來說就表現為隱藏。你再想調用,就將調用重寫後的子類當中的方法了。
當你重寫了,還想調用父類,可以用兩種方法:
1)將子類對象類型強制轉換為父類類型,進行強調;
2)通過super.調用,註意它一定要被寫到第一行。格式:super.method()
4.註意事項總結:
1)在子類構建對象時,先構建父類,再構建子類。
2)在方法調用的時候,永遠永遠永遠是先在子類中找,子類中如果沒有,再去父類中找。
代碼示例:
1 public class JiC { 2 public JiC() { 3 System.out.println("我是父類"); 4 } 5 6 public void method() { 7 System.out.println("我是父類中的一個方法"); 8 } 9 }
1 class B extends JiC { 2 public B() { 3 System.out.println("我是子類"); 4 } 5 6 public void method() { 7 System.out.println("我是子類中的一個方法"); 8 } 9 } 10 11 public class JiC2 { 12 public static void main(String[] aegs) { 13 System.out.println("上面示例的列印結果是:"); 14 B b = new B(); 15 b.method(); 16 } 17 }