-
為描述和處理個(gè)人信息,定義類Person:
class Person{
public String name;
public int age;
public Date birthDate;
public String getIofo() {
......
}
}
-
為描述和處理學(xué)生信息珊佣,定義類Student:
image.png
class Student{
public String name;
public int age;
public Date birthDate;
public String school;
public String getIofo() {
//......
}
}
-
通過繼承归粉,簡(jiǎn)化Student類的定義:
image.png
class Student extends Person{
public String school;
}
Student類繼承了父類Person的所有屬性和方法电媳,并增加了一
個(gè)屬性school渐排。Person中的屬性和方法,Student都可以使用。
為什么要有繼承?
多個(gè)類中存在相同屬性和行為時(shí),將這些內(nèi)容抽取到單獨(dú)一個(gè)類中鲤脏,那么多個(gè)類無需再定義這些屬性和行為,只要繼承那個(gè)類即可亿蒸。即子類不是父類的子集凑兰,而是對(duì)父類的“擴(kuò)展”。
子類對(duì)象的創(chuàng)建
在類的聲明中边锁,可以通過使用關(guān)鍵字 extends 來顯式地指明其父類姑食。
語法格式如下:
[修飾符] class 子類名 extends 父類名
● 修飾符:可選參數(shù),用于指定類的訪問權(quán)限茅坛,可選值為 public音半、abstract 和 final。
● 子類名:必選參數(shù)贡蓖,用于指定子類的名稱曹鸠。類名必須是合法的 Java 標(biāo)識(shí)符,在一般情況下斥铺,要求首字母大寫彻桃。
●extends 父類名:必選參數(shù),用于指定要定義的子類繼承于哪個(gè)父類晾蜘。
繼承的使用原則
子類可以繼承父類中所有可被子類訪問的成員變量和成員方法邻眷,但必須遵循以下原則。
(1)子類能夠繼承父類中被聲明為 public 和 protected 的成員變量和成員方法剔交,但不能繼承被聲明為 private 的成員變量和成員方法肆饶。
(2)子類能夠繼承在同一個(gè)包中的由默認(rèn)修飾符修飾的成員變量和成員方法。
(3)如果子類聲明了一個(gè)與父類的成員變量名稱相同的成員變量岖常,則子類不能繼承父類的成員變量驯镊。此時(shí)子類的成員變量隱藏了父類的成員變量。
(4)如果子類聲明了一個(gè)與父類的成員方法名稱相同的成員方法竭鞍,則子類不能繼承父類的成員方法板惑。此時(shí)子類的成員方法覆蓋了父類的成員方法。
【例 】 定義一個(gè)動(dòng)物類 Animal 及它的子類 Bird笼蛛。(1)創(chuàng)建一個(gè)名稱為 Animal 的類洒放,并在該類中聲明兩個(gè)成員變量 live 和兩個(gè)成員方法,分別為eat() 和 move()滨砍,具體代碼如下:
public class Animal{
public boolean live = true;
public String skin = "";
public void eat(){
Systeam.out.println("動(dòng)物需要吃食物");
}
public void move(){
Systeam.out.println("動(dòng)物會(huì)運(yùn)動(dòng)");
}
}
(2)創(chuàng)建一個(gè) Animal 類的子類 Bird,在該類中隱藏父類的成員變量 skin惋戏,并且覆蓋成員方法 move()领追,具體代碼如下:
public class Bird extends Animal{
public String skin = "羽毛";
public void move(){
Systeam.out.println("鳥會(huì)飛翔");
}
}
(3)創(chuàng)建一個(gè)名稱為 Zoo 的類,在該類的 main() 方法中創(chuàng)建子類Bird 的對(duì)象并為該對(duì)象分配內(nèi)存响逢,然后使該對(duì)象調(diào)用該類的成員方法及成員變量绒窑,具體代碼如下:
public class Zoo{
public static void mian(String[] args){
Bird bird = new Bird();
bird.eat();
bird.move();
Systeam.out.println("鳥有:"+bird.skin);
}
}
eat() 方法是從父類 Animal 繼承的方法,move() 方法是子類 Bird 聲明的覆蓋父類成員方法的成員方法舔亭,skin 變量是子類的成員變量些膨。
Java只支持單繼承和多層繼承,不允許多重繼承
- 一個(gè)子類只能有一個(gè)父類
- 一個(gè)父類可以派生出多個(gè)子類
- class SubDemo extends Demo{ } //ok
-
class SubDemo extends Demo1,Demo2...//error
image.png
子類的繼承
子類中的一部分成員是子類自己聲明和創(chuàng)建的钦铺,另一部分是通過它的父類繼承的订雾。在 Java 中,Object 類是所有類的祖先類矛洞,也就是說洼哎,任何類都繼承于 Object 類。除 Object 類以外的每個(gè)類沼本,有且僅有一個(gè)父類噩峦,而一個(gè)類可以有零個(gè)或多個(gè)子類。
1.同一包中的子類與父類
如果子類與父類在同一包中抽兆,則子類會(huì)繼承父類中非 private 修飾的成員變量和方法识补。
2.非同一包中的子類與父類
當(dāng)子類與父類不在同一包中時(shí),父類中使用 private 修飾的成員變量和友好的成員變量不會(huì)被繼承辫红,也就是說凭涂,子類只能繼承父類中使用 public 和 protected 修飾的成員變量作為子類的成員變量,同樣地厉熟,子類也只能繼承父類中使用 public 和 protected 修飾的成員方法作為子類的成員方法导盅。
3.繼承關(guān)系的 UML 圖
當(dāng)一個(gè)類是另一個(gè)類的子類時(shí),可以通過 UML 圖使用實(shí)線連接兩個(gè)類來表示二者之間的繼承關(guān)系揍瑟。實(shí)線的起始端是子類的 UML 圖白翻,實(shí)線的終止端是父類的 UML 圖。在實(shí)線的終止端使用一個(gè)空心三角形表示實(shí)線的結(jié)束绢片。
4.繼承中的 protected
在一個(gè) A 類中滤馍,它所定義的成員變量和方法都被 protected 所修飾。如果 A 類被 B 類底循、C 類繼承巢株,則在 B 類與 C 類中都繼承了 A 類的成員變量和方法。這時(shí)熙涤,如果在 C 類中創(chuàng)建一個(gè)自身的對(duì)象阁苞,則該對(duì)象可以訪問父類的和自身定義的 protected 修飾的成員變量和方法困檩。但是在其他類中,如 Student 類那槽,對(duì)于子類 C 自己聲明的 protected 修飾的成員變量和方法悼沿,只要 Student 類與 C 類在同一包中,創(chuàng)建的對(duì)象就可以訪問這些被 protected 修飾的成員變量和方法骚灸。對(duì)于子類 C 從父類中繼承的 protected 修飾的成員變量和方法糟趾,只要 Student 類與 C 類的父類在同一包中,創(chuàng)建的對(duì)象就能夠訪問繼承的 protected 修飾的成員變量和方法甚牲。