衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

super調(diào)用父類的構(gòu)造方法

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

我們分析這句話“父類對(duì)象的引用”,那說明我們使用的時(shí)候只能在子類中使用,既然是對(duì)象的引用,那么我們也可以用來調(diào)用成員屬性以及成員方法,當(dāng)然了,這里的 super 關(guān)鍵字還能夠調(diào)用父類的構(gòu)造方法。具體有如下幾種用法:

1、調(diào)用父類的構(gòu)造方法

Java中的繼承大家都應(yīng)該了解,子類繼承父類,我們是能夠用子類的對(duì)象調(diào)用父類的屬性和方法的,我們知道屬性和方法只能夠通過對(duì)象調(diào)用,那么我們可以大膽假設(shè)一下:

在創(chuàng)建子類對(duì)象的同時(shí),也創(chuàng)建了父類的對(duì)象,而創(chuàng)建對(duì)象是通過調(diào)用構(gòu)造函數(shù)實(shí)現(xiàn)的,那么我們?cè)趧?chuàng)建子類對(duì)象的時(shí)候,應(yīng)該會(huì)調(diào)用父類的構(gòu)造方法。

下面我們看這段代碼:

public class Parent {

    public Parent(){
        System.out.println("父類默認(rèn)無參構(gòu)造方法");
    }
}


public class Son extends Parent {

    public Son(){
        System.out.println("子類默認(rèn)無參構(gòu)造方法");
    }
}

下面我們創(chuàng)建子類的對(duì)象:

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

打印結(jié)果:

圖片
通過打印結(jié)果看到我們?cè)趧?chuàng)建子類對(duì)象的時(shí)候,首先調(diào)用了父類的構(gòu)造方法,接著調(diào)用子類的構(gòu)造方法,也就是說在創(chuàng)建子類對(duì)象的時(shí)候,首先創(chuàng)建了父類對(duì)象,與前面我們猜想的一致。

那么問題又來了:是在什么時(shí)候調(diào)用的父類構(gòu)造方法呢?

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

圖片
紅色框內(nèi)的英文翻譯為:如果聲明的類是原始類Object,那么默認(rèn)的構(gòu)造函數(shù)有一個(gè)空的主體。否則,默認(rèn)構(gòu)造函數(shù)只是簡單地調(diào)用沒有參數(shù)的超類構(gòu)造函數(shù)。

也就是說除了頂級(jí)類 Object.class 構(gòu)造函數(shù)沒有調(diào)用父類的構(gòu)造方法,其余的所有類都默認(rèn)在構(gòu)造函數(shù)中調(diào)用了父類的構(gòu)造函數(shù)(沒有顯式聲明父類的子類其父類是 Object)。

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

圖片
上面的意思大概就是超類構(gòu)造函數(shù)通過 super 關(guān)鍵字調(diào)用,并且是以 super 關(guān)鍵字開頭。

所以上面的 Son 類的構(gòu)造方法實(shí)際上應(yīng)該是這樣的:

圖片
①、子類默認(rèn)是通過 super() 調(diào)用父類的無參構(gòu)造方法,如果父類顯示聲明了一個(gè)有參構(gòu)造方法,而沒有聲明無參構(gòu)造方法,實(shí)例化子類是會(huì)報(bào)錯(cuò)的。

public class Parent {

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

public class Son extends Parent {

    public Son(){
        System.out.println("子類默認(rèn)無參構(gòu)造方法");
    }

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

}

上面代碼是會(huì)報(bào)錯(cuò)的:

圖片
解決辦法就是通過 super 關(guān)鍵字調(diào)用父類的有參構(gòu)造方法:

public class Son extends Parent {

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

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

}

注意看第 4 行代碼,同理,多個(gè)參數(shù)也是這種調(diào)法。

2、調(diào)用父類的成員屬性

public class Parent {
    public String name;

    public Parent(){
        System.out.println("父類默認(rèn)無參構(gòu)造方法");
    }
}

public class Son extends Parent {

    public Son(){
        System.out.println("子類默認(rèn)無參構(gòu)造方法");
    }

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

}

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

3、調(diào)用父類的方法

public class Parent {
    public String name;

    public Parent(){
        System.out.println("父類默認(rèn)無參構(gòu)造方法");
    }

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

public class Son extends Parent {

    public Son(){
        super();//1、調(diào)用父類構(gòu)造函數(shù)
        System.out.println("子類默認(rèn)無參構(gòu)造方法");
    }

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

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

}

這個(gè)例子我們?cè)谧宇愔蟹謩e調(diào)用了父類的構(gòu)造方法、普通方法以及成員屬性。

4、this 和 super 出現(xiàn)在同一個(gè)構(gòu)造方法中?

不能?。?!

在上一篇博客對(duì) this 關(guān)鍵字 的介紹中,我們知道能夠通過 this 關(guān)鍵字調(diào)用自己的構(gòu)造方法。而本篇博客介紹 super 關(guān)鍵字,我們知道了能夠通過 super 調(diào)用父類的構(gòu)造方法,那么這兩個(gè)關(guān)鍵字能同時(shí)出現(xiàn)在子類的構(gòu)造方法中嗎?

①、假設(shè) super() 在 this() 關(guān)鍵字的前面

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

public class Parent {
    public String name;

    public Parent(){
        System.out.println("父類默認(rèn)無參構(gòu)造方法");
    }

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

}

public class Son extends Parent {

    public Son(){
        super();//1、調(diào)用父類構(gòu)造函數(shù)
        this("Tom");//2、調(diào)用子類構(gòu)造方法
        System.out.println("子類默認(rèn)無參構(gòu)造方法");
    }

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

}

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

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

5、小結(jié)

好了,這就是Java中對(duì) super 關(guān)鍵詞的介紹。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4346

    瀏覽量

    62972
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4827

    瀏覽量

    69052
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1642

    瀏覽量

    49286
  • Super
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    8443
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    面向?qū)ο髸r(shí)如何調(diào)用方法

    請(qǐng)教,創(chuàng)建子類后,如何創(chuàng)建與類同名的方法VI, 并調(diào)用方法
    發(fā)表于 12-12 14:25

    Python多重繼承使用方法

    語法的含義是創(chuàng)建了一個(gè)subClass,讓它同時(shí)繼承了Base1和Base2的相關(guān)特性,關(guān)于繼承還有以下規(guī)則需要遵循:1. 繼承只會(huì)繼承方法,不能繼承
    發(fā)表于 04-19 14:41

    如何使用Python的? 優(yōu)勢(shì)有哪些?

      Python是一種面向?qū)ο蟮母呒?jí)語言,因此類對(duì)于Python非常重要。是一個(gè)空間,在該空間中變量(屬性/方法)分別存儲(chǔ)。運(yùn)算符' . '用于調(diào)用的屬性和
    發(fā)表于 07-30 18:08

    python的繼承

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

    詳解IO設(shè)備管理之父調(diào)用子類方法的過程

    驅(qū)動(dòng)層都實(shí)現(xiàn)了注冊(cè)給方法。這些方法是IO設(shè)備模型框架的血肉!2.2.1 先看對(duì)象創(chuàng)建流程調(diào)用設(shè)備驅(qū)動(dòng)層的注冊(cè)接口,就實(shí)現(xiàn)了創(chuàng)建對(duì)象,在
    發(fā)表于 10-09 15:18

    探討一下JAVA子類調(diào)用構(gòu)造器函數(shù)

    函數(shù),否則的話的無參構(gòu)造函數(shù)可以不寫。有super指定調(diào)用
    發(fā)表于 10-19 14:51

    構(gòu)造函數(shù)()繼承的方式與實(shí)驗(yàn)

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

    基于代數(shù)規(guī)格的面向?qū)ο笸懽冴P(guān)系構(gòu)造方法

    針對(duì)面向?qū)ο筌浖?b class='flag-5'>類級(jí)測(cè)試中方法序列調(diào)用時(shí)的Oracle問題,提出了一種基于代數(shù)規(guī)格的面向?qū)ο笸懽冴P(guān)系構(gòu)造方法,并根據(jù)此
    發(fā)表于 01-03 16:31 ?0次下載

    C++之繼承中構(gòu)造和析構(gòu)學(xué)習(xí)的總結(jié)

    在我們前面學(xué)習(xí)過中的構(gòu)造函數(shù),以及析構(gòu)函數(shù),那么自然而然,在繼承關(guān)系中,必然是存在著析構(gòu)和構(gòu)造著。一、子類對(duì)象的構(gòu)造1、問題的引出如何初始化
    的頭像 發(fā)表于 12-24 16:10 ?1020次閱讀

    如何正確區(qū)分Java中super函數(shù)用法

    Java中super函數(shù)有很多方法,在使用的時(shí)候我們應(yīng)該如何正確區(qū)分? 2 方法 三種用法: 訪問
    的頭像 發(fā)表于 02-21 15:08 ?604次閱讀

    python子類定制及多態(tài)調(diào)用介紹

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

    淺析JVM虛方法表和方法調(diào)用

    今天我們來填坑,在之前的一篇文章深挖?向?qū)ο缶幊倘?特性 --封裝、繼承、多態(tài)中 我們遺留了一個(gè)問題:當(dāng)引用指向子類對(duì)象時(shí),JVM是如何知曉調(diào)用的是哪個(gè)子類的方法?
    的頭像 發(fā)表于 03-02 09:57 ?949次閱讀
    淺析JVM虛<b class='flag-5'>方法</b>表和<b class='flag-5'>方法</b><b class='flag-5'>調(diào)用</b>

    子類中繼承方法

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

    java抽象可以有構(gòu)造函數(shù)嗎

    Java抽象是一種不能被實(shí)例化的,它可以包含構(gòu)造方法。在下文中,我將詳細(xì)解釋抽象構(gòu)造
    的頭像 發(fā)表于 11-21 10:23 ?1011次閱讀

    java子類可以繼承的什么

    Java是一種面向?qū)ο蟮木幊陶Z言,它支持繼承的概念。繼承是面向?qū)ο缶幊痰娜筇匦灾唬试S一個(gè)(稱為子類或派生)繼承另一個(gè)(稱為
    的頭像 發(fā)表于 08-20 11:02 ?1421次閱讀
    劳力士百家乐官网的玩法技巧和规则 | 百家乐官网系列抢庄龙| 大发888真钱娱乐下载| 百家乐官网的各种打法| 鄂托克前旗| 威尼斯人娱乐场66| 百家乐论坛白菜| 百家乐官网代理每周返佣| 大发888迅雷下载免费| 现金百家乐信誉| 盐城百家乐官网的玩法技巧和规则 | 百家乐官网网上赌博| 大发888扑克官方下载| 线上百家乐网站| 澳门百家乐官网论| 最好的百家乐官网博彩网站| 杂多县| 大发888娱乐网| 百家乐任你博娱乐网| 属猪属蛇做生意怎么样| 百家乐官网赌场走势图| 百家乐官网对打反水| 大发888送体验金| 大家旺百家乐的玩法技巧和规则| 百家乐投注翻倍方法| 百家乐官网娱乐网备用网址| 太阳城百家乐官网网上| 金尊国际娱乐| 百家乐网上赌场| 百家乐龙虎斗| 百家乐娱乐城地址| 累积式百家乐官网的玩法技巧和规则 | 百家乐77s| 百家乐百胜注码法| 百家乐官网倍投软件| 百家乐官网必知技巧| 百家乐官网视频麻将游戏| 千亿娱乐网站| 大发888娱乐场游戏| 德州百家乐扑克桌| 百家乐记算|