Java继承简介
繼承是面向?qū)ο蟮娜筇卣髦?。繼承和現(xiàn)實(shí)生活中的“繼承”的相似之處是保留一些父輩的特性,從而減少代碼冗余,提高程序運(yùn)行效率。
Java 中的繼承就是在已經(jīng)存在類的基礎(chǔ)上進(jìn)行擴(kuò)展,從而產(chǎn)生新的類。已經(jīng)存在的類稱為父類、基類或超類,而新產(chǎn)生的類稱為子類或派生類。在子類中,不僅包含父類的屬性和方法,還可以增加新的屬性和方法。
Java 中子類繼承父類的語(yǔ)法格式如下:
修飾符 class class_name extends extend_class {// 類的主體 }其中,class_name 表示子類(派生類)的名稱;extend_class 表示父類(基類)的名稱;extends 關(guān)鍵字直接跟在子類名之后,其后面是該類要繼承的父類名稱。例如:
public class Student extends Person{}Java 的繼承通過(guò) extends 關(guān)鍵字來(lái)實(shí)現(xiàn),extends 的英文意思是擴(kuò)展,而不是繼承。extends 很好的體現(xiàn)了子類和父類的關(guān)系,即子類是對(duì)父類的擴(kuò)展,子類是一種特殊的父類。從這個(gè)角度看,使用繼承來(lái)描述子類和父類的關(guān)系是錯(cuò)誤的,用擴(kuò)展更恰當(dāng)。
類的繼承不改變類成員的訪問(wèn)權(quán)限,也就是說(shuō),如果父類的成員是公有的、被保護(hù)的或默認(rèn)的,它的子類仍具有相應(yīng)的這些特性,并且子類不能獲得父類的構(gòu)造方法。
教師和學(xué)生都屬于人,他們具有共同的屬性:姓名、年齡、性別和身份證號(hào),而學(xué)生還具有學(xué)號(hào)和所學(xué)專業(yè)兩個(gè)屬性,教師還具有教齡和所教專業(yè)兩個(gè)屬性。下面編寫(xiě) Java 程序代碼,使教師(Teacher)類和學(xué)生(Student)類都繼承于人(People)類,代碼如下。
1 . 創(chuàng)建人類 People,并定義 name、age、sex、sn 屬性,代碼如下:
public class People {public String name; // 姓名public int age; // 年齡public String sex; // 性別public String sn; // 身份證號(hào)public People(String name, int age, String sex, String sn) {this.name = name;this.age = age;this.sex = sex;this.sn = sn;}public String toString() {return "姓名:" + name + "\n年齡:" + age + "\n性別:" + sex + "\n身份證號(hào):" + sn;} }如上述代碼,在 People 類中包含 4 個(gè)公有屬性、一個(gè)構(gòu)造方法和一個(gè) toString() 方法。
2 . 創(chuàng)建 People 類的子類 Student 類,并定義 stuNo 和 department 屬性,代碼如下:
public class Student extends People {private String stuNo; // 學(xué)號(hào)private String department; // 所學(xué)專業(yè)public Student(String name, int age, String sex, String sn, String stuno, String department) {super(name, age, sex, sn); // 調(diào)用父類中的構(gòu)造方法this.stuNo = stuno;this.department = department;}public String toString() {return "姓名:" + name + "\n年齡:" + age + "\n性別:" + sex + "\n身份證號(hào):" + sn + "\n學(xué)號(hào):" + stuNo + "\n所學(xué)專業(yè):" + department;} }由于 Student 類繼承自 People 類,因此,在 Student 類中同樣具有 People 類的屬性和方法,這里重寫(xiě)了父類中的 toString() 方法。
注意:如果在父類中存在有參的構(gòu)造方法而并沒(méi)有重載無(wú)參的構(gòu)造方法,那么在子類中必須含有有參的構(gòu)造方法,因?yàn)槿绻谧宇愔胁缓袠?gòu)造方法,默認(rèn)會(huì)調(diào)用父類中無(wú)參的構(gòu)造方法,而在父類中并沒(méi)有無(wú)參的構(gòu)造方法,因此會(huì)出錯(cuò)。
3 . 創(chuàng)建 People 類的另一個(gè)子類 Teacher,并定義 tYear 和 tDept 屬性,代碼如下:
public class Teacher extends People {private int tYear; // 教齡private String tDept; // 所教專業(yè)public Teacher(String name, int age, String sex, String sn, int tYear, String tDept) {super(name, age, sex, sn); // 調(diào)用父類中的構(gòu)造方法this.tYear = tYear;this.tDept = tDept;}public String toString() {return "姓名:" + name + "\n年齡:" + age + "\n性別:" + sex + "\n身份證號(hào):" + sn + "\n教齡:" + tYear + "\n所教專業(yè):" + tDept;} }Teacher 類與 Student 類相似,同樣重寫(xiě)了父類中的 toString() 方法。
4 . 編寫(xiě)測(cè)試類 PeopleTest,在該類中創(chuàng)建 People 類的不同對(duì)象,分別調(diào)用它們的 toString() 方法,輸出不同的信息。具體的代碼如下:
public class PeopleTest {public static void main(String[] args) {// 創(chuàng)建Student類對(duì)象People stuPeople = new Student("王芳", 23, "女", "410521198902145589", "00001", "計(jì)算機(jī)應(yīng)用與技術(shù)");System.out.println("----------------學(xué)生信息---------------------");System.out.println(stuPeople);// 創(chuàng)建Teacher類對(duì)象People teaPeople = new Teacher("張文", 30, "男", "410521198203128847", 5, "計(jì)算機(jī)應(yīng)用與技術(shù)");System.out.println("----------------教師信息----------------------");System.out.println(teaPeople);} }運(yùn)行程序,輸出的結(jié)果如下:
----------------學(xué)生信息--------------------- 姓名:王芳 年齡:23 性別:女 身份證號(hào):410521198902145589 學(xué)號(hào):00001 所學(xué)專業(yè):計(jì)算機(jī)應(yīng)用與技術(shù) ----------------教師信息---------------------- 姓名:張文 年齡:30 性別:男 身份證號(hào):410521198203128847 教齡:5 所教專業(yè):計(jì)算機(jī)應(yīng)用與技術(shù)單繼承
Java 語(yǔ)言摒棄了多繼承的特征,即 Java 不支持多繼承,只允許一個(gè)類直接繼承另一個(gè)類,即子類只能有一個(gè)直接父類,extends 關(guān)鍵字后面只能有一個(gè)類名。例如,如下代碼會(huì)導(dǎo)致編譯錯(cuò)誤:
class Student extends Person,Person1,Person2{…}class Student extends Person,extends Person1,extends Person2{…}在 Java 的單繼承中,一個(gè)類只能有一個(gè)直接父類,但是它可以有多個(gè)間接的父類。例如,Student 類繼承 Person 類,Person 類繼承 Person1 類,Person1 類繼承 Person2 類,那么 Person1 和 Person2 類是 Student 類的間接父類。
圖形類之間的關(guān)系
從上圖中可以看出,三角形、四邊形和五邊形的直接父類是多邊形類,它們的間接父類是圖形類。圖形類、多邊形類和三角形、四邊形、五邊形類形成了一個(gè)繼承的分支。在這個(gè)分支上,位于下層的子類會(huì)繼承上層所有直接或間接父類的屬性和方法。如果兩個(gè)類不在同一個(gè)繼承樹(shù)分支上,就不會(huì)存在繼承關(guān)系。
如果定義一個(gè) Java 類時(shí)并未顯式指定這個(gè)類的直接父類,則這個(gè)類默認(rèn)繼承 java.lang.Object 類。因此,java.lang.Object 類是所有類的父類,要么是其直接父類,要么是其間接父類。因此所有的 Java 對(duì)象都可調(diào)用 java.lang.Object 類所定義的實(shí)例方法。
使用繼承的注意點(diǎn):
1 . 子類一般比父類包含更多的屬性和方法。
2 . 父類中的 private 成員在子類中是不可見(jiàn)的,因此在子類中不能直接使用它們。
3 . 父類和其子類間必須存在“是一個(gè)”即“is-a”的關(guān)系,否則不能用繼承。但也并不是所有符合“is-a”關(guān)系的都應(yīng)該用繼承。例如,正方形是一個(gè)矩形,但不能讓正方形類來(lái)繼承矩形類,因?yàn)檎叫尾荒軓木匦螖U(kuò)展得到任何東西。正確的繼承關(guān)系是正方形類繼承圖形類。
4 . Java 只允許單一繼承(即一個(gè)子類只能有一個(gè)直接父類),C++ 可以多重繼承(即一個(gè)子類有多個(gè)直接父類)。
繼承的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
實(shí)現(xiàn)代碼共享,減少創(chuàng)建類的工作量,使子類可以擁有父類的方法和屬性。
提高代碼維護(hù)性和可重用性。
提高代碼的可擴(kuò)展性,更好的實(shí)現(xiàn)父類的方法。
缺點(diǎn):
繼承是侵入性的。只要繼承,就必須擁有父類的屬性和方法。
降低代碼靈活性。子類擁有父類的屬性和方法后多了些約束。
增強(qiáng)代碼耦合性(開(kāi)發(fā)項(xiàng)目的原則為高內(nèi)聚低耦合)。當(dāng)父類的常量、變量和方法被修改時(shí),需要考慮子類的修改,有可能會(huì)導(dǎo)致大段的代碼需要重構(gòu)。
總結(jié)
- 上一篇: Java类的定义
- 下一篇: IDEA创建.properties文件