日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

好程序員大數(shù)據(jù)教程系列之繼承

 好程序員IT 2019-12-11

好程序員大數(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)

> >

> > Animalname, age, gender,  walk(), sleep(), eat()

>

> 此時(shí),被提取出的這個(gè)類,稱作是--**父類**,基類,超類

>

> 具有相同特征的那些類,稱作是--**子類**,派生類

>

> > A類派生出B類:AB的父類,BA的子類

>

> 他們之間的關(guān)系,是 **繼承**:子類繼承自父類

關(guān)鍵字:**extends**

> 用來(lái)描述兩個(gè)類之間的繼承關(guān)系

>

> ```java

> class Monkey extends Animal {}

> // Monkey繼承自Animal

> // MonekyAnimal的子類,AnimalMonkey的父類

> ```

#### 繼承中的特點(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、如果othernull,返回結(jié)果一定是false

 * 2、如果this == other,返回結(jié)果一定是true

 * 3、如果thisother的類型不同,返回結(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 { }

```

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多