好程序員大數(shù)據(jù)實(shí)用教程之繼承,首先講一下繼承的基本概念 > 如果有多個(gè)類中有相同的特征和行為(屬性和方法),并且這多個(gè)類之間從邏輯上講是有一定的關(guān)聯(lián)的。那么此時(shí),我們可以將這些共同的部分單獨(dú)寫(xiě)到一個(gè)類中。 > > > Monkey: name, age, gender, walk(), sleep(), eat() > > > > Tiger: name, age, gender, walk(), sleep(), eat() > > > > Elephent: name, age, gender, walk(), sleep(), eat() > > > 可以將上述三種類中,共同的部分提取出來(lái) > > > > Animal: name, age, gender, walk(), sleep(), eat() > > 此時(shí),被提取出的這個(gè)類,稱作是--**父類**,基類,超類 > > 具有相同特征的那些類,稱作是--**子類**,派生類 > > > 從A類派生出B類:A是B的父類,B是A的子類 > > 他們之間的關(guān)系,是 **繼承**:子類繼承自父類 關(guān)鍵字:**extends** > 用來(lái)描述兩個(gè)類之間的繼承關(guān)系 > > ```java > class Monkey extends Animal {} > // Monkey繼承自Animal > // Moneky是Animal的子類,Animal是Monkey的父類 > ``` #### 繼承中的特點(diǎn) 1. Java語(yǔ)言是單繼承的,一個(gè)類只能有一個(gè)父類,一個(gè)類可以有多個(gè)子類 > 在某些語(yǔ)言中是支持多繼承的。例如:C++、python... > > 但是在多繼承中,會(huì)有一個(gè)問(wèn)題:二義性。 > > 雖然很多語(yǔ)言都拋棄了多繼承,但是還是會(huì)用其他的方式來(lái)間接的實(shí)現(xiàn)類似多繼承。 > > 例如:在java中是用接口實(shí)現(xiàn)的。 > > > > Java中所有的類都直接或者簡(jiǎn)介的繼承自 **Object** 類 2. 子類可以訪問(wèn)到父類中能看的見(jiàn)的成員 > 能看得見(jiàn)的:訪問(wèn)權(quán)限 3. 構(gòu)造方法不能繼承。 為什么要用繼承? 1. 為了降低代碼冗余度 2. 為了給一個(gè)類拓展功能。 > 如果某一個(gè)類給我們提供的功能不能滿足我們的需求了,而且此時(shí)我們還不能修改這個(gè)類。那么我們要第一時(shí)間想到繼承。 #### 繼承中的構(gòu)造方法 > 一個(gè)對(duì)象在實(shí)例化的時(shí)候,需要先去實(shí)例化從父類繼承到的成員 > > 在實(shí)例化父類部分的時(shí)候,默認(rèn)使用父類中的無(wú)參構(gòu)造 > > > > 問(wèn)題:如果父類中沒(méi)有無(wú)參構(gòu)造,或者父類中的無(wú)參構(gòu)造子類無(wú)法訪問(wèn)(使用private修飾無(wú)參構(gòu)造),則此時(shí)子類對(duì)象無(wú)法完成實(shí)例化。 > > 解決: > > 1. 給父類中添加一個(gè)子類能夠訪問(wèn)到的無(wú)參構(gòu)造方法 > > 2. 在子類的構(gòu)造方法中,手動(dòng)調(diào)用父類中能夠訪問(wèn)到的構(gòu)造方法,來(lái)實(shí)例化父類部分 #### 方法的重寫(xiě) > 繼承中最重要的一個(gè)知識(shí)點(diǎn) > 重寫(xiě),又叫做覆寫(xiě),值得是對(duì)同樣的一個(gè)方法,用子類的實(shí)現(xiàn)覆蓋掉父類的實(shí)現(xiàn)。 > @Override: > > 是一個(gè)注解,常用在方法的重寫(xiě)中。表示在進(jìn)行方法重寫(xiě)之前,進(jìn)行一個(gè)驗(yàn)證。驗(yàn)證這個(gè)方法,到底是不是在重寫(xiě)父類中的方法。這個(gè)注解,可以添加,也可以不添加。但是,一般情況下,我們都是要加上去的 > 在重寫(xiě)的時(shí)候需要注意的問(wèn)題: > > 1. 訪問(wèn)權(quán)限問(wèn)題: > > 子類方法的訪問(wèn)權(quán)限不能比父類方法中的訪問(wèn)權(quán)限低,要大于等于父類方法的訪問(wèn)權(quán)限 > > public > protected > default > private > > 2. 關(guān)于返回值類型:在重寫(xiě)的時(shí)候,要求方法名和參數(shù)必須和父類中方法相同 > > 子類方法的返回值類型可以和父類方法中返回值類型相同。也可以是父類方法中返回值類型的子類型。 > > 3. 關(guān)于異常的拋出。 ####final關(guān)鍵字 | 修飾 | 意義 | | ---- | -------------------------------------- | | 變量 | 這個(gè)變量的值不能改變,就是常量 | | 類 | 表示是一個(gè)最終類,這個(gè)類無(wú)法被繼承 | | 方法 | 表示是一個(gè)最終方法,這個(gè)方法無(wú)法被重寫(xiě) | #### super關(guān)鍵字的使用 super表示對(duì)父類的引用。 - 用在構(gòu)造方法中,可以使用super()調(diào)用父類的構(gòu)造方法 - 在普通的方法中可以調(diào)用父類的方法 #### 訪問(wèn)權(quán)限修飾符 > 用來(lái)描述一個(gè)類、方法、屬性、接口、枚舉...能夠被訪問(wèn)到的一個(gè)范圍 > > 訪問(wèn)權(quán)限一共有四種: > > 公開(kāi)(public) > > 保護(hù)(protected) > > 包(default / package) > > 私有(private) > > public > protected > default > private > > 對(duì)應(yīng)的訪問(wèn)權(quán)限修飾符一共有三個(gè): > > public、protected、private > > > 注:包權(quán)限沒(méi)有訪問(wèn)權(quán)限修飾符,如果一個(gè)方法、屬性、類...沒(méi)有使用任意的訪問(wèn)權(quán)限修飾符來(lái)修飾,那么他的訪問(wèn)權(quán)限就是包權(quán)限 | 訪問(wèn)權(quán)限 | 可以修飾什么 | 可以訪問(wèn)的范圍 | | --------- | ------------ | ---------------------------------------------- | | private | 類成員 | 只能在當(dāng)前的類中訪問(wèn) | | default | 類成員、類 | 只能在當(dāng)前的包中進(jìn)行訪問(wèn) | | protected | 類成員 | 可以在當(dāng)前的包中訪問(wèn),也可以在跨包的子類中訪問(wèn) | | public | 類成員、類 | 可以在項(xiàng)目中任意的位置進(jìn)行訪問(wèn) | #### Object類 > Object這個(gè)類是所有類的父類,在Java中,所有的類都直接或者間接的繼承自Object類 > > 在Object類中,定義了一些我們比較常用的方法。 ```java /** * 返回一個(gè)對(duì)象的字符串表示形式。 * 這個(gè)方法,在一個(gè)對(duì)象需要轉(zhuǎn)型成字符串類型的時(shí)候,自動(dòng)調(diào)用 * 例如:在控制臺(tái)輸出、和字符串做拼接 */ public String toString() { return ""; } /** * 獲取一個(gè)對(duì)象的類型(Class對(duì)象) */ public Class<?> getClass(); /** * 用來(lái)比較兩個(gè)對(duì)象是否相同的,在Object類中,默認(rèn)還是比較兩個(gè)對(duì)象的地址 * 可以重寫(xiě)equals,實(shí)現(xiàn)自己的比較的規(guī)則 * 1、如果other是null,返回結(jié)果一定是false * 2、如果this == other,返回結(jié)果一定是true * 3、如果this和other的類型不同,返回結(jié)果一定是false * 4、如果x.equals(y) == true,那么 y.equals(x) 一定也得是true * 5、如果x.equals(y) == true, y.equals(z) == true, 那么 x.equals(z) 一定也得是true * * 如果兩個(gè)對(duì)象用來(lái)比較是否相同,盡量使用equals來(lái)比較。 * 如果兩個(gè)基本數(shù)據(jù)類型是否相同,不要使用equals,直接使用==即可 */ public boolean equals(Object other) { return (this == other); } /** * 獲取一個(gè)對(duì)象的哈希碼、散列碼。 * 如果在一個(gè)對(duì)象沒(méi)有在一個(gè)散列序列中的話,沒(méi)有任何作用。 * 但是,如果一個(gè)對(duì)象是存儲(chǔ)在一個(gè)散列序列中,這個(gè)方法有大作用。 * 散列序列: HashSet、HashMap... */ public int hashCode() ; /** * 析構(gòu)方法 * 在實(shí)例化一個(gè)對(duì)象的時(shí)候,會(huì)執(zhí)行構(gòu)造方法。當(dāng)這個(gè)對(duì)象被銷毀之前,會(huì)執(zhí)行這個(gè)析構(gòu)方法。 */ protected void finalize() throws Throwable { } ``` |
|
來(lái)自: 好程序員IT > 《大數(shù)據(jù)培訓(xùn)教程》