女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

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

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

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

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

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

在創(chuàng)建子類對象的同時,也創(chuàng)建了父類的對象,而創(chuàng)建對象是通過調(diào)用構(gòu)造函數(shù)實現(xiàn)的,那么我們在創(chuàng)建子類對象的時候,應(yīng)該會調(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)建子類的對象:

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

打印結(jié)果:

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

那么問題又來了:是在什么時候調(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ù)有一個空的主體。否則,默認(rèn)構(gòu)造函數(shù)只是簡單地調(diào)用沒有參數(shù)的超類構(gòu)造函數(shù)。

也就是說除了頂級類 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)造方法實際上應(yīng)該是這樣的:

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

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();
    }

}

上面代碼是會報錯的:

圖片
解決辦法就是通過 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 行代碼,同理,多個參數(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
    }

}

這個例子我們在子類中分別調(diào)用了父類的構(gòu)造方法、普通方法以及成員屬性。

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

不能!!!

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

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

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

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() 這兩個關(guān)鍵字都只能出現(xiàn)在構(gòu)造方法的第一行,將這兩個關(guān)鍵字放在一起,總有一個關(guān)鍵字在第二行,編譯是不能通過的。

5、小結(jié)

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

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

    關(guān)注

    3

    文章

    4367

    瀏覽量

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

    關(guān)注

    30

    文章

    4886

    瀏覽量

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

    關(guān)注

    1

    文章

    1654

    瀏覽量

    49844
  • Super
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    8507
收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

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

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

    Python多重繼承使用方法

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

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

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

    python的繼承

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

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

    驅(qū)動層都實現(xiàn)了注冊給方法。這些方法是IO設(shè)備模型框架的血肉!2.2.1 先看對象創(chuàng)建流程調(diào)用設(shè)備驅(qū)動層的注冊接口,就實現(xiàn)了創(chuàng)建對象,在
    發(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ù)()繼承的方式與實驗

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

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

    針對面向?qū)ο筌浖?b class='flag-5'>類級測試中方法序列調(diào)用時的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)造著。一、子類對象的構(gòu)造1、問題的引出如何初始化
    的頭像 發(fā)表于 12-24 16:10 ?1132次閱讀

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

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

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

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

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

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

    子類中繼承方法

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

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

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

    java子類可以繼承的什么

    Java是一種面向?qū)ο蟮木幊陶Z言,它支持繼承的概念。繼承是面向?qū)ο缶幊痰娜筇匦灾唬试S一個(稱為子類或派生)繼承另一個(稱為
    的頭像 發(fā)表于 08-20 11:02 ?2008次閱讀