繼承
1. 繼承的基礎(chǔ)語法
在程序設(shè)計(jì)中,如果有多個(gè)具有邏輯關(guān)聯(lián)的類,具有相同的特性和行為(屬性和方法)。那么我們可以將這些相同的部分提取出來,做成另外的一個(gè)類。
被提取出來的類,稱作是 -- 父類,基類,超類
那些被提取共同點(diǎn),具有邏輯關(guān)聯(lián)的類,被稱作 -- 子類,派生類
他們之間的關(guān)系,叫做 -- 繼承
// Dog類繼承自Animal類
// Animal是父類
// Dog是子類
class Dog extends Animal {}
2. 繼承的基本特點(diǎn)
1、子類可以訪問父類中能看得到的所有成員。
這里的所謂的“能看得到的”,指的是訪問權(quán)限修飾符的限定。
2、Java語言是單繼承的。一個(gè)類只能有一個(gè)父類、但是一個(gè)類可以有多個(gè)子類。
多繼承容易出現(xiàn)“二義性”的問題,所以很多語言都摒棄掉多繼承。但是會(huì)通過其他的方式間接的實(shí)現(xiàn)多繼承
例如:在Java中,通過“接口”來間接實(shí)現(xiàn)多繼承。
3、構(gòu)造方法不能被繼承。
什么情況下使用繼承
如果一個(gè)類提供的功能已經(jīng)不能滿足我們的需求,此時(shí)可以考慮使用繼承來為這個(gè)類添加功能。
3. 繼承中的構(gòu)造方法
1、構(gòu)造方法是不能被繼承的
2、一個(gè)對(duì)象在堆上開辟的空間,其實(shí)可以分為兩大部分:父類繼承成員 和 子類特有成員
一個(gè)對(duì)象在進(jìn)行實(shí)例化的時(shí)候,先實(shí)例化從父類繼承到的部分,再實(shí)例化子類特有的部分
實(shí)例化父類部分的時(shí)候,需要調(diào)用父類中的構(gòu)造方法,默認(rèn)調(diào)用父類中的無參構(gòu)造
3、如果父類中沒有無參構(gòu)造方法,則子類對(duì)象將不能正常的實(shí)例化
1、給父類添加一個(gè)無參構(gòu)造
2、在子類的構(gòu)造方法中,手動(dòng)調(diào)用父類中存在的構(gòu)造方法
? super()
4. 訪問權(quán)限修飾符
用來修飾屬性、方法、類的一些修飾符,使被修飾的部分具有一定的訪問權(quán)限。
訪問權(quán)限:屬性、方法、類可以在哪些范圍被訪問。
| 訪問權(quán)限 | 修飾符 | 可以修飾 |
|---|---|---|
| 公開權(quán)限 | public | 類、方法、屬性 |
| 保護(hù)權(quán)限 | protected | 方法、屬性 |
| 包權(quán)限 | 類、方法、屬性 | |
| 私有權(quán)限 | private | 方法、屬性 |
| 訪問權(quán)限 | 當(dāng)前類 | 同包 | 跨包子類 | 跨包不同類 |
|---|---|---|---|---|
| public | √ | √ | √ | √ |
| protected | √ | √ | √ | × |
| default/package | √ | √ | × | × |
| private | √ | × | × | × |
訪問權(quán)限大小關(guān)系: public > protected > default > private
5. 方法的重寫 Override
是繼承中最重要的部分。也是多態(tài)的基礎(chǔ)。
重寫,就是在子類中,對(duì)從父類繼承到的方法進(jìn)行重新實(shí)現(xiàn)。
重寫,又叫做覆寫,用子類的實(shí)現(xiàn)覆蓋掉父類的實(shí)現(xiàn)。
重寫中需要注意的問題:
@Override
這是一個(gè)注解,附著在修飾的地方,可以做一些簡(jiǎn)單的邏輯。
用來修飾一個(gè)方法,作用是對(duì)這個(gè)方法做一個(gè)重寫的驗(yàn)證,驗(yàn)證這個(gè)方法是不是一個(gè)重寫的方法。
在進(jìn)行方法重寫的時(shí)候,@Override不是一個(gè)必須要添加的注解,但是實(shí)際開發(fā)中,我們一般都是會(huì)加上的。
重寫對(duì)方法的返回值、訪問權(quán)限的要求
1、對(duì)訪問權(quán)限的要求:子類方法的訪問權(quán)限要大于等于父類方法的訪問權(quán)限。
2、對(duì)返回值的要求:子類方法的返回值類型可以和父類方法保持一致,也可以是父類方法返回值類型的子類型。
3、重寫對(duì)方法的異常拋出類型也有要求,這個(gè)要求,后面在異常中講。
6. final關(guān)鍵字
final 關(guān)鍵字可以用來修飾什么?分別具有什么樣的意義?
1、修飾變量,表示值不可以改變,是一個(gè)常量
2、修飾類,表示這個(gè)類是一個(gè)最終類,無法被繼承
3、修飾方法,表示是一個(gè)最終方法,不能被重寫
7. Object類
Object類是Java中所有的類的根類。所有的類都直接或者間接的繼承自O(shè)bject。
這個(gè)類中定義了很多的每一個(gè)類都能使用到的方法。
- toString()
- 返回一個(gè)當(dāng)前對(duì)象的字符串表示形式。
- 如果需要將一個(gè)對(duì)象轉(zhuǎn)成字符串類型,會(huì)默認(rèn)的調(diào)用這個(gè)方法。
- hashCode()
- 返回的是一個(gè)對(duì)象的地址哈希碼
- 如果在一個(gè)散列序列中,這個(gè)方法的作用非常大
- 如果沒有在一個(gè)散列序列中,這個(gè)方法基本無用
- HashSet、HashMap。。。
- equals(Object other)
- 自定義的兩個(gè)對(duì)象的比較規(guī)則
- 理論上來講,可以任意的制定規(guī)則,但是規(guī)則制定,一般需要遵循一定的規(guī)范
- 如果other是null,則返回一定是false
- 如果this == other,則返回一定是true
- 如果this和other的類型不同,則返回一定是false
- 如果a.equals(b) == true,那么b.equals(a)結(jié)果也一定是true
- 如果a.equals(b) == ture, b.equals(c) == true,則 a.equals(c) 也一定要是true
- 引用數(shù)據(jù)類型的比較,一般情況下都是通過equals進(jìn)行比較的
- getClass()
- 獲取一個(gè)對(duì)象的類型
8. super關(guān)鍵字
和this是比較像的。
this: 對(duì)當(dāng)前對(duì)象的引用。
super: 對(duì)父類對(duì)象的引用。