小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

 好程序員IT 2019-12-11

好程序員大數(shù)據(jù)實(shí)用教程之繼承,首先講一下繼承的基本概念

> 如果有多個(gè)類中有相同的特征和行為(屬性和方法),并且這多個(gè)類之間從邏輯上講是有一定的關(guān)聯(lián)的。那么此時(shí),我們可以將這些共同的部分單獨(dú)寫到一個(gè)類中。

>

> > Monkey: name, age, gender,  walk(), sleep(), eat()

> >

> > Tiger: name, age, gender,  walk(), sleep(), eat()

> >

> > Elephent:  name, age, gender,  walk(), sleep(), eat()

>

> > 可以將上述三種類中,共同的部分提取出來

> >

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

>

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

>

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

>

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

>

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

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

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

>

> ```java

> class Monkey extends Animal {}

> // Monkey繼承自Animal

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

> ```

#### 繼承中的特點(diǎn)

1. Java語言是單繼承的,一個(gè)類只能有一個(gè)父類,一個(gè)類可以有多個(gè)子類

   > 在某些語言中是支持多繼承的。例如:C++python...

   >

   > 但是在多繼承中,會(huì)有一個(gè)問題:二義性。

   >

   > 雖然很多語言都拋棄了多繼承,但是還是會(huì)用其他的方式來間接的實(shí)現(xiàn)類似多繼承。

   >

   > 例如:在java中是用接口實(shí)現(xiàn)的。

   >

   >  

   >

   > Java中所有的類都直接或者簡介的繼承自 **Object**

2. 子類可以訪問到父類中能看的見的成員

   > 能看得見的:訪問權(quán)限

3. 構(gòu)造方法不能繼承。

為什么要用繼承?

1. 為了降低代碼冗余度

2. 為了給一個(gè)類拓展功能。

   > 如果某一個(gè)類給我們提供的功能不能滿足我們的需求了,而且此時(shí)我們還不能修改這個(gè)類。那么我們要第一時(shí)間想到繼承。

#### 繼承中的構(gòu)造方法

> 一個(gè)對象在實(shí)例化的時(shí)候,需要先去實(shí)例化從父類繼承到的成員

>

> 在實(shí)例化父類部分的時(shí)候,默認(rèn)使用父類中的無參構(gòu)造

>

>  

>

> 問題:如果父類中沒有無參構(gòu)造,或者父類中的無參構(gòu)造子類無法訪問(使用private修飾無參構(gòu)造),則此時(shí)子類對象無法完成實(shí)例化。

>

> 解決:

>

> 1. 給父類中添加一個(gè)子類能夠訪問到的無參構(gòu)造方法

>

> 2. 在子類的構(gòu)造方法中,手動(dòng)調(diào)用父類中能夠訪問到的構(gòu)造方法,來實(shí)例化父類部分

#### 方法的重寫

> 繼承中最重要的一個(gè)知識點(diǎn)

> 重寫,又叫做覆寫,值得是對同樣的一個(gè)方法,用子類的實(shí)現(xiàn)覆蓋掉父類的實(shí)現(xiàn)。

> @Override:

>

>  是一個(gè)注解,常用在方法的重寫中。表示在進(jìn)行方法重寫之前,進(jìn)行一個(gè)驗(yàn)證。驗(yàn)證這個(gè)方法,到底是不是在重寫父類中的方法。這個(gè)注解,可以添加,也可以不添加。但是,一般情況下,我們都是要加上去的

> 在重寫的時(shí)候需要注意的問題:

>

> 1. 訪問權(quán)限問題:

>

>     子類方法的訪問權(quán)限不能比父類方法中的訪問權(quán)限低,要大于等于父類方法的訪問權(quán)限

>

>     public > protected > default > private

>

> 2. 關(guān)于返回值類型:在重寫的時(shí)候,要求方法名和參數(shù)必須和父類中方法相同

>

>     子類方法的返回值類型可以和父類方法中返回值類型相同。也可以是父類方法中返回值類型的子類型。

>

> 3. 關(guān)于異常的拋出。

####final關(guān)鍵字

| 修飾 | 意義                                   |

| ---- | -------------------------------------- |

| 變量 | 這個(gè)變量的值不能改變,就是常量         |

| 類   | 表示是一個(gè)最終類,這個(gè)類無法被繼承     |

| 方法 | 表示是一個(gè)最終方法,這個(gè)方法無法被重寫 |

#### super關(guān)鍵字的使用

super表示對父類的引用。

- 用在構(gòu)造方法中,可以使用super()調(diào)用父類的構(gòu)造方法

- 在普通的方法中可以調(diào)用父類的方法

#### 訪問權(quán)限修飾符

> 用來描述一個(gè)類、方法、屬性、接口、枚舉...能夠被訪問到的一個(gè)范圍

>

> 訪問權(quán)限一共有四種:

>

> 公開(public

>

> 保護(hù)(protected

>

> 包(default / package

>

> 私有(private

>

> public > protected > default > private

>

> 對應(yīng)的訪問權(quán)限修飾符一共有三個(gè):

>

> public、protectedprivate

>

> > 注:包權(quán)限沒有訪問權(quán)限修飾符,如果一個(gè)方法、屬性、類...沒有使用任意的訪問權(quán)限修飾符來修飾,那么他的訪問權(quán)限就是包權(quán)限

| 訪問權(quán)限  | 可以修飾什么 | 可以訪問的范圍                                 |

| --------- | ------------ | ---------------------------------------------- |

| private   | 類成員       | 只能在當(dāng)前的類中訪問                           |

| default   | 類成員、類   | 只能在當(dāng)前的包中進(jìn)行訪問                       |

| protected | 類成員       | 可以在當(dāng)前的包中訪問,也可以在跨包的子類中訪問 |

| public    | 類成員、類   | 可以在項(xiàng)目中任意的位置進(jìn)行訪問                 |

#### Object

> Object這個(gè)類是所有類的父類,在Java中,所有的類都直接或者間接的繼承自Object

>

> Object類中,定義了一些我們比較常用的方法。

```java

/**

 * 返回一個(gè)對象的字符串表示形式。

 * 這個(gè)方法,在一個(gè)對象需要轉(zhuǎn)型成字符串類型的時(shí)候,自動(dòng)調(diào)用

 * 例如:在控制臺(tái)輸出、和字符串做拼接

 */

public String toString() {

    return "";

}

/**

 * 獲取一個(gè)對象的類型(Class對象)

 */

public Class<?> getClass();

/**

 * 用來比較兩個(gè)對象是否相同的,在Object類中,默認(rèn)還是比較兩個(gè)對象的地址

 * 可以重寫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è)對象用來比較是否相同,盡量使用equals來比較。

 * 如果兩個(gè)基本數(shù)據(jù)類型是否相同,不要使用equals,直接使用==即可

 */

public boolean equals(Object other) {

    return (this == other);

}

/**

 * 獲取一個(gè)對象的哈希碼、散列碼。

 * 如果在一個(gè)對象沒有在一個(gè)散列序列中的話,沒有任何作用。

 * 但是,如果一個(gè)對象是存儲(chǔ)在一個(gè)散列序列中,這個(gè)方法有大作用。

 * 散列序列: HashSetHashMap...

 */

public int hashCode() ;

/**

 * 析構(gòu)方法

 * 在實(shí)例化一個(gè)對象的時(shí)候,會(huì)執(zhí)行構(gòu)造方法。當(dāng)這個(gè)對象被銷毀之前,會(huì)執(zhí)行這個(gè)析構(gòu)方法。

 */

protected void finalize() throws Throwable { }

```

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多