色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

super調用父類的構造方法

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-10 16:42 ? 次閱讀

我們分析這句話“父類對象的引用”,那說明我們使用的時候只能在子類中使用,既然是對象的引用,那么我們也可以用來調用成員屬性以及成員方法,當然了,這里的 super 關鍵字還能夠調用父類的構造方法。具體有如下幾種用法:

1、調用父類的構造方法

Java中的繼承大家都應該了解,子類繼承父類,我們是能夠用子類的對象調用父類的屬性和方法的,我們知道屬性和方法只能夠通過對象調用,那么我們可以大膽假設一下:

在創建子類對象的同時,也創建了父類的對象,而創建對象是通過調用構造函數實現的,那么我們在創建子類對象的時候,應該會調用父類的構造方法。

下面我們看這段代碼:

public class Parent {

    public Parent(){
        System.out.println("父類默認無參構造方法");
    }
}


public class Son extends Parent {

    public Son(){
        System.out.println("子類默認無參構造方法");
    }
}

下面我們創建子類的對象:

public static void main(String[] args) {
        Son son = new Son();
    }

打印結果:

圖片
通過打印結果看到我們在創建子類對象的時候,首先調用了父類的構造方法,接著調用子類的構造方法,也就是說在創建子類對象的時候,首先創建了父類對象,與前面我們猜想的一致。

那么問題又來了:是在什么時候調用的父類構造方法呢?

可以參考Java官方文檔:https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#d5e14278

圖片
紅色框內的英文翻譯為:如果聲明的類是原始類Object,那么默認的構造函數有一個空的主體。否則,默認構造函數只是簡單地調用沒有參數的超類構造函數。

也就是說除了頂級類 Object.class 構造函數沒有調用父類的構造方法,其余的所有類都默認在構造函數中調用了父類的構造函數(沒有顯式聲明父類的子類其父類是 Object)。

那么是通過什么來調用的呢?我們接著看官方文檔:

圖片
上面的意思大概就是超類構造函數通過 super 關鍵字調用,并且是以 super 關鍵字開頭。

所以上面的 Son 類的構造方法實際上應該是這樣的:

圖片
①、子類默認是通過 super() 調用父類的無參構造方法,如果父類顯示聲明了一個有參構造方法,而沒有聲明無參構造方法,實例化子類是會報錯的。

public class Parent {

    public Parent(String name){
        System.out.println("父類有參構造方法");
    }
}

public class Son extends Parent {

    public Son(){
        System.out.println("子類默認無參構造方法");
    }

    public static void main(String[] args) {
        Son son = new Son();
    }

}

上面代碼是會報錯的:

圖片
解決辦法就是通過 super 關鍵字調用父類的有參構造方法:

public class Son extends Parent {

    public Son(){
        super("Tom");
        System.out.println("子類默認無參構造方法");
    }

    public static void main(String[] args) {
        Son son = new Son();
    }

}

注意看第 4 行代碼,同理,多個參數也是這種調法。

2、調用父類的成員屬性

public class Parent {
    public String name;

    public Parent(){
        System.out.println("父類默認無參構造方法");
    }
}

public class Son extends Parent {

    public Son(){
        System.out.println("子類默認無參構造方法");
    }

    public void printName(){
        System.out.println(super.name);
    }

}

第 16 行代碼 super.父類屬性 通過這種形式來調用父類的屬性。

3、調用父類的方法

public class Parent {
    public String name;

    public Parent(){
        System.out.println("父類默認無參構造方法");
    }

    public void setName(String name){
        this.name = name;
    }
}

public class Son extends Parent {

    public Son(){
        super();//1、調用父類構造函數
        System.out.println("子類默認無參構造方法");
    }

    public void printName(){
        super.setName("Tom");//2、調用父類方法
        System.out.println(super.name);//3、調用父類屬性
    }

    public static void main(String[] args) {
        Son son = new Son();
        son.printName();//Tom
    }

}

這個例子我們在子類中分別調用了父類的構造方法、普通方法以及成員屬性。

4、this 和 super 出現在同一個構造方法中?

不能!!!

在上一篇博客對 this 關鍵字 的介紹中,我們知道能夠通過 this 關鍵字調用自己的構造方法。而本篇博客介紹 super 關鍵字,我們知道了能夠通過 super 調用父類的構造方法,那么這兩個關鍵字能同時出現在子類的構造方法中嗎?

①、假設 super() 在 this() 關鍵字的前面

首先通過 super() 調用父類構造方法,對父類進行一次實例化。接著調用 this() ,this() 方法會調用子類的構造方法,在子類的構造方法中又會對父類進行一次實例化。也就是說我們對子類進行一次實例化,對造成對父類進行兩次實例化,所以顯然編譯器是不允許的。

public class Parent {
    public String name;

    public Parent(){
        System.out.println("父類默認無參構造方法");
    }

    public Parent(String name){
        System.out.println("父類有參構造方法");
    }

}

public class Son extends Parent {

    public Son(){
        super();//1、調用父類構造函數
        this("Tom");//2、調用子類構造方法
        System.out.println("子類默認無參構造方法");
    }

    public Son(String name){
        System.out.println("子類有參構造方法");
    }

}

反過來 this() 在 super() 之前也是一樣。

而且編譯器有限定 this() 和 super() 這兩個關鍵字都只能出現在構造方法的第一行,將這兩個關鍵字放在一起,總有一個關鍵字在第二行,編譯是不能通過的。

5、小結

好了,這就是Java中對 super 關鍵詞的介紹。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4338

    瀏覽量

    62739
  • 代碼
    +關注

    關注

    30

    文章

    4801

    瀏覽量

    68735
  • 編譯器
    +關注

    關注

    1

    文章

    1636

    瀏覽量

    49172
  • Super
    +關注

    關注

    0

    文章

    14

    瀏覽量

    8427
收藏 人收藏

    評論

    相關推薦

    面向對象時如何調用方法

    請教,創建子類后,如何創建與類同名的方法VI, 并調用方法
    發表于 12-12 14:25

    Python多重繼承使用方法

    語法的含義是創建了一個subClass,讓它同時繼承了Base1和Base2的相關特性,關于繼承還有以下規則需要遵循:1. 繼承只會繼承方法,不能繼承
    發表于 04-19 14:41

    如何使用Python的? 優勢有哪些?

      Python是一種面向對象的高級語言,因此類對于Python非常重要。是一個空間,在該空間中變量(屬性/方法)分別存儲。運算符' . '用于調用的屬性和
    發表于 07-30 18:08

    python的繼承

    ): def __init__(self, name, age, weight, grade):# 調用的實例化方法People.__init__(self, name, age,
    發表于 03-08 16:40

    詳解IO設備管理之父調用子類方法的過程

    驅動層都實現了注冊給方法。這些方法是IO設備模型框架的血肉!2.2.1 先看對象創建流程調用設備驅動層的注冊接口,就實現了創建對象,在
    發表于 10-09 15:18

    探討一下JAVA子類調用構造器函數

    函數,否則的話的無參構造函數可以不寫。有super指定調用
    發表于 10-19 14:51

    構造函數()繼承的方式與實驗

    式繼承:利用構造函數()繼承的方式 : JS是沒有的概念的 , 把JS中的構造函數看做
    發表于 11-24 15:26 ?658次閱讀

    基于代數規格的面向對象蛻變關系構造方法

    針對面向對象軟件級測試中方法序列調用時的Oracle問題,提出了一種基于代數規格的面向對象蛻變關系構造方法,并根據此
    發表于 01-03 16:31 ?0次下載

    C++之繼承中構造和析構學習的總結

    在我們前面學習過中的構造函數,以及析構函數,那么自然而然,在繼承關系中,必然是存在著析構和構造著。一、子類對象的構造1、問題的引出如何初始化
    的頭像 發表于 12-24 16:10 ?998次閱讀

    如何正確區分Java中super函數用法

    Java中super函數有很多方法,在使用的時候我們應該如何正確區分? 2 方法 三種用法: 訪問
    的頭像 發表于 02-21 15:08 ?577次閱讀

    python子類定制及多態調用介紹

    python通過子類繼承超來定制子類的行為。 ## 1.1 重寫方法 (1)如果子類和超有同名方法,根據搜索樹規則,優先
    的頭像 發表于 02-23 14:51 ?642次閱讀

    淺析JVM虛方法表和方法調用

    今天我們來填坑,在之前的一篇文章深挖?向對象編程三?特性 --封裝、繼承、多態中 我們遺留了一個問題:當引用指向子類對象時,JVM是如何知曉調用的是哪個子類的方法
    的頭像 發表于 03-02 09:57 ?922次閱讀
    淺析JVM虛<b class='flag-5'>方法</b>表和<b class='flag-5'>方法</b><b class='flag-5'>調用</b>

    子類中繼承方法

    首先得在中創建一個方法,利用創建的方法的格式void+方法名(){},然后在子類中調用這個
    的頭像 發表于 04-06 14:53 ?1427次閱讀
    子類中繼承<b class='flag-5'>父</b><b class='flag-5'>類</b>的<b class='flag-5'>方法</b>

    java抽象可以有構造函數嗎

    Java抽象是一種不能被實例化的,它可以包含構造方法。在下文中,我將詳細解釋抽象構造
    的頭像 發表于 11-21 10:23 ?954次閱讀

    java子類可以繼承的什么

    Java是一種面向對象的編程語言,它支持繼承的概念。繼承是面向對象編程的三大特性之一,它允許一個(稱為子類或派生)繼承另一個(稱為
    的頭像 發表于 08-20 11:02 ?1309次閱讀
    主站蜘蛛池模板: 黑人巨茎vide抽搐| 99精彩视频在线观看| 竹菊精品久久久久久久99蜜桃 | 九九热这里只有精品视频免费| 国产 日韩 欧美 高清 亚洲| www.绿巨人| 久久婷五月综合色啪首页| 亚洲精品一二三区区别在哪| 港台三级大全| 精品三级久久久久电影网1| 亚洲2023无矿砖码砖区| 国产亚洲精品久久无码98| 奶头被客人吸得又红又肿| 日本夜夜夜| 亚洲精品蜜夜内射| 国产精品亚洲二线在线播放 | 久久女婷五月综合色啪| 伊人青青青| 久久精品视频在线看| 伊人在线视频| 无码中文字幕热热久久| 欧美性爱-第1页| 97伦理97伦理2018最新| 女人十八毛片水真多啊| jazzjazzjazz欧美| 日韩av国产av欧美天堂社区 | 蜜桃成人在线| 99久久爱re热6在线播放| 国产色婷婷精品人妻蜜桃成熟| 麻豆乱码一卡二卡三卡视频| 无码AV免费精品一区二区三区| 国产福利视频第一导航| 午夜一级视频| 俄罗斯12一15处交| 我要色色网| 久久操韩国自偷拍| 99精品电影| 偷上邻居熟睡少妇| 久久99亚洲热最新地址获取| 8050午夜二级一片| 久久4k岛国高清一区二区|