最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中this和super的區(qū)別及this能否調(diào)用到父類使用

 更新時間:2022年05月20日 08:50:37   作者:??Java中文社群????  
這篇文章主要介紹了Java中this和super的區(qū)別及this能否調(diào)用到父類使用,this和super都是Java中常見的關(guān)鍵字,下文關(guān)于兩者區(qū)別介紹,需要的小伙伴可以參考一下

前言:

this 和 super 都是 Java 中常見的關(guān)鍵字,雖然二者在很多情況下都可以被省略,但它們在 Java 中所起的作用是不可磨滅的。它們都是用來起指代作用的,每個類在實例化的時候之所以能調(diào)用到 Object 類(Object 類是所有類的父類),全是二者的“功勞”。

1.super 關(guān)鍵字

super 是用來訪問父類實例屬性和方法的。

1.1 super 方法使用

每個實例類如果沒有顯示的指定構(gòu)造方法,那么它會生成一個隱藏的無參構(gòu)造方法。對于 super() 方法也是類似,如果沒有顯示指定 super() 方法,那么子類會生成一個隱藏的 super() 方法,用來調(diào)用父類的無參構(gòu)造方法,這就是咱們開篇所說的“每個類在實例化的時候之所以能調(diào)用到 Object 類,就是默認(rèn) super 方法起作用了”,接下來我們通過實例來驗證一下這個說法。

PS:所謂的“顯示”,是指在程序中主動的調(diào)用,也就是在程序中添加相應(yīng)的執(zhí)行代碼。

public class SuperExample {
    // 測試方法
    public static void main(String[] args) {
        Son son = new Son();
    }
}

/**
 * 父類
 */
class Father {
    public Father() {
        System.out.println("執(zhí)行父類的構(gòu)造方法");
    }
}

/**
 * 子類
 */
class Son extends Father {
}

在以上代碼中,子類 Son 并沒有顯示指定 super() 方法,我們運行以上程序,執(zhí)行的結(jié)果如下: 

 從上述的打印結(jié)果可以看出,子類 Son 在沒有顯示指定 super() 方法的情況下,竟然調(diào)用了父類的無參構(gòu)造方法,這樣從側(cè)面驗證了,如果子類沒有顯示指定 super() 方法,那么它也會生成一個隱藏的 super() 方法。這一點我們也可以從此類生成的字節(jié)碼文件中得到證實,

如下圖所示: 

super 方法注意事項:

如果顯示使用 super() 方法,那么 super() 方法必須放在構(gòu)造方法的首行,否則編譯器會報錯,

如下代碼所示: 

 如上圖看到的那樣,如果 super() 方法沒有放在首行,那么編譯器就會報錯:提示 super() 方法必須放到構(gòu)造方法的首行。 為什么要把 super() 方法放在首行呢? 這是因為,只要將 super() 方法放在首行,那么在實例化子類時才能確保父類已經(jīng)被先初始化了。

1.2 super 屬性使用

使用 super 還可以調(diào)用父類的屬性,比如以下代碼可以通過子類 Son 調(diào)用父類中的 age 屬性,

實現(xiàn)代碼如下:

public class SuperExample {
    // 測試方法
    public static void main(String[] args) {
        Son son = new Son();
    }
}

/**
 * 父類
 */
class Father {
    // 定義一個 age 屬性
    public int age = 30;

    public Father() {
        super();
        System.out.println("執(zhí)行父類的構(gòu)造方法");
    }
}

/**
 * 子類
 */
class Son extends Father {
    public Son() {
        System.out.println("父類 age:" + super.age);
    }
}

以上程序的執(zhí)行結(jié)果如下圖所示,在子類中成功地獲取到了父類中的 age 屬性: 

2.this 關(guān)鍵字

this 是用來訪問本類實例屬性和方法的,它會先從本類中找,如果本類中找不到則在父類中找。

2.1 this 屬性使用

this 最常見的用法是用來賦值本類屬性的,比如常見的 setter 方法,如下代碼所示:

 上述代碼中 this.name 表示 Person 類的 name 屬性,此處的 this 關(guān)鍵字不能省略,如果省略就相當(dāng)于給當(dāng)前的局部變量 name 賦值 name,自己給自己賦值了。我們可以嘗試一下,將 this 關(guān)鍵字取消掉,

實現(xiàn)代碼如下:

class Person {
    private String name;
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}
public class ThisExample {
    public static void main(String[] args) {
        Person p = new Person();
        p.setName("磊哥");
        System.out.println(p.getName());
    }
}

以上程序的執(zhí)行結(jié)果如下圖所示:

 從上述結(jié)果可以看出,將 this 關(guān)鍵字去掉之后,賦值失敗,Person 對象中的 name 屬性就為 null 了。

2.2 this 方法使用

我們可以使用 this() 方法來調(diào)用本類中的構(gòu)造方法,具體實現(xiàn)代碼如下:

public class ThisExample {
    // 測試方法
    public static void main(String[] args) {
        Son p = new Son("Java");
    }
}
/**
 * 父類
 */
class Father {
    public Father() {
        System.out.println("執(zhí)行父類的構(gòu)造方法");
    }
}

/**
 * 子類
 */
class Son extends Father {
    public Son() {
        System.out.println("子類中的無參構(gòu)造方法");
    }
    public Son(String name) {
        // 使用 this 調(diào)用本類中無參的構(gòu)造方法
        this();
        System.out.println("子類有參構(gòu)造方法,name:" + name);
    }
}

以上程序的執(zhí)行結(jié)果如下圖所示: 

 從上述結(jié)果中可以看出,通過 this() 方法成功調(diào)用到了本類中的無參構(gòu)造方法。

注意:this() 方法和 super() 方法的使用規(guī)則一樣,如果顯示的調(diào)用,只能放在方法的首行。

2.3 this 訪問父類方法

接下來,我們嘗試使用 this 訪問父類方法,具體實現(xiàn)代碼如下:

public class ThisExample {
    public static void main(String[] args) {
        Son son = new Son();
        son.sm();
    }
}
/**
 * 父類
 */
class Father {
    public void fm() {
        System.out.println("調(diào)用了父類中的 fm() 方法");
    }
}

/**
 * 子類
 */
class Son extends Father {
    public void sm() {
        System.out.println("調(diào)用子類的 sm() 方法訪問父類方法");
        // 調(diào)用父類中的方法
        this.fm();
    }
}

以上程序的執(zhí)行結(jié)果如下: 

 從上述結(jié)果可以看出,使用 this 是可以訪問到父類中的方法的,this 會先從本類中找,如果找不到則會去父類中找。

3.this 和 super 的區(qū)別

3.1 指代的對象不同

super 指代的是父類,是用來訪問父類的;而 this 指代的是當(dāng)前類。

3.2 查找范圍不同

super 只能查找父類,而 this 會先從本類中找,如果找不到則會去父類中找。

3.3 本類屬性賦值不同

this 可以用來為本類的實例屬性賦值,而 super 則不能實現(xiàn)此功能。

3.4 this 可用于 synchronized

因為 this 表示當(dāng)前對象,所以this 可用于 synchronized(this){....} 加鎖,而 super 則不能實現(xiàn)此功能。

總結(jié)

this 和 super 都是 Java 中的關(guān)鍵字,都起指代作用,當(dāng)顯示使用它們時,都需要將它們放在方法的首行(否則編譯器會報錯)。this 表示當(dāng)前對象,super 用來指代父類對象,它們有四點不同:指代對象、查找訪問、本類屬性賦值和 synchronized 的使用不同。

到此這篇關(guān)于Java中this和super的區(qū)別及this能否調(diào)用到父類使用的文章就介紹到這了,更多相關(guān)this和super 區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android 屏幕分辨率的整理

    Android 屏幕分辨率的整理

    這篇文章主要介紹了Android 屏幕分辨率的整理的相關(guān)資料,這里整理了常見的分辨率希望能幫助到大家,需要的朋友可以參考下
    2017-08-08
  • Lambda表達式下訪問外部變量問題

    Lambda表達式下訪問外部變量問題

    這篇文章主要介紹了Lambda表達式下訪問外部變量問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Spring Security 自定義資源服務(wù)器實踐過程

    Spring Security 自定義資源服務(wù)器實踐過程

    這篇文章主要介紹了Spring Security 自定義資源服務(wù)器實踐,我們通過自己搭建的授權(quán)服務(wù)器和資源服務(wù)器,完整體驗了OAuth2流程,需要的朋友可以參考下
    2022-08-08
  • java單例模式使用詳解

    java單例模式使用詳解

    這篇文章主要介紹了java單例模式使用方法,通常它的實現(xiàn)方式分為懶漢式實現(xiàn)和餓漢式,下面是詳細說明加示例,需要的朋友可以參考下
    2014-04-04
  • 淺談java中replace()和replaceAll()的區(qū)別

    淺談java中replace()和replaceAll()的區(qū)別

    這篇文章主要介紹了java中replace()和replaceAll()的區(qū)別,兩者都是常用的替換字符的方法,感興趣的小伙伴們可以參考一下
    2015-11-11
  • hibernate查詢緩存詳細分析

    hibernate查詢緩存詳細分析

    這篇文章主要介紹了hibernate查詢緩存詳細分析,包括查詢緩存配置方法及關(guān)閉二級緩存的詳細介紹,需要的朋友參考下本文吧
    2017-09-09
  • 從零開始搭建springboot+springcloud+mybatis本地項目全過程(圖解)

    從零開始搭建springboot+springcloud+mybatis本地項目全過程(圖解)

    這篇文章主要介紹了從零開始搭建springboot+springcloud+mybatis本地項目全過程(圖解),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • SpringBoot項目加入沖突動態(tài)監(jiān)測算法的實現(xiàn)

    SpringBoot項目加入沖突動態(tài)監(jiān)測算法的實現(xiàn)

    沖突動態(tài)監(jiān)測算法是一種網(wǎng)絡(luò)通信中的沖突檢測方法,適用于無線網(wǎng)絡(luò)或其他共享傳輸介質(zhì)的環(huán)境,本文主要介紹了SpringBoot項目加入沖突動態(tài)監(jiān)測算法的實現(xiàn),感興趣的可以了解一下
    2023-09-09
  • Java使用自動化部署工具Gradle中的任務(wù)設(shè)定教程

    Java使用自動化部署工具Gradle中的任務(wù)設(shè)定教程

    Grandle使用同樣運行于JVM上的Groovy語言編寫,本文會對此進行初步夠用的講解,接下來我們就一起來看一下Java使用自動化部署工具Gradle中的任務(wù)設(shè)定教程:
    2016-06-06
  • Java日期時間處理問題(從Date、Calendar到SimpleDateFormat)

    Java日期時間處理問題(從Date、Calendar到SimpleDateFormat)

    這篇文章主要介紹了Java日期時間處理深度解析(從Date、Calendar到SimpleDateFormat),我們詳細討論了Java中的日期和時間處理,包括Date、Calendar和SimpleDateFormat類的使用,以及Java?8引入的新的日期時間API的優(yōu)勢,需要的朋友可以參考下
    2024-08-08

最新評論

嫩江县| 靖江市| 广灵县| 荆门市| 仁怀市| 蒲城县| 贡嘎县| 青河县| 佛学| 墨脱县| 改则县| 安阳市| 余江县| 绵竹市| 崇义县| 吴桥县| 宜君县| 象山县| 乌鲁木齐县| 黄大仙区| 清水县| 石屏县| 应用必备| 桑日县| 芜湖县| 临泽县| 万载县| 定结县| 扎鲁特旗| 镇雄县| 东乌珠穆沁旗| 金沙县| 永川市| 永定县| 康马县| 闸北区| 和平县| 上杭县| 神木县| 灵川县| 石阡县|