概述
封裝: 物件代表什麼, 就得封裝對應的資料, 並提供資料對應的行為. 利用封裝, 就可以把一些零散的資料和一些行為封裝為一個整體, 這個整體就是物件.
假設現在要在方法當中列印學生的資訊, 如果沒有封裝, 那麼就要把這些零散的資料全部單獨地傳遞給方法, 那麼方法就要寫很多很多的引數. 但是有了封裝之後, 就可以將這些引數作為一個整體, 即物件傳遞給方法.
但是當這樣的 Javabean 類越來越多之後, 問題就會出現了. 假設現在又有了第二個 Javabean 類去描述老師, 老師和學生這兩個 Javabean 類有大量重複的程式碼. 於是可以將兩個 Javabean 類中相同的程式碼全部抽取出來放到另一個位置, 這兩個 Javabean 類共同取用這個位置的程式碼.
Java 中提供了一個關鍵字 extends,利用這個關鍵字,就可以讓一個類和另一個類建立起繼承關係。例如:
public class Student extends Person{}
Student 稱為子類或派生類,Person 稱為父類或基類、超類。
子類自動獲得父類功能。
子類可以覆蓋父類中的方法。覆蓋的意思是子類重新定義繼承下來的方法,以改變或延伸此方法的行為。
使用繼承的好處:
-
可以把多個子類中重複的程式碼抽取到父類中,提高了程式碼的複用性。
-
子類可以在父類的基礎上,增加其他的功能,使子類更強大。
關於繼承最主要的需要學會的內容:
-
自己設計一個繼承結構並將程式碼寫出來。
-
學會使用別人已經寫好的繼承結構。
-
子類可以從父類中繼承哪些內容?
-
繼承中,成員變數的訪問特點。
-
繼承中,成員方法的訪問特點。
-
繼承中,構造方法的訪問特點。
-
This 和 super 的使用方法。
什麼時候使用繼承: 當類與類之間,存在相同(共性)的內容,並滿足子類是父類中的一種,就可以考慮使用繼承,來最佳化程式碼。
繼承的特點:Java 中只支援單繼承,不支援多繼承,單支援多層繼承。
單繼承:一個子類只能繼承一個父類。
不支援多繼承:子類不能同時繼承多個父類。
多層繼承:子類 A 繼承父類 B,父類 B 可以繼承自父類 C。C 是 A 的間接父類,B 是 A 的直接父類。
Java 中有一個最大的祖類,叫做 Object。這個類是 Java 提前寫好的,每一個類都直接或間接繼承自 Object。如果寫了一個類,沒有指定其繼承自哪個類,就預設其直接繼承自 Object 類。這是在虛擬機器執行的時候自動幫我們加上去的, 如果當前類有父類, 那虛擬機器不做其他操作, 如果當前類沒有指定父類, 則虛擬機器會自動增加一個 Object 類作為當前類的父類。
指定了父類的類間接繼承自 Object 類。
當 Java 的類寫得越來越多時,就形成了一個繼承體系。在繼承體系最上面的類就預設是繼承自 Object 類,下面的所有的類都是間接地繼承自 Object。在繼承體系中,任何一個子類,既可以使用直接父類裡面的內容,也可以使用間接父類裡面的內容,但是不能使用類似於叔叔類的內容。
子類只能訪問父類中非私有的成員, 即不是用 private 修飾的內容.
練習:
繼承的練習(自己設計一個繼承體系)
現在有四種動物:布偶貓、中國狸花貓、哈士奇、泰迪。
暫時不考慮屬性,只要考慮行為。
請按照繼承的思想特點進行繼承體系的設計。
四種動物分別有以下的行為:
布偶貓:吃飯、喝水、抓老鼠
中國狸花貓:吃飯、喝水、抓老鼠
哈士奇:吃飯、喝水、看家、拆家
泰迪:吃飯、喝水、看家、蹭一蹭
思路:
採用畫圖法,從下往上畫圖,下面是子類,上面是父類,將子類中的共性內容抽取到父類中。
書寫程式碼要從上往下寫。
Javabean 類:
public class Animal {
public void eat() {
System.out.println("吃飯");
}
public void drink() {
System.out.println("看家");
}
}
Javabean 類:
public class Cat extends Animal {
public void catchRat() {
System.out.println("貓抓老鼠");
}
}
Javabean 類:
public class Dog extends Animal {
public void watchDoor() {
System.out.println("狗在看家");
}
}
Javabean 類:
public class RollCat extends Cat {
}
Javabean 類:
public class LiHua extends Cat {
}
Javabean 類:
public class Husky extends Dog {
public void destroyHome() {
System.out.println("哈士奇在拆家");
}
}
Javabean 類:
public class Teddy extends Dog {
public void touch() {
System.out.println("泰迪在蹭一蹭");
}
}
測試類:
public class Test {
public static void main(String[] args) {
Husky h = new Husky();
h.destroyHome();
h.watchDoor();
Teddy t=new Teddy();
t.touch();
LiHua lihua=new LiHua();
lihua.catchRat();
}
}
執行結果:
哈士奇在拆家
狗在看家
泰迪在蹭一蹭
貓抓老鼠