亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java基礎之super關鍵字淺析

 更新時間:2022年04月12日 11:24:13   作者:打死不寫博客-真香  
java中的super關鍵字是一個引用變量,用于引用直接父類對象,下面這篇文章主要給大家介紹了關于Java基礎之super關鍵字的相關資料,需要的朋友可以參考下

本文重點介紹super關鍵字,在Java中的作用以及用法。

一、定義

它是一個指代變量,用于在子類中指代父類對象。

二、應用

2.1    應用范圍

只能用于子類的構造函數(shù)和實例方法中,不能用于子類的類(靜態(tài))方法中。原因是super指代的是一個父類的對象,它需要在運行時被創(chuàng)建,而靜態(tài)方法是類方法,它是類的一部分。當類被加載時,方法已經存在,但是這時候父類對象還沒有被初始化。

2.2    用法

在Java中super有兩種使用場景。

2.2.1    在子類中調用父類的屬性或方法

在子類中調用父類的屬性或方法。特別是子類中有與父類相同的屬性或者方法,那么這時如果你想調用父類的屬性或者方法,那么你必須使用super關鍵字。因為子類中和父類中的屬性或方法同名,則父類中的方法或屬性將被覆蓋或隱藏。super可以指代父類中的類屬性和類方法,但是并不建議這么用,雖然不會報錯,但是說明你對static關鍵字還不夠了解。請認真查看并理解static關鍵字。

public class Parent {
    public String name = "小頭爸爸";
    public boolean hasMoney = false;
 
    public void sleeping(){
        System.out.println("爸爸已經睡了");
    }
 
    public void working(){
        System.out.println("爸爸正在工作。。。");
    }
}
 
public class Child extends Parent {
 
    public String name = "大頭兒子";
 
    /**
     * 當子類和父類有屬性重名時,需要super才能調用到父類的屬性,
     * 直接調用會調用到子類的屬性
     * 如果不重名,可直接調用且調用的是父類的屬性
     */
    private void testParam(){
        System.out.println("爸爸的名字叫" + super.name);
        System.out.println("孩子的名字是" + name);
        System.out.println("爸爸是否有有錢:" + hasMoney);
    }
 
    /**
     * 方法和上面的屬性結果一樣
     */
    public void testMethod(){
        sleeping();
        super.sleeping();
        super.working();
    }
 
    public void sleeping(){
        System.out.println("兒子已經睡了");
    }
 
    public static void main(String[] args) {
        Child child = new Child();
        child.testParam();
        child.testMethod();
    }
}

測試結果:

=============

爸爸的名字叫小頭爸爸
孩子的名字是大頭兒子
爸爸是否有有錢:false
兒子已經睡了
爸爸已經睡了

爸爸正在工作。。。

============

2.2.2    在子類中指代父類構造器

在Java中,子類是父類的派生類,它的實例化依賴于父類的實例化。所以它的任何一個構造函數(shù)都必須要初始化父類,Java就是super關鍵字調用父類構造方法,來完成這個操作。

有人會奇怪,那為什么在2.1.1的例子,父類沒有構造方法,子類也沒有構造方法,難道在某些情況下,實例的初始化并不依賴于構造函數(shù)?

答案是,實例的初始化必須要構造函數(shù)。2.2.1沒有構造函數(shù)的原因是,在Java類定義中,如果開發(fā)者沒有顯示的定義構造函數(shù),那么Java會隱式的為該類定義一個無參構造函數(shù)。但是如果開發(fā)者自己定一個構造函數(shù)(無論有參還是無參),那么Java就不會再為該類隱式的定義一個無參構造函數(shù)了。

那么還原構造函數(shù)后的代碼:

public class Parent {
    ...
    public Parent() {
    }
    ...
}
 
public class Child extends Parent {
    ...
    public Child() {
    }
    ...
}

那么又有人有奇怪了,你不是說子類的實例化依賴于父類的實例化,那么在子類的構造函數(shù)中應該需要調用super來初始化父類不是嗎?

是的,在我們子類的構造函數(shù)中,如果我們沒有顯式調用super來初始化父類的話,那么Java會隱式的調用super();來調用父類無參構造函數(shù)并把它放在構造函數(shù)的第一行。記住哦,Java只會隱式的調用無參構造函數(shù),如果父類沒有無參構造函數(shù),那么子類中就必須顯示的調用super關鍵字來調用已有的有參構造函數(shù)來初始化父類。

public class Parent {
    public String name = "小頭爸爸";
    public Parent(int age) {
    }
 
    public void sleeping(){
        System.out.println("爸爸已經睡了");
    }
}
 
public class Child extends Parent {
    public String name = "大頭兒子";
    public Child() {//如果沒有super來初始化父類,同樣也會報錯
//        super();//編譯期報錯,因為父類并沒有無參構造函數(shù)
        super(15);//正確打開方式
    }
 
    private void printParentName(){
        System.out.println("爸爸的名字叫" + super.name);
    }
 
    private void parentStatus(){
        super.sleeping();
    }
}

子類中的super為什么必須要放在第一行?因為子類的實例化依賴于父類的實例化,在構建子類時,必須要有父類實例,只能有了父類的實例,子類才能夠初始化自己。就好像人類世界里,都是要先有父親,再有孩子一樣。

附:super實際使用示例

下面來看看super關鍵字的實際用法。 在這里,Emp類繼承了Person類,所以Person的所有屬性都將默認繼承到Emp。 要初始化所有的屬性,可使用子類的父類構造函數(shù)。 這樣,我們重用了父類的構造函數(shù)。

class Person {
? ? int id;
? ? String name;

? ? Person(int id, String name) {
? ? ? ? this.id = id;
? ? ? ? this.name = name;
? ? }
}

class Emp extends Person {
? ? float salary;

? ? Emp(int id, String name, float salary) {
? ? ? ? super(id, name);// reusing parent constructor
? ? ? ? this.salary = salary;
? ? }

? ? void display() {
? ? ? ? System.out.println(id + " " + name + " " + salary);
? ? }
}

class TestSuper5 {
? ? public static void main(String[] args) {
? ? ? ? Emp e1 = new Emp(1, "ankit", 45000f);
? ? ? ? e1.display();
? ? }
}

結果如下:

1 ankit 45000

總結

super關鍵字指代父類對象,主要用于在子類中指定父類的方法和屬性,也用于在子類中初始化父類。子類的靜態(tài)方法中不能使用super關鍵字。

到此這篇關于Java基礎之super關鍵字的文章就介紹到這了,更多相關Java super關鍵字內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 基于Spring Boot使用JpaRepository刪除數(shù)據時的注意事項

    基于Spring Boot使用JpaRepository刪除數(shù)據時的注意事項

    這篇文章主要介紹了Spring Boot使用JpaRepository刪除數(shù)據時的注意事項,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java中常用的設計模式之單例模式詳解

    Java中常用的設計模式之單例模式詳解

    這篇文章主要為大家詳細介紹了Java中常用的設計模式之單例模式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 在java8中使用流區(qū)分質數(shù)與非質數(shù)詳解

    在java8中使用流區(qū)分質數(shù)與非質數(shù)詳解

    這篇文章主要介紹了在java8中使用流區(qū)分質數(shù)與非質數(shù)詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 詳解Java中ByteArray字節(jié)數(shù)組的輸入輸出流的用法

    詳解Java中ByteArray字節(jié)數(shù)組的輸入輸出流的用法

    ByteArrayInputStream和ByteArrayOutputStream分別集成自InputStream和OutputStream這兩個輸入和輸出流,這里我們就來詳解Java中ByteArray字節(jié)數(shù)組的輸入輸出流的用法,需要的朋友可以參考下
    2016-06-06
  • 解決SpringMVC 返回Java8 時間JSON數(shù)據的格式化問題處理

    解決SpringMVC 返回Java8 時間JSON數(shù)據的格式化問題處理

    本篇文章主要介紹了解決SpringMVC 返回Java8 時間JSON數(shù)據的格式化問題處理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • Java利用 Exchanger 實現(xiàn)游戲中交換裝備

    Java利用 Exchanger 實現(xiàn)游戲中交換裝備

    JDK 1.5 開始 JUC 包下提供的 Exchanger 類可用于兩個線程之間交換信息。下面我們就來看看Java是如何利用Exchanger一行代碼實現(xiàn)游戲中交換裝備的
    2021-09-09
  • Java面向對象之什么是異常

    Java面向對象之什么是異常

    Java 把異常當作對象來處理,并定義一個基類,java.lang.Throwable 作為所有異常的超類。今天通過本文給大家分享Java面向對象之什么是異常,感興趣的朋友一起看看吧
    2021-07-07
  • 一文帶你深入了解Java?TreeMap

    一文帶你深入了解Java?TreeMap

    TreeMap是Map家族中的一員,也是用來存放key-value鍵值對的。平時在工作中使用的可能并不多。本文將基于jdk8對其做一個講解,感興趣的可以了解一下
    2022-09-09
  • Spring JPA 錯題集解決案例

    Spring JPA 錯題集解決案例

    這篇文章主要為大家介紹了Spring JPA 錯題集解決案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • IntelliJ?IDEA如何集成maven

    IntelliJ?IDEA如何集成maven

    這篇文章主要介紹了IntelliJ?IDEA如何集成maven問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評論