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

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

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

前言:

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

1.super 關(guān)鍵字

super 是用來(lái)訪問(wèn)父類(lèi)實(shí)例屬性和方法的。

1.1 super 方法使用

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

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

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

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

/**
 * 子類(lèi)
 */
class Son extends Father {
}

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

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

如下圖所示: 

super 方法注意事項(xiàng):

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

如下代碼所示: 

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

1.2 super 屬性使用

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

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

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

/**
 * 父類(lèi)
 */
class Father {
    // 定義一個(gè) age 屬性
    public int age = 30;

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

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

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

2.this 關(guān)鍵字

this 是用來(lái)訪問(wèn)本類(lèi)實(shí)例屬性和方法的,它會(huì)先從本類(lèi)中找,如果本類(lèi)中找不到則在父類(lèi)中找。

2.1 this 屬性使用

this 最常見(jiàn)的用法是用來(lái)賦值本類(lèi)屬性的,比如常見(jiàn)的 setter 方法,如下代碼所示:

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

實(shí)現(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 對(duì)象中的 name 屬性就為 null 了。

2.2 this 方法使用

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

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

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

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

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

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

2.3 this 訪問(wèn)父類(lèi)方法

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

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

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

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

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

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

3.1 指代的對(duì)象不同

super 指代的是父類(lèi),是用來(lái)訪問(wèn)父類(lèi)的;而 this 指代的是當(dāng)前類(lèi)。

3.2 查找范圍不同

super 只能查找父類(lèi),而 this 會(huì)先從本類(lèi)中找,如果找不到則會(huì)去父類(lèi)中找。

3.3 本類(lèi)屬性賦值不同

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

3.4 this 可用于 synchronized

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

總結(jié)

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

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

相關(guān)文章

  • SMBMS超市訂單管理系統(tǒng)的網(wǎng)站源碼

    SMBMS超市訂單管理系統(tǒng)的網(wǎng)站源碼

    這篇文章主要介紹了SMBMS超市訂單管理系統(tǒng),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • java編譯器和JVM的區(qū)別

    java編譯器和JVM的區(qū)別

    在本篇文章里小編給大家整理的是一篇關(guān)于java編譯器和JVM的區(qū)別的相關(guān)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-12-12
  • Java編程之多線程死鎖與線程間通信簡(jiǎn)單實(shí)現(xiàn)代碼

    Java編程之多線程死鎖與線程間通信簡(jiǎn)單實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java編程之多線程死鎖與線程間通信簡(jiǎn)單實(shí)現(xiàn)代碼,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • spring boot如何加入mail郵件支持

    spring boot如何加入mail郵件支持

    這篇文章主要介紹了spring boot如何加入mail郵件支持,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Spring MVC參數(shù)傳遞中文亂碼解決方法分享

    Spring MVC參數(shù)傳遞中文亂碼解決方法分享

    這篇文章主要介紹了Spring MVC參數(shù)傳遞中文亂碼解決方法分享,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Java類(lèi)的加載時(shí)機(jī)與過(guò)程

    Java類(lèi)的加載時(shí)機(jī)與過(guò)程

    這篇文章主要介紹了Java類(lèi)的加載時(shí)機(jī)與過(guò)程,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-12-12
  • SpringBoot如何整合redis實(shí)現(xiàn)過(guò)期key監(jiān)聽(tīng)事件

    SpringBoot如何整合redis實(shí)現(xiàn)過(guò)期key監(jiān)聽(tīng)事件

    這篇文章主要介紹了SpringBoot如何整合redis實(shí)現(xiàn)過(guò)期key監(jiān)聽(tīng)事件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 教你用JAVA寫(xiě)文本編輯器(三)

    教你用JAVA寫(xiě)文本編輯器(三)

    這篇文章主要給大家介紹了關(guān)于用JAVA寫(xiě)文本編輯器的相關(guān)資料,本文主要實(shí)現(xiàn)的是一個(gè)點(diǎn)擊選擇文本格式的窗口,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11
  • Java并發(fā)之原子性 有序性 可見(jiàn)性及Happen Before原則

    Java并發(fā)之原子性 有序性 可見(jiàn)性及Happen Before原則

    一提到happens-before原則,就讓人有點(diǎn)“丈二和尚摸不著頭腦”。這個(gè)涵蓋了整個(gè)JMM中可見(jiàn)性原則的規(guī)則,究竟如何理解,把我個(gè)人一些理解記錄下來(lái)。下面可以和小編一起學(xué)習(xí)Java 并發(fā)四個(gè)原則
    2021-09-09
  • SpringBoot配置線程池的實(shí)現(xiàn)示例

    SpringBoot配置線程池的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot配置線程池的實(shí)現(xiàn)示例,主要包括在Spring Boot中創(chuàng)建和配置線程池,包括設(shè)置線程池的大小、隊(duì)列容量、線程名稱(chēng)等參數(shù),感興趣的可以了解一下
    2023-09-09

最新評(píng)論