公司和網(wǎng)站備案查詢密碼網(wǎng)絡(luò)營(yíng)銷和傳統(tǒng)營(yíng)銷的區(qū)別有哪些
目錄
一. 繼承
1.?為什么需要繼承?
2.?繼承的概念
3. 繼承的語(yǔ)法
?4. 訪問父類成員
4.1 子類中訪問父類的成員變量
4.2 子類中訪問父類的成員方法
5. super關(guān)鍵字
6. super和this關(guān)鍵字
?7. 子類構(gòu)造方法
8. 代碼塊的執(zhí)行順序
?9. protected訪問修飾限定符
10. 繼承方式
11.final關(guān)鍵字
12. 繼承與組合
結(jié)語(yǔ)
一. 繼承
1.?為什么需要繼承?
在Java中類是對(duì)現(xiàn)實(shí)生活中一組對(duì)象的抽象描述,是創(chuàng)建對(duì)象的模板,經(jīng)過實(shí)例化后的對(duì)象可以用來表示現(xiàn)實(shí)中的實(shí)體,但是我們可以發(fā)現(xiàn)很多事物是存在一些關(guān)聯(lián)的,比如:永劫無(wú)間中的治療型英雄和進(jìn)攻性英雄、他們都是英雄角色
?用我們的Java語(yǔ)言該如何實(shí)例化一個(gè)永劫無(wú)間中的英雄對(duì)象呢
public class Therapeutic {//治療型public String name ;//表示名字public int age;//表示年齡public int HP;//表示血量public Therapeutic(String name, int age, int HP) {this.name = name;this.age = age;this.HP = HP;}public void run(){System.out.println(this.name +"正在跑...");}public void used_Treatskill(){System.out.println(this.name+"使用了治療技能...");}
}public class Offensive {//進(jìn)攻型public String name ;//表示名字public int age;//表示年齡public int HP;//表示血量public Offensive(String name, int age, int HP) {this.name = name;this.age = age;this.HP = HP;}public void run(){System.out.println(this.name +"正在跑...");}public void used_Offensive_skill(){System.out.println(this.name+"使用了進(jìn)攻技能...");}
}
通過上述代碼我們可以發(fā)現(xiàn),在我們的進(jìn)攻型英雄和治療型英雄的中存在大量的重復(fù)代碼,如圖所示:
那么有什么辦法能夠?qū)⑦@些共性抽取,來減少代碼的冗余和增加代碼的復(fù)用性呢?那么在我們面向?qū)ο蟮乃枷胫刑岢隽死^承的概念,專門用來進(jìn)行共性抽取,實(shí)現(xiàn)代碼復(fù)用。
2.?繼承的概念
在Java中,繼承是面向?qū)ο缶幊痰闹匾匦灾?#xff0c;它允許一個(gè)類(子類)繼承另一個(gè)類(父類)的屬性和方法,從而減少代碼的冗余和實(shí)現(xiàn)代碼的復(fù)用,繼承主要解決的問題就是:共性的抽取,實(shí)現(xiàn)代碼復(fù)用。
例如上述說的:治療型英雄和進(jìn)攻型英雄都是英雄人物,那么我們可以將共性的內(nèi)容進(jìn)行抽取。
3. 繼承的語(yǔ)法
在實(shí)現(xiàn)上述例子繼承關(guān)系之前,我們先來學(xué)習(xí)一下繼承的語(yǔ)法。在Java中要實(shí)現(xiàn)類之間的繼承關(guān)系,我們需要借助extends關(guān)鍵字:
修飾符 class 子類 extends 父類 {內(nèi)容// ...
}
那么對(duì)于上述例子我們就可以重新設(shè)計(jì):
//英雄類
public class Heroic_Characters {public String name ;//表示名字public int age;//表示年齡public int HP;//表示血量public Heroic_Characters(String name, int age, int HP) {this.name = name;this.age = age;this.HP = HP;}public void run(){System.out.println(this.name +"正在跑...");}
}//治療型英雄類
public class Therapeutic extends Heroic_Characters {public Therapeutic(String name, int age, int HP) {super(name, age, HP);}//治療型public void used_Treatskill(){System.out.println(this.name+"使用了治療技能...");}
}
//進(jìn)攻型英雄類
public class Offensive extends Heroic_Characters{public Offensive(String name, int age, int HP) {super(name, age, HP);}//進(jìn)攻型public void used_Offensive_skill(){System.out.println(this.name+"使用了進(jìn)攻技能...");}
}
- 繼承后。子類會(huì)繼承父類中的成員變量和成員方法
- 如果子類和父類的成員變量、成員屬性都相同。那么繼承就變得沒有意義,所以子類繼承父類后,需要有自己特有的成員或者方法,體現(xiàn)出與父類的不同。
?4. 訪問父類成員
子類繼承父類之后,在子類中我們能否直接訪問從父類繼承下來的成員呢?
此時(shí)我們分為兩種情況:
- 子類中訪問父類的成員變量???????????????
- 子類和父類中不存在同名的成員變量
- 子類和父類中存在同名的成員變量
- 子類訪問父類中的成員方法
- 成員方法名字不同
- 成員方法名字相同
4.1 子類中訪問父類的成員變量
1.子類和父類中不存在同名的成員變量
2.子類和父類中存在同名的成員變量
?
總結(jié):在子類訪問成員變量時(shí),如果訪問的成員變量在子類中存在,那么優(yōu)先訪問子類自己的成員變量,如果子類沒有再去父類中找,如果子類和父類都沒有,那么就會(huì)報(bào)錯(cuò)。
4.2 子類中訪問父類的成員方法
?1.成員方法名字不同
2.成員方法名字相同
總結(jié):當(dāng)子類成員方法和父類成員方法名字相同時(shí),優(yōu)先從子類中找,如果子類沒有就去父類找。都找不到則進(jìn)行報(bào)錯(cuò)處理。
?那么如果我想在子類和父類成員變量或成員方法相同的情況下,訪問父類的成員該怎么辦呢?
5. super關(guān)鍵字
當(dāng)我想實(shí)現(xiàn)上述的情況時(shí),這時(shí)候就要引入Java中提供的關(guān)鍵字super來解決:該關(guān)鍵字的作用就是在子類方法中訪問父類的成員。
?在子類方法中,想要明確訪問父類中的成員變量和方法,借助super關(guān)鍵字就好啦,但是super只能在非靜態(tài)方法中使用。
6. super和this關(guān)鍵字
相同點(diǎn) | 不同點(diǎn) | |
super | 1. 都是Java中的關(guān)鍵字 2. 只能在非靜態(tài)方法中使用,訪問非靜態(tài)的成員 3.在構(gòu)造方法中調(diào)用時(shí),必須是第一條語(yǔ)句 | 1.this表示的是當(dāng)前對(duì)象的引用,supe表示的是從父類繼承下來的部分成員的引用 2. 在非靜態(tài)成員方法中, this 用來訪問本類的方法和屬性, super 用來訪問父類繼承下來的方法和屬性 3. 在構(gòu)造方法中: this( ) 用于調(diào)用本類構(gòu)造方法, super( ) 用于調(diào)用父類構(gòu)造方法,兩種調(diào)用不能同時(shí)在構(gòu)造 方法中出現(xiàn) 4. 構(gòu)造方法中一定會(huì)存在 super(...) 的調(diào)用,用戶沒有寫編譯器也會(huì)增加,但是 this(...) 用戶不寫則沒有 |
this |
?7. 子類構(gòu)造方法
當(dāng)我們子類對(duì)象構(gòu)造的時(shí)候,我們會(huì)先調(diào)用父類的構(gòu)造方法,先構(gòu)造父類對(duì)象再執(zhí)行子類的構(gòu)造方法:
?那么為什么會(huì)出現(xiàn)這樣情況呢?
子類對(duì)象中成員是有兩部分組成的,父類繼承下來的以及子類新增加的部分 。父子父子肯定是先有父再有子,那么在構(gòu)造子類對(duì)象時(shí)候 ,先要調(diào)用父類的構(gòu)造方法,將從父類繼承下來的成員構(gòu)造完整 ,然后再調(diào)用子類自己的構(gòu)造方法,將子類自己新增加的成員初始化完整。
這里有個(gè)注意事項(xiàng):
1. 若父類顯式定義無(wú)參或者默認(rèn)的構(gòu)造方法,在子類構(gòu)造方法第一行默認(rèn)有 隱含的super() 調(diào)用,即調(diào)用父類構(gòu)造方法2. 如果父類構(gòu)造方法是帶有參數(shù)的,此時(shí)需要用戶為子類顯式定義構(gòu)造方法,并在子類構(gòu)造方法中選擇合適的父類構(gòu)造方法調(diào)用,否則編譯失敗
?
8. 代碼塊的執(zhí)行順序
代碼塊分為幾個(gè)重要的代碼塊:實(shí)例代碼塊和靜態(tài)代碼塊,那么在有繼承關(guān)系的時(shí)候,這幾個(gè)代碼塊的執(zhí)行順序是怎么樣的呢?
?通過運(yùn)行結(jié)果我們就可以知道,代碼塊的執(zhí)行順序是:父類靜態(tài)代碼塊 --> 子類靜態(tài)代碼塊 --> 父類實(shí)例代碼塊 --> 父類構(gòu)造方法 --> 子類實(shí)例代碼塊 --> 子類構(gòu)造方法
注意:當(dāng)?shù)诙螌?shí)例化子類對(duì)象時(shí),父類和子類的靜態(tài)代碼塊都將不會(huì)再執(zhí)行:
?9. protected訪問修飾限定符
?1. 被public修飾
此時(shí)的Dog類和Main類在不同的包底下并且不是繼承關(guān)系,但是在Main類中任然能夠訪問Dog類中的成員變量?,所以public的權(quán)限是最廣的。
2. 被protected修飾
此時(shí)的Dog類和Main類在不同的包底下是繼承關(guān)系,在Main類中能夠訪問Dog類中的成員變量?,那么這就是protected訪問修飾符的權(quán)限(不同包有繼承關(guān)系的類能夠訪問),如果不繼承的話:
就會(huì)像上圖中一樣發(fā)生報(bào)錯(cuò)。這里有一個(gè)很重要的注意事項(xiàng):
被protected修飾,可以訪問不同包的有繼承關(guān)系的類,但是訪問的時(shí)候我們是需要通過new子類對(duì)象來進(jìn)行訪問的,直接new父類對(duì)象是訪問不了的
10. 繼承方式
在我們的Java中只支持單繼承、多層繼承、不同類繼承同一個(gè)類,但是不支持多繼承:
(1)單繼承
這種一個(gè)類只繼承另一個(gè)類的繼承方式叫做單繼承。
(2)多層繼承
?這種一個(gè)類繼承另一個(gè)類,此時(shí)又有一個(gè)類繼承該類的繼承方式叫做多繼承
(3)不同類繼承同一個(gè)類
此時(shí)狗類和貓類都繼承Animal這個(gè)類
注意:一個(gè)類是不能繼承多個(gè)類的,也就是所謂的多繼承~是不存在的
11.final關(guān)鍵字

當(dāng)我們用final修飾變量的時(shí)候,就具備了常量的屬性,此時(shí)變量的值是不能進(jìn)行修改的
(2)修飾成員方法
當(dāng)我們的成員方法被final修飾,此時(shí)的成員方法是不能被重寫的
(3)修飾類
?當(dāng)類被final修飾,說明當(dāng)前類是不能被繼承的
12. 繼承與組合
繼承表示對(duì)象之間是 is-a 的關(guān)系 ,比如:狗是動(dòng)物,貓是動(dòng)物.....組合表示對(duì)象之間是 has-a 的關(guān)系 ,比如:水果籃中有蘋果、香蕉.....

?那么此時(shí)這種表達(dá)類之間關(guān)系的方式就是一種組合~
結(jié)語(yǔ)
那么以上就是本期Java繼承的全部?jī)?nèi)容啦~希望大家收獲滿滿,在此感謝大家的觀看!!!
?