【继承、super、this、抽象类】
一 繼承
1.1 概述
多個(gè)類可以稱為子類,單獨(dú)那一個(gè)類稱為父類、超類(superclass)或者基類。
繼承描述的是事物之間的所屬關(guān)系,這種關(guān)系是:is-a 的關(guān)系。
定義
- 繼承:就是子類繼承父類的屬性和行為,使得子類對(duì)象具有與父類相同的屬性、相同的行為。子類可以直接訪問父類中的非私有的屬性和行為。
好處
特點(diǎn)
1.2 繼承的格式
通過 extends 關(guān)鍵字,可以聲明一個(gè)子類繼承另外一個(gè)父類,定義格式如下:
class 父類 {... }class 子類 extends 父類 {... }1.3 繼承后的特點(diǎn)——成員變量
成員變量不重名
如果子類父類中出現(xiàn)不重名的成員變量,這時(shí)的訪問是沒有影響的。
成員變量重名
如果子類父類中出現(xiàn)重名的成員變量,這時(shí)的訪問是有影響的。
遵守就近原則:
小貼士:Fu 類中的成員變量是非私有的,子類中可以直接訪問。若Fu 類中的成員變量私有了,子類是不能直接訪問的。通常編碼時(shí),我們遵循封裝的原則,使用private修飾成員變量,可以在父類中提供公共的getXxx方法和setXxx方法。
1.4 繼承后的特點(diǎn)——成員方法
成員方法不重名
如果子類父類中出現(xiàn)不重名的成員方法,這時(shí)的調(diào)用是沒有影響的。對(duì)象調(diào)用方法時(shí),會(huì)先在子類中查找有沒有對(duì)應(yīng)的方法,若子類中存在就會(huì)執(zhí)行子類中的方法,若子類中不存在就會(huì)執(zhí)行父類中相應(yīng)的方法。
成員方法重名——重寫(Override)
如果子類父類中出現(xiàn)重名的成員方法,這時(shí)的訪問是一種特殊情況,叫做方法重寫 (Override)。
-
方法的重載:在同一個(gè)類中,出現(xiàn)多個(gè)同名的方法,參數(shù)列表不同,與返回值類型,修飾符無關(guān)
-
方法重寫 :子類中出現(xiàn)與父類一模一樣的方法時(shí)(返回值類型,方法名和參數(shù)列表都相同),會(huì)出現(xiàn)覆蓋效果,也稱為重寫或者復(fù)寫。聲明不變,重新實(shí)現(xiàn)。
-
為什么要重寫方法:
1.當(dāng)父類中的方法無法滿足子類需求的時(shí)候,需要方法重寫
2.當(dāng)子類具有特有的功能的時(shí)候,就需要方法重寫
代碼如下:
class Fu {public void show() {System.out.println("Fu show");} } class Zi extends Fu {//子類重寫了父類的show方法public void show() {System.out.println("Zi show");} } public class ExtendsDemo05{public static void main(String[] args) {Zi z = new Zi();// 子類中有show方法,只執(zhí)行重寫后的show方法z.show(); // Zi show} }注意事項(xiàng)
子類方法覆蓋父類方法,必須要保證權(quán)限大于等于父類權(quán)限。
private(本類中) < (default 默認(rèn))(同一個(gè)包) < protected(本類和子類) < public(當(dāng)前項(xiàng)目中)
子類方法覆蓋父類方法,返回值類型、函數(shù)名和參數(shù)列表都要一模一樣。
重寫的方法可以使用@Override注解來標(biāo)識(shí)
1.5 繼承后的特點(diǎn)——構(gòu)造方法
1.6 super和this
父類空間優(yōu)先于子類對(duì)象產(chǎn)生
在每次創(chuàng)建子類對(duì)象時(shí),先初始化父類空間,再創(chuàng)建其子類對(duì)象本身。目的在于子類對(duì)象中包含了其對(duì)應(yīng)的父類空間,便可以包含其父類的成員,如果父類成員非private修飾,則子類可以隨意使用父類成員。代碼體現(xiàn)在子類的構(gòu)造方法調(diào)用時(shí),一定先調(diào)用父類的構(gòu)造方法。理解圖解如下:
super和this的含義
-
super :代表父類的存儲(chǔ)空間標(biāo)識(shí)(可以理解為父親的引用)。
-
this :代表當(dāng)前對(duì)象的引用(誰調(diào)用就代表誰)。
super和this的用法
super關(guān)鍵字的三種用法:
訪問父類的成員變量:super.父類成員變量名
訪問父類的成員方法:super.父類成員方法名(實(shí)參);
訪問父類的構(gòu)造方法:
?????? 訪問父類的空參:super();
???????訪問父類的有參:super(實(shí)參);
this關(guān)鍵字的三種用法:
訪問本類的成員變量: this.本類成員變量名 常用
訪問本類的成員方法: this.本類成員方法名(實(shí)參); 不常用
訪問本類的構(gòu)造方法: 不常用
????????訪問本類的空參: this();
????????訪問本類的有參: this(實(shí)參);
子類的每個(gè)構(gòu)造方法中均有默認(rèn)的super(),調(diào)用父類的空參構(gòu)造。手動(dòng)調(diào)用父類構(gòu)造會(huì)覆蓋默認(rèn)的super()。
super() 和 this() 都必須是在構(gòu)造方法的第一行,所以不能同時(shí)出現(xiàn)。
1.7 繼承的特點(diǎn)
頂層父類是Object類。所有的類默認(rèn)繼承Object,作為父類。
二 抽象類
2.1 概述
由來
父類中的方法,被它的子類們重寫,子類各自的實(shí)現(xiàn)都不盡相同。那么父類的方法聲明和方法主體,只有聲明還有意義,而方法主體則沒有存在的意義了。我們把沒有方法主體的方法稱為抽象方法。Java語法規(guī)定,包含抽象方法的類就是抽象類。
定義
- 抽象方法 : 沒有方法體的方法。
- 抽象類:包含抽象方法的類。
2.2 abstract使用格式
抽象方法
使用abstract 關(guān)鍵字修飾方法,該方法就成了抽象方法,抽象方法只包含一個(gè)方法名,而沒有方法體。
定義格式:
修飾符 abstract 返回值類型 方法名 (參數(shù)列表);代碼舉例:
public abstract void run();抽象類
如果一個(gè)類包含抽象方法,那么該類必須是抽象類。
定義格式:
abstract class 類名字 { }代碼舉例:
public abstract class Animal {public abstract void run(); }抽象的使用
繼承抽象類的子類必須重寫父類所有的抽象方法。否則,該子類也必須聲明為抽象類。最終,必須有子類實(shí)現(xiàn)該父類的抽象方法,否則,從最初的父類到最終的子類都不能創(chuàng)建對(duì)象,失去意義。
代碼舉例:
public class Cat extends Animal {public void run (){System.out.println("小貓?jiān)趬︻^走~~~"); } }public class CatTest {public static void main(String[] args) {// 創(chuàng)建子類對(duì)象Cat c = new Cat(); // 調(diào)用run方法c.run();} } 輸出結(jié)果: 小貓?jiān)趬︻^走~~~此時(shí)的方法重寫,是子類對(duì)父類抽象方法的完成實(shí)現(xiàn),我們將這種方法重寫的操作,也叫做實(shí)現(xiàn)方法。
2.3 注意事項(xiàng)
抽象類不能創(chuàng)建對(duì)象,如果創(chuàng)建,編譯無法通過而報(bào)錯(cuò)。只能創(chuàng)建其非抽象子類的對(duì)象。
理解:假設(shè)創(chuàng)建了抽象類的對(duì)象,調(diào)用抽象的方法,而抽象方法沒有具體的方法體,沒有意義。
抽象類中,可以有構(gòu)造方法,是供子類創(chuàng)建對(duì)象時(shí),初始化父類成員使用的。
理解:子類的構(gòu)造方法中,有默認(rèn)的super(),需要訪問父類構(gòu)造方法。
抽象類中,不一定包含抽象方法,但是有抽象方法的類必定是抽象類。
理解:未包含抽象方法的抽象類,目的就是不想讓調(diào)用者創(chuàng)建該類對(duì)象,通常用于某些特殊的類結(jié)構(gòu)設(shè)計(jì)。
抽象類的子類,必須重寫抽象父類中所有的抽象方法,否則,編譯無法通過而報(bào)錯(cuò)。除非該子類也是抽象類。
理解:假設(shè)不重寫所有抽象方法,則類中可能包含抽象方法。那么創(chuàng)建對(duì)象后,調(diào)用抽象的方法,沒有意義。
總結(jié)
以上是生活随笔為你收集整理的【继承、super、this、抽象类】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【封装、构造方法】
- 下一篇: Scanner类、Random类、Arr