基本介紹
Java繼承是面向?qū)ο蟮淖铒@著的一個(gè)特征。繼承是從已有的類(lèi)中派生出新的類(lèi),新的類(lèi)能吸收已有類(lèi)的數(shù)據(jù)屬性和行為,并能擴(kuò)展新的能力。
類(lèi)和類(lèi)之間的繼承關(guān)系可以用UML符號(hào)表示,其中父類(lèi)又叫超類(lèi)或基類(lèi),子類(lèi)又叫派生類(lèi)。父類(lèi)是子類(lèi)的一般化,子類(lèi)是父類(lèi)的特化(具體化)。
JAVA不支持多繼承,單繼承使JAVA的繼承關(guān)系很簡(jiǎn)單,一個(gè)類(lèi)只能有一個(gè)父類(lèi),易于管理程序,同時(shí)一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,從而克服單繼承的缺點(diǎn)。
在面向?qū)ο蟪绦蛟O(shè)計(jì)中運(yùn)用繼承原則,就是在每個(gè)由一般類(lèi)和特殊類(lèi)形成的一般——特殊結(jié)構(gòu)中,把一般類(lèi)的對(duì)象實(shí)例和所有特殊類(lèi)的對(duì)象實(shí)例都共同具有的屬性和操作一次性地在一般類(lèi)中進(jìn)行顯式的定義,在特殊類(lèi)中不再重復(fù)地定義一般類(lèi)中已經(jīng)定義的東西,但是在語(yǔ)義上,特殊類(lèi)卻自動(dòng)地、隱含地?fù)碛兴囊话泐?lèi)(以及所有更上層的一般類(lèi))中定義的屬性和操作。特殊類(lèi)的對(duì)象擁有其一般類(lèi)的全部或部分屬性與方法,稱(chēng)作特殊類(lèi)對(duì)一般類(lèi)的繼承。
繼承所表達(dá)的就是一種對(duì)象類(lèi)之間的相交關(guān)系,它使得某類(lèi)對(duì)象可以繼承另外一類(lèi)對(duì)象的數(shù)據(jù)成員和成員方法。若類(lèi)B繼承類(lèi)A,則屬于B的對(duì)象便具有類(lèi)A的全部或部分性質(zhì)(數(shù)據(jù)屬性)和功能(操作),我們稱(chēng)被繼承的類(lèi)A為基類(lèi)、父類(lèi)或超類(lèi),而稱(chēng)繼承類(lèi)B為A的派生類(lèi)或子類(lèi)。
繼承避免了對(duì)一般類(lèi)和特殊類(lèi)之間共同特征進(jìn)行的重復(fù)描述。同時(shí),通過(guò)繼承可以清晰地表達(dá)每一項(xiàng)共同特征所適應(yīng)的概念范圍——在一般類(lèi)中定義的屬性和操作適應(yīng)于這個(gè)類(lèi)本身以及它以下的每一層特殊類(lèi)的全部對(duì)象。運(yùn)用繼承原則使得系統(tǒng)模型比較簡(jiǎn)練也比較清晰。
分類(lèi)
繼承分為單繼承和多重繼承。單繼承是指一個(gè)子類(lèi)最多只能有一個(gè)父類(lèi)。多繼承是一個(gè)子類(lèi)可以有二個(gè)以上的父類(lèi)。由于多繼承會(huì)帶來(lái)二義性,在實(shí)際應(yīng)用中應(yīng)盡量使用單繼承。Java語(yǔ)言中的類(lèi)只支持單繼承,而接口支持多繼承。Java中多繼承的功能是通過(guò)接口(interface)來(lái)間接實(shí)現(xiàn)的。
特征
(1)繼承關(guān)系是傳遞的。若類(lèi)C繼承類(lèi)B,類(lèi)B繼承類(lèi)A(多層繼承),則類(lèi)C既有從類(lèi)B那里繼承下來(lái)的屬性與方法,也有從類(lèi)A那里繼承下來(lái)的屬性與方法,還可以有自己新定義的屬性和方法。繼承來(lái)的屬性和方法盡管是隱式的,但仍是類(lèi)C的屬性和方法。繼承是在一些比較一般的類(lèi)的基礎(chǔ)上構(gòu)造、建立和擴(kuò)充新類(lèi)的最有效的手段。
(2)繼承簡(jiǎn)化了人們對(duì)事物的認(rèn)識(shí)和描述,能清晰體現(xiàn)相關(guān)類(lèi)間的層次結(jié)構(gòu)關(guān)系。
(3)繼承提供了軟件復(fù)用功能。若類(lèi)B繼承類(lèi)A,那么建立類(lèi)B時(shí)只需要再描述與基類(lèi)(類(lèi)A)不同的少量特征(數(shù)據(jù)成員和成員方法)即可。這種做法能減小代碼和數(shù)據(jù)的冗余度,大大增加程序的重用性。
(4)繼承通過(guò)增強(qiáng)一致性來(lái)減少模塊間的接口和界面,大大增加了程序的易維護(hù)性。
(5)提供多重繼承機(jī)制。從理論上說(shuō),一個(gè)類(lèi)可以是多個(gè)一般類(lèi)的特殊類(lèi),它可以從多個(gè)一般類(lèi)中繼承屬性與方法,這便是多重繼承。Java出于安全性和可靠性的考慮,僅支持單重繼承,而通過(guò)使用接口機(jī)制來(lái)實(shí)現(xiàn)多重繼承。
實(shí)例
//建一個(gè)A類(lèi)
class A{
//成員變量 其中num是實(shí)參
int num=0;
//成員方法,其中 i 是形參
public A(int i){
//輸入int型文件輸出下面
System.out.println("aaaaaaaaaaaaaaaaaaa");
System.out.println("i= "+i);
//把輸入的i賦值給成員變量num
num=i;
}
}
//B繼承A
class B extends A{
int num=0;
//成員方法B.
public B(){
//繼承類(lèi)A的方法。因?yàn)锽繼承了A必然繼承了A的特性。所以輸入int值10令方法實(shí)現(xiàn).
super(10);
System.out.println("bbbbbbbbbbbbbbbbbbbb");
//這里的num是類(lèi)B的.
System.out.println("num= "+num);
//如果想顯示類(lèi)A的num則需要用下列的super.num.這里注意num在類(lèi)A中需是成員變量才可以.
System.out.println("super.num= "+super.num);
}
}
//建立測(cè)試類(lèi)C
public class C{
//main
public static void main(String aa[]){
//new 一個(gè)對(duì)象B()
new B();
}
}
優(yōu)勢(shì)
Java繼承的從某種意義上講,Java繼承的短暫美就如同宇宙中所有事與其它事情都存在一種特殊的關(guān)系。教育者試圖向門(mén)外漢們解釋繼承的概念,常常通過(guò)討論相關(guān)動(dòng)物群之間的關(guān)系來(lái)解釋這一概念。在Java和NET中,在某種程度上講,所有事物都是對(duì)象類(lèi)型的一種軟件組件。然而,從那里開(kāi)始,開(kāi)發(fā)選擇什么在子類(lèi)和超類(lèi)繼承中進(jìn)行關(guān)聯(lián)是設(shè)計(jì)的重點(diǎn)。
使用Java進(jìn)行桌面渲染中的問(wèn)題是,過(guò)多的思想投入到把在一起的可視化項(xiàng)目進(jìn)行分組。從親子關(guān)系來(lái)看,所有地的知名的圖形元素,雖然知名的方法不同,但都與一般的Window類(lèi)有著極大的關(guān)系。所有我們選擇的、繼承于Window類(lèi)的,與JDialog屬性有關(guān)的東西,都與上一級(jí)的JFrame有關(guān),因?yàn)樗麄冇泄餐母竁indow類(lèi)。的確,編寫(xiě)可重用的代碼來(lái)管理許多相關(guān)的子對(duì)象是優(yōu)秀設(shè)計(jì)的標(biāo)志。正如上文說(shuō)的狗和窗戶(hù)一樣,偉大的多態(tài)設(shè)計(jì)都是關(guān)于抽象、分類(lèi)、設(shè)計(jì)、和繼承的。