當前位置: 首頁 / 技術分享 / 正文
好程序員大數據培訓分享大數據實用教程系列之繼承

2019-12-11

BigData 好程序員 大數據培訓 大數據教程

好程序員大數據培訓分享實用教程之繼承,首先講一下繼承的基本概念

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

>

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

> >

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

> >

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

>

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

> >

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

>

此時,被提取出的這個類,稱作是--**父類**,基類,超類

>

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

>

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

>

他們之間的關系,是 **繼承**:子類繼承自父類

 

關鍵字:**extends**

 

用來描述兩個類之間的繼承關系

>

> ```java

> class Monkey extends Animal {}

> // Monkey繼承自Animal

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

> ```

 

#### 繼承中的特點

 

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

 

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

   >

   > 但是在多繼承中,會有一個問題:二義性。

   >

   > 雖然很多語言都拋棄了多繼承,但是還是會用其他的方式來間接的實現類似多繼承。

   >

   > 例如:在java中是用接口實現的。

   >

   >  

   >

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

 

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

 

   > 能看得見的:訪問權限

 

3. 構造方法不能繼承。

 

為什么要用繼承?

 

1. 為了降低代碼冗余度

 

2. 為了給一個類拓展功能。

 

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

 

#### 繼承中的構造方法

 

一個對象在實例化的時候,需要先去實例化從父類繼承到的成員

>

在實例化父類部分的時候,默認使用父類中的無參構造

>

>  

>

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

>

解決:

>

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

>

> 2. 在子類的構造方法中,手動調用父類中能夠訪問到的構造方法,來實例化父類部分

 

#### 方法的重寫

 

繼承中最重要的一個知識點

 

重寫,又叫做覆寫,值得是對同樣的一個方法,用子類的實現覆蓋掉父類的實現。

 

> @Override:

>

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

 

在重寫的時候需要注意的問題:

>

> 1. 訪問權限問題:

>

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

>

>    public > protected > default > private

>

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

>

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

>

> 3. 關于異常的拋出。

 

####final關鍵字

 

修飾 意義                                   |

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

變量 這個變量的值不能改變,就是常量         |

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

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

 

#### super關鍵字的使用

 

super表示對父類的引用。

 

用在構造方法中,可以使用super()調用父類的構造方法

在普通的方法中可以調用父類的方法

 

#### 訪問權限修飾符

 

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

>

訪問權限一共有四種:

>

公開(public

>

保護(protected

>

包(default / package

>

私有(private

>

> public > protected > default > private

>

對應的訪問權限修飾符一共有三個:

>

> publicprotectedprivate

>

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

 

訪問權限  可以修飾什么 可以訪問的范圍                                 |

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

| private   | 類成員       只能在當前的類中訪問                           |

| default   | 類成員、類   只能在當前的包中進行訪問                       |

| protected | 類成員       可以在當前的包中訪問,也可以在跨包的子類中訪問 |

| public    | 類成員、類   可以在項目中任意的位置進行訪問                 |

 

 

#### Object

 

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

>

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

 

```java

/**

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

 * 這個方法,在一個對象需要轉型成字符串類型的時候,自動調用

 * 例如:在控制臺輸出、和字符串做拼接

 */

public String toString() {

    return "";

}

 

/**

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

 */

public Class<?> getClass();

 

/**

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

 * 可以重寫equals,實現自己的比較的規則

 * 1、如果othernull,返回結果一定是false

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

 * 3、如果thisother的類型不同,返回結果一定是false

 * 4、如果x.equals(y) == true,那么 y.equals(x) 一定也得是true

 * 5、如果x.equals(y) == true, y.equals(z) == true, 那么 x.equals(z) 一定也得是true

 *

 * 如果兩個對象用來比較是否相同,盡量使用equals來比較。

 * 如果兩個基本數據類型是否相同,不要使用equals,直接使用==即可

 */

public boolean equals(Object other) {

    return (this == other);

}

 

/**

 * 獲取一個對象的哈希碼、散列碼。

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

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

 * 散列序列: HashSetHashMap...

 */

public int hashCode() ;

 

/**

 * 析構方法

 * 在實例化一個對象的時候,會執行構造方法。當這個對象被銷毀之前,會執行這個析構方法。

 */

protected void finalize() throws Throwable { }


好程序員開班動態

More+
  • HTML5大前端 <高端班>

    開班時間:2020-02-17(北京)

    預約報名

    開班時間:2020-03-02(深圳)

    預約報名
  • 大數據+人工智能 <好程序員嚴選班>

    開班時間:2019-12-23(北京)

    開班盛況
  • 大數據+人工智能 <好程序員班>

    開班時間:2020-02-24(杭州)

    預約報名

    開班時間:2020-02-17(北京)

    預約報名
  • JavaEE分布式開發 <高端班>

    開班時間:2020-03-09(北京)

    預約報名
  • Python全棧+人工智能 <高端班>

    開班時間:2019-07-22(北京)

    開班盛況
  • 云計算開發 <高端班>

    開班時間:2020-02-24(北京)

    預約報名
在線咨詢
免費試聽
入學教程
立即報名

Copyright 2007-2019 北京千鋒互聯科技有限公司 .All Right 京ICP備12003911號-5 京公安網11010802011455號

狠狠干_日日操_天天操_东京干_狠狠日影院