欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaSE面試題之this與super關(guān)鍵字的區(qū)別詳解

 更新時(shí)間:2023年12月07日 11:37:25   作者:小扳  
this關(guān)鍵字用于引用當(dāng)前對(duì)象的引用,super關(guān)鍵字用于引用父類(lèi)對(duì)象的引用,下面這篇文章主要給大家介紹了關(guān)于JavaSE面試題之this與super關(guān)鍵字區(qū)別的相關(guān)資料,需要的朋友可以參考下

1.0 this 與 super 關(guān)鍵字的區(qū)別       

1.1 在Java中,this 關(guān)鍵字有以下作用

一、用于指代當(dāng)前對(duì)象的引用,可以在類(lèi)的方法中使用 this 來(lái)訪問(wèn)當(dāng)前對(duì)象的成員變量和方法。

二、用于區(qū)分局部變量和成員變量,當(dāng)局部變量和成員變量同名時(shí),使用 this 關(guān)鍵字可以明確指定使用成員變量。

代碼如下:

public class Problem2 {
    public static void main(String[] args) {
        C c = new C(2);
        System.out.println(c.getX());
    }
}
class C {
    private int x;
    public C(int x) {
        //此處 this 的引用場(chǎng)景
        this.x = x;
    }
    public int getX(){
        return x;
    }
}

三、用于在構(gòu)造方法中調(diào)用其他構(gòu)造方法,可以使用 this 關(guān)鍵字來(lái)調(diào)用同一個(gè)類(lèi)中的其他構(gòu)造方法。

代碼如下:

public class Problem2 {
    public static void main(String[] args) {
        //使用了無(wú)參構(gòu)造器
        C c = new C();
        System.out.println(c.getX());
    }
}
class C {
    private int x;
    public C(int x) {
        //此處 this 的引用場(chǎng)景
        this.x = x;
    }
    //可以用無(wú)參構(gòu)造器來(lái)直接調(diào)用兄弟構(gòu)造器
    public C() {
        this(2);
    }
    public int getX(){
        return x;
    }
}

1.2 在Java中,super 關(guān)鍵字有以下作用

一、用于訪問(wèn)父類(lèi)的成員變量或方法:在子類(lèi)中,可以使用 super 關(guān)鍵字來(lái)訪問(wèn)父類(lèi)中的成員變量或方法,即使子類(lèi)中有同名的成員變量或方法,也可以通過(guò) super 來(lái)訪問(wèn)父類(lèi)的成員。

簡(jiǎn)單來(lái)說(shuō),假如子類(lèi)與父類(lèi)中沒(méi)用同名的成員變量或者方法,用 this 關(guān)鍵字就可以去訪問(wèn)到父類(lèi)還有子類(lèi)的成員變量或者方法;假如子類(lèi)與父類(lèi)中有同名的成員變量或者方法,訪問(wèn)父類(lèi)的同名的變量或者方法就需要用到 super 關(guān)鍵字了,總的來(lái)說(shuō),用 this 可以訪問(wèn)到父類(lèi)與子類(lèi)的成員變量與方法,如果存在同名就要另談了。super 就能訪問(wèn)到父類(lèi)的成員變量與方法。

代碼如下:

class p {
    public String name = "李四";
    public int age = 10;
}
public class Problem3 extends p {
    //假如子類(lèi)存在與父類(lèi)同名,
    //則我們想去訪問(wèn)父類(lèi)的 name 就需要用到關(guān)鍵字 super 了。
    public String name = "王五";
    public void fun() {
        //根據(jù)就近原則,這就只能訪問(wèn)到當(dāng)前子類(lèi)的 name
        System.out.println(name);

        //用上關(guān)鍵字 super 可以訪問(wèn)到父類(lèi)的 name
        System.out.println(super.name);

        //由于子類(lèi)中沒(méi)有與父類(lèi)中的 age 同名,
        // 所以,可以用 this 關(guān)鍵字,甚至可以不用。
        //目前這三種的效果是一樣的
        System.out.println(age);
        System.out.println(this.age);
        System.out.println(super.age);
    }

    public static void main(String[] args) {
        Problem3 problem3 = new Problem3();
        problem3.fun();
    }
}

運(yùn)行結(jié)果如下:

二、用于調(diào)用父類(lèi)的構(gòu)造方法:在子類(lèi)的構(gòu)造方法中,可以使用 super 關(guān)鍵字來(lái)調(diào)用父類(lèi)的構(gòu)造方法,以初始化父類(lèi)的成員變量或執(zhí)行父類(lèi)的初始化操作。(重點(diǎn))

用子類(lèi)用創(chuàng)建對(duì)象的時(shí)候,先要調(diào)用父類(lèi)的實(shí)例,再執(zhí)行父類(lèi)的構(gòu)造,再到子類(lèi)的實(shí)例,再執(zhí)行子類(lèi)的構(gòu)造器。當(dāng)然如果存在靜態(tài)變量或者方法,必定是先執(zhí)行靜態(tài)的變量或者方法,先父類(lèi)的再到子類(lèi)的。

代碼如下:

public class Problem4 {
    public static void main(String[] args) {
        Son son = new Son(4);
    }
}
class Son extends Father {
    static {
        System.out.println("son::static");
    }
    {
        System.out.println("son::實(shí)例");
    }

    public Son(int age) {
        super(age);
        System.out.println("son::構(gòu)造器");
    }
}
class Father {
    public static String name;
    public int age  = 1;
    static {
        System.out.println("father::static");
    }

    {
        System.out.println("father::實(shí)例");
    }

    public Father(int age) {
        this.age = age;
        System.out.println("father::構(gòu)造器");
    }
}

運(yùn)行結(jié)果如下:

需要注意的是,實(shí)例代碼塊指的是沒(méi)有 static 修飾,必須放在類(lèi)下。與對(duì)象初始化一起加載,即每次調(diào)用構(gòu)造方法都會(huì)執(zhí)行,并且在構(gòu)造方法前執(zhí)行。

實(shí)例指是是什么呢?

實(shí)例指是指在面向?qū)ο缶幊讨?,?lèi)的一個(gè)具體對(duì)象。當(dāng)一個(gè)類(lèi)被實(shí)例化(創(chuàng)建對(duì)象)時(shí),就會(huì)產(chǎn)生一個(gè)該類(lèi)的實(shí)例。這個(gè)實(shí)例擁有類(lèi)定義的屬性和方法,可以在程序中被調(diào)用和操作。實(shí)例化一個(gè)類(lèi)就是創(chuàng)建該類(lèi)的一個(gè)對(duì)象。例如,如果有一個(gè)叫做 Car 的類(lèi),那么當(dāng)創(chuàng)建一個(gè)特定的 Car 對(duì)象時(shí),這個(gè)對(duì)象就是 Car 類(lèi)的一個(gè)實(shí)例。

小結(jié):用子類(lèi)來(lái)創(chuàng)建對(duì)象的時(shí)候,代碼的執(zhí)行順序?yàn)椋盒枰劝迅割?lèi)靜態(tài)成員變量、方法執(zhí)行,再到子類(lèi)的靜態(tài)的成員變量、方法。再執(zhí)行父類(lèi)的實(shí)例(實(shí)例可以簡(jiǎn)單粗暴的理解為賦值),父類(lèi)的構(gòu)造器,最后到子類(lèi)的實(shí)例、子類(lèi)的構(gòu)造器。需要注意的是靜態(tài)成員變量、方法只會(huì)調(diào)用一次。(可以把以上的代碼賦值到編譯器中一步步來(lái)調(diào)試,看看代碼執(zhí)行的順序)

三、用于在子類(lèi)中調(diào)用父類(lèi)的構(gòu)造方法時(shí),super() 必須是子類(lèi)構(gòu)造器中的第一條語(yǔ)句。

代碼如下:

同樣的,this() 也必須是構(gòu)造器器中的第一條語(yǔ)句,因此,this() 與 super() 不能同時(shí)出現(xiàn)。

2.0 經(jīng)典習(xí)題

如下的代碼最終的輸出結(jié)果是什么?

代碼如下:

class X{
    int b = 10;
    int a = 10;
    public X(){//2
        System.out.print("X");
    }
    Y y=new Y();//1
}
class Y{
    public Y(){//3
        System.out.print("Y");
    }
}
public class Z extends X{
    Y y=new Y();//4
    public Z(){//5
        System.out.print("Z");
    }
    public static void main(String[] args) {
        new Z();
    }
}

詳細(xì)對(duì)以上代碼進(jìn)行分析:當(dāng) new Z()  用子類(lèi)對(duì)創(chuàng)建對(duì)象時(shí),先會(huì)執(zhí)行父類(lèi)靜態(tài)的成員變量、方法,到子類(lèi)的靜態(tài)成員變量、方法。當(dāng)然這里沒(méi)有出現(xiàn)相關(guān)的靜態(tài)成員變量、方法。接著到父類(lèi)的實(shí)例為:Y y=new Y();//1 再到父類(lèi)的構(gòu)造方法,最后到子類(lèi)的實(shí)例為:Y y=new Y();//4 再到子類(lèi)的構(gòu)造方法。

總的來(lái)說(shuō),在繼承層次上,先執(zhí)行父類(lèi)和子類(lèi)的靜態(tài)的,再執(zhí)行父類(lèi)的實(shí)例,父類(lèi)的構(gòu)造,最后執(zhí)行子類(lèi)的實(shí)例和子類(lèi)的構(gòu)造。沒(méi)有靜態(tài)的。所以先執(zhí)行1和2,再執(zhí)行4和5。執(zhí)行注釋1和注釋4的時(shí)候,分班打印Y。故最終的結(jié)果是YXYZ。

運(yùn)行結(jié)果為:

總結(jié)

到此這篇關(guān)于JavaSE面試題之this與super關(guān)鍵字區(qū)別詳解的文章就介紹到這了,更多相關(guān)JavaSE this與super關(guān)鍵字區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 新手入門(mén)Jvm-- JVM對(duì)象創(chuàng)建與內(nèi)存分配機(jī)制

    新手入門(mén)Jvm-- JVM對(duì)象創(chuàng)建與內(nèi)存分配機(jī)制

    JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫(xiě),JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),是通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(shí)現(xiàn)的
    2021-06-06
  • logback標(biāo)記日志過(guò)濾器MarkerFilter源碼解讀

    logback標(biāo)記日志過(guò)濾器MarkerFilter源碼解讀

    這篇文章主要為大家介紹了logback標(biāo)記日志過(guò)濾器MarkerFilter源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • javaWeb傳收參數(shù)方式總結(jié)示例分析

    javaWeb傳收參數(shù)方式總結(jié)示例分析

    這篇文章主要為大家介紹了javaWeb傳收參數(shù)方式總結(jié)示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Spring Security在標(biāo)準(zhǔn)登錄表單中添加一個(gè)額外的字段

    Spring Security在標(biāo)準(zhǔn)登錄表單中添加一個(gè)額外的字段

    這篇文章主要介紹了Spring Security在標(biāo)準(zhǔn)登錄表單中添加一個(gè)額外的字段,我們將重點(diǎn)關(guān)注兩種不同的方法,以展示框架的多功能性以及我們可以使用它的靈活方式。 需要的朋友可以參考下
    2019-05-05
  • Java設(shè)計(jì)模式七大原則之開(kāi)閉原則詳解

    Java設(shè)計(jì)模式七大原則之開(kāi)閉原則詳解

    開(kāi)閉原則,又稱為OCP原則,即一個(gè)軟件實(shí)體如類(lèi),模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。本文將詳細(xì)介紹Java設(shè)計(jì)模式七大原則之一的開(kāi)閉原則,需要的可以參考一下
    2022-02-02
  • Java線程取消的三種方式

    Java線程取消的三種方式

    文章介紹了 Java 線程取消的 3 種方式,不推薦使用 stop 方法和 volatile 設(shè)標(biāo)記位停止線程,線程中斷機(jī)制是協(xié)作式的,一個(gè)線程請(qǐng)求中斷,另一線程響應(yīng),線程可檢查自身中斷狀態(tài)或捕獲 InterruptedException 來(lái)合適處理以響應(yīng)中斷,確保安全有序停止,避免資源泄露等問(wèn)題
    2024-12-12
  • 參數(shù)校驗(yàn)Spring的@Valid注解用法解析

    參數(shù)校驗(yàn)Spring的@Valid注解用法解析

    這篇文章主要介紹了參數(shù)校驗(yàn)Spring的@Valid注解用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 解析Java圖形化編程中的文本框和文本區(qū)

    解析Java圖形化編程中的文本框和文本區(qū)

    這篇文章主要介紹了Java圖形化編程中的文本框和文本區(qū),是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • 解決java調(diào)用dll報(bào)Unable to load library錯(cuò)誤的問(wèn)題

    解決java調(diào)用dll報(bào)Unable to load library錯(cuò)誤的問(wèn)題

    這篇文章主要介紹了解決java調(diào)用dll報(bào)Unable to load library錯(cuò)誤的問(wèn)題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • 完美解決SpringCloud-OpenFeign使用okhttp替換不生效問(wèn)題

    完美解決SpringCloud-OpenFeign使用okhttp替換不生效問(wèn)題

    這篇文章主要介紹了完美解決SpringCloud-OpenFeign使用okhttp替換不生效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02

最新評(píng)論