繼承的好處:
1 提高了代碼的復(fù)用性
2 讓類與類之間產(chǎn)生了關(guān)系,給第三個特征多態(tài)提供了前提
java中支持單繼承仲锄,不直接支持多繼承布朦,但對C++中的多繼承機制進行改良。
單繼承:一個子類只能有一個直接父類
多繼承:一個子類可以有多個直接父類(java中不允許昼窗,對C++的多繼承進行改良)不直接支持是趴,因為多個父類中有相同成員,會產(chǎn)生調(diào)用不確定性在java中是通過“多實現(xiàn)”的方式來體現(xiàn)
java支持多層(多重)繼承
C繼承B澄惊,B繼承A
就會出現(xiàn)繼承體系唆途。
當(dāng)要使用一個繼承體系時,
1 查看該體系中的頂層類掸驱,了解該體系的基本功能肛搬。
2 創(chuàng)建體系中的最子類對象,完成功能的使用毕贼。
什么時候定義繼承呢温赔?
當(dāng)類與類之間存在著所屬關(guān)系的時候,就定義繼承鬼癣。xxx是yyy中的一種陶贼,xxx extends yyy
所屬關(guān)系:is a 關(guān)系
在子父類中啤贩,成員的 特點體現(xiàn)為
1 成員變量
2 成員函數(shù)
3 構(gòu)造函數(shù)
成員變量:
父類:
public class Fu {
//int num1=4;
int num=4;
}
子類:
/*
當(dāng)本類的成員和局部變量同名用this區(qū)分
當(dāng)子父類中的成員變量同名用super區(qū)分父類
this和super的用法很相似。
this:代表一個本類對象的引用
super:代表一個父類的空間
子類不能直接訪問父類私有的內(nèi)容
*/
public class Zi extends Fu {
int num=9;
int num1=5;
void show(){
System.out.print(this.num+"....."+super.num);
}
}
ExtendsDemo類
public class ExtendsDemo{
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
運行:成員函數(shù)
當(dāng)子父類中出現(xiàn)成員函數(shù)一模一樣的情況拜秧,會運行子類的函數(shù)痹屹。
這種現(xiàn)象,稱為覆蓋操作枉氮。這是函數(shù)在子父類中的特性志衍。
函數(shù)兩個特性:
1 重載,同一個類聊替。
2 覆蓋楼肪,子類中,覆蓋也稱為重寫惹悄,覆寫春叫。
覆蓋注意事項:
1 子類方法覆蓋父類方法時,子類權(quán)限必須要大于等于父類的權(quán)限俘侠。(無法覆蓋父類中private、static的方法)
2 靜態(tài)只能覆蓋靜態(tài)蔬将,或被靜態(tài)覆蓋爷速。
什么時候覆蓋操作?
當(dāng)對一個類進行子類的擴展時霞怀,子類需要保留父類的功能聲明惫东,但是要定義子類中該功能的特有內(nèi)容,就使用覆蓋操作完成毙石。(如功能的擴展)
Fu類:
public class Fu {
void show1(){
System.out.println("fu show run");}
}
Zi類:
public class Zi extends Fu{
void shoe2(){
System.out.print("Zi show run");
}
}
ExtendsDemo類
public class ExtendsDemo{
public static void main(String[] args){
Zi z=new Zi();
z.show1();
z.shoe2();
NewPhone p=new NewPhone();
p.show();
p.call();
}
}
運行:構(gòu)造函數(shù)
Fu'類:
class Fu {
Fu(){
System.out.println("A Fu run");
}
Fu(int x){
System.out.println("B fu run..."+x);
}
}
Zi類:
在子類構(gòu)造對象時廉沮,發(fā)現(xiàn),訪問子類構(gòu)造函數(shù)時徐矩,父類也運行了滞时。因為在子類的構(gòu)造函數(shù)中第一行有一個默認的隱形語句,super()滤灯;
class Zi extends Fu{
Zi(){
// super();調(diào)用的是父類中的空參數(shù)的構(gòu)造函數(shù)
System.out.println("C Zi run");
}
Zi(int x){
this();
//super(x);
System.out.println("D Zi run.."+x);
}
}
ExtendsDemo類:
class ExtendsDemo{
public static void main(String[] args){
new Zi();
new Zi(6);
}
}
運行:為什么子類實例化的時候要訪問父類中的構(gòu)造函數(shù)呢
因為子類繼承了父類坪稽,獲取到了父類中內(nèi)容(屬性),所以在使用父類內(nèi)容之前鳞骤,
要先看父類是如何對自己內(nèi)容進行初始化的窒百。
所以子類在構(gòu)造對象時,必須訪問父類中的構(gòu)造函數(shù)豫尽。
為了完成這個必要的動作篙梢,就在子類的構(gòu)造函數(shù)中加入了super()語句。
如果父類中沒有定義空參數(shù)構(gòu)造函數(shù)美旧,那么子類的構(gòu)造函數(shù)必須用super明確調(diào)用父類中那個構(gòu)造函數(shù)渤滞。同時子類構(gòu)造函數(shù)中如果使用this調(diào)用了本類構(gòu)造函數(shù)時贬墩,那么super就沒有了,因為super和this都只能定義第一行蔼水。所以只能有一個震糖。但是可以保證的是子類中肯定會有其他的構(gòu)造函數(shù)訪問父類的構(gòu)造函數(shù)。
注意:super語句必須要定義在子類構(gòu)造函數(shù)的第一行趴腋,因為父類的初始化動作要先完成吊说。