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