繼承的關鍵字:extends
-
繼承的好處:
1魔招,提高了代碼的復用性肌索。
2,讓類與類之間產生了關系蛀蜜,給第三個特征多態(tài)提供了前提.
-
java中支持單繼承刻两。不直接支持多繼承,但對C++中的多繼承機制進行改良滴某。
單繼承:一個子類只能有一個直接父類磅摹。
多繼承:一個子類可以有多個直接父類(java中不允許,進行改良)
不直接支持,因為多個父類中有相同成員霎奢,會產生調用不確定性户誓。
在java中是通過"多實現"的方式來體現。
- java支持多層(多重)繼承椰憋。
C繼承B厅克,B繼承A。
就會出現繼承體系橙依。
- 當要使用一個繼承體系時证舟,
1,查看該體系中的頂層類窗骑,了解該體系的基本功能女责。
2,創(chuàng)建體系中的最子類對象创译,完成功能的使用抵知。
-
什么時候定義繼承呢?
當類與類之間存在著所屬關系的時候软族,就定義繼承刷喜。xxx是yyy中的一種。 xxx extends yyy
所屬關系: is a 關系立砸。
-
在子父類中掖疮,成員的特點體現:
- 成員變量。
- 成員函數颗祝。
- 構造函數浊闪。
1. 成員變量
當本類的成員和局部變量同名用this區(qū)分。
當子父類中的成員變量同名用super區(qū)分父類螺戳。
this和super的用法很相似搁宾,但并不相同。
this:代表一個本類對象的引用倔幼。
super:代表一個父類空間盖腿。
簡單圖例:
2. 成員函數
當子父類中出現成員函數一模一樣的情況,會運行子類的函數凤藏。
這種現象奸忽,稱為覆蓋操作堕伪。這是函數在子父類中的特性。
函數兩個特性:
1栗菜,重載欠雌。同一個類中。overload
2疙筹,覆蓋富俄。子類中。覆蓋也稱為重寫而咆,覆寫霍比。override
覆蓋注意事項:
1,子類方法覆蓋父類方法時暴备,子類權限必須要大于等于父類的權限悠瞬。
2,靜態(tài)只能覆蓋靜態(tài)涯捻,或被靜態(tài)覆蓋浅妆。
什么時候使用覆蓋操作?
當對一個類進行子類的擴展時,子類需要保留父類的功能聲明障癌,
但是要定義子類中該功能的特有內容時凌外,就使用覆蓋操作完成.
3.構造函數
子父類中的構造函數的特點
在子類構造對象時,發(fā)現涛浙,訪問子類構造函數時康辑,父類也運行了。
為什么呢轿亮?
原因是:在子類的構造函數中第一行有一個默認的隱式語句疮薇。 super();
子類的實例化過程:子類中所有的構造函數默認都會訪問父類中的空參數的構造函數。
為什么子類實例化的時候要訪問父類中的構造函數呢我注?
那是因為子類繼承了父類惦辛,獲取到了父類中內容(屬性),所以在使用父類內容之前仓手,
要先看父類是如何對自己的內容進行初始化的。
所以子類在構造對象時玻淑,必須訪問父類中的構造函數嗽冒。
為了完成這個必須的動作,就在子類的構造函數中加入了super()語句补履。
如果父類中沒有定義空參數構造函數添坊,那么子類的構造函數必須用super明確要調用
父類中哪個構造函數。同時子類構造函數中如果使用this調用了本類構造函數時箫锤,
那么super就沒有了贬蛙,因為super和this都只能定義第一行雨女。所以只能有一個。
但是可以保證的是阳准,子類中肯定會有其他的構造函數訪問父類的構造函數氛堕。
注意:supre語句必須要定義在子類構造函數的第一行。因為父類的初始化動作要先完成
一個對象實例化過程:
以Person p = new Person();為例
1野蝇,JVM會讀取指定的路徑下的Person.class文件讼稚,并加載進內存,
并會先加載Person的父類(如果有直接的父類的情況下).
2绕沈,在堆內存中的開辟空間锐想,分配地址。
3乍狐,并在對象空間中赠摇,對對象中的屬性進行默認初始化。
4浅蚪,調用對應的構造函數進行初始化藕帜。
5,在構造函數中掘鄙,第一行會先到調用父類中構造函數進行初始化耘戚。
6,父類初始化完畢后操漠,再對子類的屬性進行顯示初始化收津。
7,再進行子類構造函數的特定初始化浊伙。
8撞秋,初始化完畢后,將地址值賦值給引用變量.
示例代碼:
class Fu
{
Fu()
{
super();
show();
return;
}
void show()
{
System.out.println("fu show");
}
}
class Zi extends Fu
{
int num = 8;
Zi()
{
super();
//-->通過super初始化父類內容時嚣鄙,子類的成員變量并未顯示初始化吻贿。等super()父類初始化完畢后,
//才進行子類的成員變量顯示初始化哑子。
System.out.println("zi cons run...."+num);
return;
}
void show()
{
System.out.println("zi show..."+num);
}
}
class ExtendsDemo5
{
public static void main(String[] args)
{
Zi z = new Zi();
z.show();
}
}
結果:
zi show...0
zi cons run...8
zi show...8
內存圖示: