群暉nas 做網(wǎng)站抖音視頻seo霸屏
本文描述了關(guān)于繼承的大部分知識,但是并不全,每篇博客之間的知識都有互串,所以需要把幾篇文章合起來看,學(xué)會(huì)融會(huì)貫通!
溫馨提示:使用PC端觀看,效果更佳!?
目錄
1.繼承是什么
2.什么時(shí)候用到繼承
3.如何實(shí)現(xiàn)繼承
4.關(guān)于對象的訪問
?編輯
5.使用super關(guān)鍵字訪問父類
6.父類構(gòu)造方法
7.介紹protected
8.final關(guān)鍵字
1.繼承是什么
(1)在現(xiàn)實(shí)生活中,我們都聽說過子承父業(yè)這個(gè)詞,這種也叫繼承。
(2)某某小孩很頑皮,這肯定是繼承了他爸的基因
那么在計(jì)算機(jī)中,繼承是怎么樣的呢?
(1)一個(gè)類繼承了另一個(gè)類,這稱為繼承;前者成為子類,而后者就是父類
(2)繼承機(jī)制是面向?qū)ο蟪绦蛟O(shè)計(jì)使代碼可以復(fù)用的最重要的手段,允許程序員在保持原有類特性的基礎(chǔ)上進(jìn)行擴(kuò)展,增加新功能,這樣產(chǎn)生的類,稱為派生類。
2.什么時(shí)候用到繼承
(1)當(dāng)幾個(gè)類中有較多重復(fù)的代碼時(shí);當(dāng)兩個(gè)類的屬性很相近時(shí)。
(2)例如:
這個(gè)時(shí)候我們可以用到繼承
3.如何實(shí)現(xiàn)繼承
(1)語法
繼承使用到關(guān)鍵字:extends
class 類名 extends 類名 {}
(2)示例
class Animal {public String name;public int age;public void eat() {System.out.println("正在吃");}
}
class dog extends Animal {public String color;public void doing() {System.out.println("正在旺旺叫");}
}
class Cat extends Animal{public void doing() {System.out.println("正在喵喵喵");}
}
(3)作用
這樣就完成了對共性的抽取,實(shí)現(xiàn)了代碼的復(fù)用
4.關(guān)于對象的訪問
?下面做一些測試,觀察默認(rèn)情況下是如果訪問的
(1)子類和父類中不存在相同的變量名字
(2)子類和父類中存在相同變量名字
結(jié)果:
直接訪問,訪問到的是子類中的變量
(3)訪問成員方法
結(jié)果:
同樣,如果子類和父類中存在相同的名字,優(yōu)先訪問子類
(4)訪問父類私有成員
我們都知道,當(dāng)被private修飾之和,直接訪問權(quán)限就被限制在了同一個(gè)類中;那如果是繼承它的子類呢?
1)直接訪問
2)間接訪問
(5)總結(jié)
?1)通過子類對象的引用,去訪問子類和父類中不存在相同名字的變量和方法時(shí),優(yōu)先在子類中尋找,若子類中不存在該變量或者方法時(shí),才會(huì)到父類中尋找,若都不存在,則編譯報(bào)錯(cuò)。
2)通過子類對象的引用,去訪問子類和父類中存在相同名字的變量或方法(不構(gòu)成重載),同樣優(yōu)先訪問子類,子類中不存在才去訪問父類,都沒有則編譯報(bào)錯(cuò)。
3)那如果子類和父類中存在相同的名字和方法,該如何訪問到父類中的呢?下面介紹一個(gè)關(guān)鍵字:super
5.使用super關(guān)鍵字訪問父類
這個(gè)super關(guān)鍵字和this有三個(gè)類似的功能,而super出現(xiàn)的意義就是:在子類的方法中訪問父類
(1)super訪問父類成員變量
這種一定是要求在子類這個(gè)類中,而且是在子類中一個(gè)方法內(nèi)
訪問:
結(jié)果:前面兩個(gè)為子類,后面一個(gè)為父類
(2)訪問父類成員方法
三種訪問方式:
結(jié)果:
(3)super和this的大致訪問
(4)super訪問父類構(gòu)造方法
下面先介紹父類構(gòu)造方法
6.父類構(gòu)造方法
在構(gòu)造方法這里,和前面類的構(gòu)造方法很類似。不寫構(gòu)造方法時(shí),編譯器默認(rèn)提供,寫了不帶參數(shù)沒有實(shí)現(xiàn)的構(gòu)造方法也默認(rèn)沒有提供,但是如果寫了帶參數(shù)的構(gòu)造方法,編譯器則不會(huì)再提供
(1)不提供構(gòu)造方法
第一種情況:正常
第二種情況:正常
第三種情況:
(2)主動(dòng)提供構(gòu)造方法
第一種情況:只給子類提供
第二種情況:只給父類提供(報(bào)錯(cuò))
原因解釋:當(dāng)父類提供了構(gòu)造方法之后,子類就不會(huì)再提高任何的構(gòu)造方法;因?yàn)楦割愋枰跏蓟?#xff0c;但是子類中沒有構(gòu)造方法,無法調(diào)用父類的構(gòu)造方法,所以會(huì)報(bào)錯(cuò)
做法:在子類中也提供構(gòu)造方法,并在里面使用super關(guān)鍵字調(diào)用父類構(gòu)造方法
第三種情況:子類父類都提供
根據(jù)上面的情況,我們可以做出一些總結(jié)
(3)關(guān)于構(gòu)造方法的總結(jié)
1)父子類,每次構(gòu)造子類對象前,都會(huì)先完成對父類的構(gòu)造。也就是說,總是會(huì)先調(diào)用父類的構(gòu)造方法,再調(diào)用子類的構(gòu)造方法
2)程序員不提供任何構(gòu)造方法,編譯器都會(huì)默認(rèn)提供
3)當(dāng)父類手動(dòng)提供了構(gòu)造方法,而子類卻沒有,則會(huì)報(bào)錯(cuò),因?yàn)樽宇悷o構(gòu)造方法則無法調(diào)用
4)針對上面第三點(diǎn)的解釋:為什么子類和父類都不提供構(gòu)造方法時(shí),可以調(diào)用到父類構(gòu)造?
即使是默認(rèn)的構(gòu)造方法,在子類構(gòu)造中,也都會(huì)默認(rèn)有一個(gè)super()語句,無論寫沒寫。
當(dāng)父類手動(dòng)提供了帶參構(gòu)造方法之后,子類中也就不會(huì)再提供任何的構(gòu)造方法;同理,子類中手動(dòng)提供了帶參構(gòu)造方法,父類中也不會(huì)再提供。但是,前者會(huì)報(bào)錯(cuò),因?yàn)闃?gòu)造子類前,一定會(huì)先去構(gòu)造父類(但是沒有super(),無法調(diào)用父類構(gòu)造);而后者,父類不存在帶參構(gòu)造方法,不需要強(qiáng)制初始化。(存在帶參構(gòu)造方法時(shí),在實(shí)例化一定要對其賦值,否則就是報(bào)錯(cuò),上面的終究原因)
(4)使用super()調(diào)用父類構(gòu)造方法
1)默認(rèn)提供(不細(xì)說了)
2)手動(dòng)提供
class Big {public int a;public Big(int a) {this.a = a;}
}
class Min extends Big {public int b;public Min(int a, int b) {super(a);this.b = b;}
}
public class Test3 {public static void main(String[] args) {Min min = new Min(10,20);}
}
(5)關(guān)于super的細(xì)節(jié)和注意事項(xiàng)
1)super()必須在子類構(gòu)造方法中的第一行,否則報(bào)錯(cuò)
并且,super()只能出現(xiàn)一次,也不能和this()同時(shí)出現(xiàn)(他們都必須在第一行)
2)只能存在于非靜態(tài)的方法中,依賴對象;用來訪問非靜態(tài)成員方法和字段
7.介紹protected
這是一個(gè)關(guān)鍵字,一般是用于修飾成員變量和成員方法
根據(jù)上表可知,只要在同一個(gè)包中,不同類之間是可以互相使用的;它還多了一條性質(zhì),就是只要是父子類關(guān)系,在不同的類中也可以互相調(diào)用。
下面是不同包中的兩個(gè)類?
(1)不能訪問的狀態(tài)
1)public修飾
2)被protected修飾后
意思就是:在不同包中,不能直接訪問被protected修飾的成員變量
(2)允許訪問狀態(tài)
想要訪問被protected修飾的成員變量,就要按照下面的步驟來進(jìn)行
1)使用繼承關(guān)系
2)使用super關(guān)鍵字訪問父類
錯(cuò)誤原因就是super不能在靜態(tài)方法中使用
3)正確訪問
訪問并且賦值:
8.final關(guān)鍵字
final關(guān)鍵字在java中有三個(gè)功能。
(1)修飾變量(2)修飾類(3)修飾方法
(1)修飾變量
1)未修飾時(shí):
public static void main(String[] args) {int a = 520;System.out.println(a);a = 250;System.out.println(a);}
未被修飾時(shí),變量的值是可以被改變的;也就是說,沒有被final修飾的520就是250
2)加上修飾
語法:
final 類型 變量名字 = 值;
被fianl修飾的變量,可以理解成變成了一個(gè)常量,此時(shí)是無法被修改的。
(2)final修飾類
作用:被final修飾的類,不能再被繼承,稱為密封類
1)修飾前:
2)修飾后:
(3)修飾方法
作用:當(dāng)這個(gè)方法被修飾后,表明這個(gè)方法不能再被重寫
1)未被修飾
2)被修飾后