目錄
繼承
super?
?子類的構(gòu)造方法
final
繼承
所有的OOP語(yǔ)言都會(huì)有三個(gè)特征:
- 封裝(點(diǎn)擊可跳轉(zhuǎn))
- 繼承
- 多態(tài)(點(diǎn)擊可跳轉(zhuǎn))
為什么會(huì)有繼承呢?可以先看下面的例子:
????????上面這兩個(gè)類中的代碼很相似因?yàn)樗鼈冎挥凶詈笠粋€(gè)方法不同其它的都相同,這樣定義不但導(dǎo)致代碼冗余而且非常麻煩。而在OOP語(yǔ)言中繼承就是專門(mén)用來(lái)進(jìn)行共性抽取,實(shí)現(xiàn)代碼復(fù)用。
繼承(inheritance)機(jī)制:是面向?qū)ο蟪绦蛟O(shè)計(jì)使代碼可以復(fù)用的最重要的手段,它允許程序員在保持原有類特 性的基礎(chǔ)上進(jìn)行擴(kuò)展,增加新功能,這樣產(chǎn)生新的類,稱派生類。繼承呈現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計(jì)的層次結(jié)構(gòu), 體現(xiàn)了由簡(jiǎn)單到復(fù)雜的認(rèn)知過(guò)程。繼承主要解決的問(wèn)題是:共性的抽取,實(shí)現(xiàn)代碼復(fù)用。
在JAVA中要實(shí)現(xiàn)繼承需要借助extends關(guān)鍵字。
修飾符 class 子類 extends 父類 {
// ...
}
此時(shí)我們?cè)诳丛倜娴睦永蠋熀蛯W(xué)生都屬于人這個(gè)大類,那么我們就可以單獨(dú)定義一個(gè)People類來(lái)將他們相同的屬性和方法放在一起,然后由學(xué)生類和老師類分別繼承人這個(gè)大類:
class People{
public String name;
public int age;
public void speak(){
System.out.println(this.name+"正在說(shuō)話");
}
}
class Teacher extends People{
public void work(){
System.out.println(this.name+"正在教書(shū)");
}
}
class Student extends People{
public void study(){
System.out.println(this.name+"正在學(xué)習(xí)");
}
}
public class Test {
public static void main(String[] args) {
Teacher teacher = new Teacher();
teacher.name = "zhangsan";
teacher.age = 24;
teacher.speak();
teacher.work();
System.out.println("==========");
Student student = new Student();
student.name = "xiaoming";
student.age = 15;
student.speak();
student.study();
}
}
?注意:子類會(huì)將父類中的成員變量或者成員方法繼承到子類中。
那么現(xiàn)在又有一個(gè)新問(wèn)題如果子類中有和父類相同的屬性或方法那系統(tǒng)會(huì)怎么辦?
class People{
public String name;
public int age = 25;
public void speak(){
System.out.println(this.name+"正在說(shuō)話");
}
}
class Teacher extends People{
public int age = 20;
public void work(){
System.out.println(this.name+"正在教書(shū)"+"今年"+this.age);
}
}
public class Test {
public static void main(String[] args) {
Teacher teacher = new Teacher();
teacher.name = "zhangsan";
teacher.work();
}
}
此時(shí)父類和子類都有age屬性代碼運(yùn)行后可以看到使用的是子類的屬性。?
?總結(jié):
- 通過(guò)子類對(duì)象訪問(wèn)父類與子類中屬性時(shí),優(yōu)先訪問(wèn)自己的,自己沒(méi)有時(shí)再到父類中找,如果父類中也沒(méi)有則報(bào)錯(cuò)。
- 通過(guò)子類對(duì)象訪問(wèn)父類與子類中不同名方法時(shí),優(yōu)先在子類中找,找到則訪問(wèn),否則在父類中找,找到則訪問(wèn),否則編譯報(bào)錯(cuò)。
- 通過(guò)子類對(duì)象訪問(wèn)父類與子類同名方法時(shí),如果父類和子類同名方法的參數(shù)列表不同(重載),根據(jù)調(diào)用方法適傳遞的參數(shù)選擇合適的方法訪問(wèn),如果沒(méi)有則報(bào)錯(cuò);
就算父類中有private修飾的屬性或方法子類也會(huì)將它繼承下來(lái)但是無(wú)法訪問(wèn)。
super?
在上面的例子中出現(xiàn)了一個(gè)新的關(guān)鍵字super。那么super關(guān)鍵字是干什么的?
該關(guān)鍵字主要作用:在子類方法中訪問(wèn)父類的成員。
class People{
public String name;
public int age = 25;
public void speak(){
System.out.println(this.name+"正在說(shuō)話");
}
}
class Teacher extends People{
public int age = 20;
public void work(){
System.out.println(this.name+"正在教書(shū)"+"今年"+super.age);
}
}
public class Test {
public static void main(String[] args) {
Teacher teacher = new Teacher();
teacher.name = "zhangsan";
teacher.work();
}
}
因?yàn)楦割惡妥宇惗加衋ge屬性此時(shí)如果想訪問(wèn)父類的屬性就可以通過(guò)super關(guān)鍵字 ,super+.可以訪問(wèn)父類的屬性和方法。(下文會(huì)為大家介紹super的第三種使用方法)。
?
?子類的構(gòu)造方法
此時(shí)如果父類有帶參數(shù)的構(gòu)造方法那么系統(tǒng)將會(huì)報(bào)錯(cuò)。
當(dāng)父類中加入了含有兩個(gè)參數(shù)構(gòu)造方法之后代碼就會(huì)報(bào)錯(cuò)。
接下來(lái)就為大家介紹一下super關(guān)鍵字的第三種使用方法:
super();
它可以調(diào)用父類的構(gòu)造方法。
注:它必須放在構(gòu)造方法的第一行。
因?yàn)閷?shí)例化對(duì)象時(shí)有兩個(gè)比較重要的步驟:
- 為對(duì)象分配內(nèi)存;
- 調(diào)用合適的構(gòu)造方法。
上面的代碼在我們自己寫(xiě)了有參構(gòu)造方法之后報(bào)錯(cuò)的原因就是子類的構(gòu)造方法沒(méi)有調(diào)用父類的構(gòu)造方法。(當(dāng)我們自己寫(xiě)了構(gòu)造方法后系統(tǒng)就不會(huì)再為我們提供構(gòu)造方法了,而子類對(duì)象構(gòu)造時(shí),需要先調(diào)用父類構(gòu)造方法,然后再執(zhí)行子類的構(gòu)造方法。當(dāng)我們沒(méi)有寫(xiě)構(gòu)造方法時(shí)系統(tǒng)會(huì)默認(rèn)調(diào)用如下的構(gòu)造方法:
, 我們只寫(xiě)了有參構(gòu)造,所以系統(tǒng)就會(huì)因?yàn)檎也坏綗o(wú)參構(gòu)造而報(bào)錯(cuò),此時(shí)就需要我們自己進(jìn)行調(diào)用:
)
子類對(duì)象中成員是有兩部分組成的,基類繼承下來(lái)的以及子類新增加的部分 。父子父子肯定是先有父再有子,所以在構(gòu)造子類對(duì)象時(shí)候 ,先要調(diào)用基類的構(gòu)造方法,將從基類繼承下來(lái)的成員構(gòu)造完整,然后再調(diào)用子類自己的構(gòu)造方法,將子類自己新增加的成員初始化完整。
注意:
- 若父類顯式定義無(wú)參或者默認(rèn)的構(gòu)造方法,在子類構(gòu)造方法第一行默認(rèn)有隱含的super()調(diào)用,即調(diào)用基類構(gòu)造方法;
- 如果父類構(gòu)造方法是帶有參數(shù)的,此時(shí)需要用戶為子類顯式定義構(gòu)造方法,并在子類構(gòu)造方法中選擇合適的父類構(gòu)造方法調(diào)用,否則編譯失敗;
- 在子類構(gòu)造方法中,super(...)調(diào)用父類構(gòu)造時(shí),必須是子類構(gòu)造函數(shù)中第一條語(yǔ)句;
- super(...)只能在子類構(gòu)造方法中出現(xiàn)一次,并且不能和this同時(shí)出現(xiàn)。
?
final
在JAVA中只支持以下幾種繼承方式:
- 單繼承;
- 多層繼承;
- 不同類繼承同一個(gè)類。
一般我們不希望出現(xiàn)超過(guò)三層的繼承關(guān)系繼承層次如果繼承層次太多太復(fù)雜,?就需要考慮對(duì)代碼進(jìn)行重構(gòu)了。
那我們應(yīng)該如何阻止別人不讓他們進(jìn)行繼承呢?
JAVA中提供了final關(guān)鍵可以用來(lái)修飾變量、成員方法以及類。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-631563.html
- 修飾變量或字段,表示常量(即不能修改)
- 修飾類:表示此類不能被繼承
- 修飾方法:表示該方法不能被重寫(xiě)
我們只要在不想被繼承的類的前面用final修飾就可以了:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-631563.html
繼承層次上代碼的初始化順序:
- 父類靜態(tài)
- 子類靜態(tài)
- 父類實(shí)例
- 父類構(gòu)造
- 子類實(shí)例
- 子類構(gòu)造
到了這里,關(guān)于類的繼承和super關(guān)鍵字的使用(JAVA)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!