繼承(inheritance):
也稱泛化绽榛,繼承性是子類自動共享父類屬性和方法的機制嗓节,在定義和實現(xiàn)一個類的時候臼节,可以在一個已經(jīng)存在的類的基礎(chǔ)之上來進行接剩,把這個已經(jīng)存在的類所定義的內(nèi)容作為自己的內(nèi)容切厘,并加入自己若干新的內(nèi)容
繼承簡化了人們對事物的認識和描述,有益于軟件復(fù)用懊缺,是OO技術(shù)提高軟件開發(fā)效率的重要原因之一
是類之間的一種關(guān)系疫稿,一般類與特殊類之間的關(guān)系
繼承關(guān)系的語義:“is a kind of”
封裝(encapsulation):
所謂封裝是把對象的屬性和行為結(jié)合在一個獨立的系統(tǒng)單位內(nèi)部
盡可能隱蔽對象的內(nèi)部細節(jié),只向外部提供接口
降低對象間的耦合度
封裝的重要意義:
使對象能夠集中而完整地描述并對應(yīng)一個具體事物
體現(xiàn)了事物的相對獨立性鹃两,使對象外部不能隨意存取對象的內(nèi)部數(shù)據(jù)
多態(tài)(polymorphism):
指同一個命名可具有不同的語義
OO方法中遗座,常指在一般類中定義的屬性或方法被特殊類繼承之后,可以具有不同的數(shù)據(jù)類型或表現(xiàn)出不同的行為俊扳,對于子類途蒋,可用不同的方法替代實現(xiàn)父類的服務(wù)的方法
繼承的含義
在Java中定義一個類時,讓該類通過關(guān)鍵字extends繼承一個已有的類馋记,這就是類的繼承(泛化)号坡。
被繼承的類稱為父類(超類懊烤,基類),新的類稱為子類(派生類)宽堆。
子類繼承父類的所有屬性和方法腌紧,同時也可以增加自己的屬性和方法。
繼承的語法
繼承的含義
繼承的規(guī)則:
Java中只支持單繼承畜隶,也就是說每個類只能有一個父類壁肋,不允許有多重繼承
一個父類可以有多個子類
子類繼承父類所有的屬性和方法?
調(diào)用構(gòu)造方法:
在構(gòu)造方法中,可以使用this或super調(diào)用其他的構(gòu)造方法
super()
作用:調(diào)用父類的構(gòu)造器
只能出現(xiàn)在子類的構(gòu)造器中籽慢,且必須是第一行
super()中的參數(shù)浸遗,決定了調(diào)用父類哪個構(gòu)造器
如果子類構(gòu)造器中沒有出現(xiàn)super,那么編譯器會默認加上super()嗡综,即調(diào)用父類的空構(gòu)造器乙帮,如果父類沒有空構(gòu)造器,編譯器提示錯誤极景。
this()
作用:調(diào)用本類的構(gòu)造器
只能寫在構(gòu)造器的第一行
在同一個構(gòu)造器中super()和this()不能同時出現(xiàn)
類的繼承
子類實例化的過程
使用默認的構(gòu)造器
在子類中的創(chuàng)建構(gòu)造器? ? ? ? ?
在子類中創(chuàng)建構(gòu)造器時,必須調(diào)用父類的構(gòu)造器
子類可以在自己的構(gòu)造器中使用super關(guān)鍵字來調(diào)用父類的構(gòu)造器
如果使用super關(guān)鍵字調(diào)用父類構(gòu)造器驾茴,必須寫在該子類構(gòu)造器的第一行
如調(diào)用的是父類中無參的構(gòu)造器盼樟,則可以不寫super( )
如果子類中調(diào)用了父類無參的構(gòu)造器,而父類中沒有無參構(gòu)造器則系統(tǒng)編譯出錯
示例
package com.neusoft.test7;
//子類
public class Officer extends Employee{
// 使用this()? super()? 來調(diào)用 當(dāng)前類 或其父類的空參構(gòu)造
public Officer() {
super(5); //父類方法的空參構(gòu)造
System.out.println("Officer子類的空參構(gòu)造方法");
}
// public Officer(int i) {
//// super(); //父類方法的空參構(gòu)造
// System.out.println("Officer子類的空參構(gòu)造方法");
// }
public String type="Officer";
public? void show() {
System.out.println("兒子說:hello");
}
// 區(qū)分父與子之間 屬性與方法時:
// this指的是當(dāng)前類對象屬性及方法
// super指的是父類的屬性及方法
public void say() {
System.out.println("自己的屬性類型為:"+this.type);
System.out.println("父類的屬性類型為:"+super.type);
// 自己的show()
this.show();
// 父類show()
super.show();
// 子類繼承父類锈至,子類沒有重寫drink方法時晨缴,會將父類的drink方法繼承
this.drink();
}
}
----------
package com.neusoft.test7;
//子類
public class Officer extends Employee{
// 使用this()? super()? 來調(diào)用 當(dāng)前類 或其父類的空參構(gòu)造
public Officer() {
super(5); //父類方法的空參構(gòu)造
System.out.println("Officer子類的空參構(gòu)造方法");
}
// public Officer(int i) {
//// super(); //父類方法的空參構(gòu)造
// System.out.println("Officer子類的空參構(gòu)造方法");
// }
public String type="Officer";
public? void show() {
System.out.println("兒子說:hello");
}
// 區(qū)分父與子之間 屬性與方法時:
// this指的是當(dāng)前類對象屬性及方法
// super指的是父類的屬性及方法
public void say() {
System.out.println("自己的屬性類型為:"+this.type);
System.out.println("父類的屬性類型為:"+super.type);
// 自己的show()
this.show();
// 父類show()
super.show();
// 子類繼承父類,子類沒有重寫drink方法時峡捡,會將父類的drink方法繼承
this.drink();
}
}
----
測試類
package com.neusoft.test7;
public class Test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Officer o=new Officer();
// o.say();
}
}
抽象類與接口不同點
1.書寫上?抽象類?abstract?class?????接口是interface
2.?繼承使用extends關(guān)鍵字????實現(xiàn)接口使用implements關(guān)鍵字
3.抽象類?可以定義普通方法與抽象方法击碗,接口內(nèi)部只能定義抽象方法和被default?關(guān)鍵字修飾的普通方法
4.抽象類只能被單繼承??,接口可以被多實現(xiàn)
5.抽象類只能單繼承们拙,?接口之間可以多繼承
6.抽行類可以定義成員變量稍途,接口?只能定義靜態(tài)常量
7.設(shè)計上?屬于關(guān)系的設(shè)計為抽象類??????包含某一種功能?設(shè)計為接口