日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【继承、super、this、抽象类】

發布時間:2025/3/19 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【继承、super、this、抽象类】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 繼承

1.1 概述

多個類可以稱為子類,單獨那一個類稱為父類超類(superclass)或者基類

繼承描述的是事物之間的所屬關系,這種關系是:is-a 的關系。

定義

  • 繼承:就是子類繼承父類的屬性行為,使得子類對象具有與父類相同的屬性、相同的行為。子類可以直接訪問父類中的非私有的屬性和行為。

好處

  • 提高代碼的復用性
  • 類與類之間產生了關系,是多態的前提
  • 特點

  • 子類擁有父類的成員變量和成員方法
  • 子類只能直接訪問父類的非私有成員,不能直接訪問私有成員(成員變量和成員方法)
  • java中的繼承只能單繼承,不能多繼承(相當于人只能有一個親爹)
  • java中可以多層繼承(兒子有爸爸,兒子有爺爺)
  • 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 繼承后的特點——構造方法

  • 構造方法的名字是與類名一致的。所以子類是無法繼承父類構造方法的。
  • 構造方法的作用是初始化成員變量的。所以子類的初始化過程中,必須先執行父類的初始化動作。子類的構造方法中默認有一個super() ,表示調用父類的構造方法,父類成員變量初始化后,才可以給子類使用。代碼如下:
  • class Fu {private int n;Fu(){System.out.println("Fu()");} } class Zi extends Fu {Zi(){// super(),調用父類構造方法super();System.out.println("Zi()");} } public class ExtendsDemo07{public static void main (String args[]){Zi zi = new Zi();} } 輸出結果: Fu() Zi() 注意事項:1.構造方法不能被子類繼承,但是可以使用2.子類的空參構造方法會默認調用父類的空參構造方法3.子類的有參構造方法也會默認調用父類的空參構造方法4.在子類中使用super()訪問父類的空參構造方法必須放在第一行5.在子類中使用super(實參)訪問父類的有參構造方法必須放在第一行

    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 繼承的特點

  • Java只支持單繼承,不支持多繼承。
  • //一個類只能有一個父類,不可以有多個父類。 class C extends A{} //ok class C extends A,B... //error
  • Java支持多層繼承(繼承體系)。
  • class A{} class B extends A{} class C extends B{}

    頂層父類是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、抽象类】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。