技術(shù)大佬:我去孝冒,你竟然還不會(huì)用 this 關(guān)鍵字

上一篇文章寫的是 Spring Boot 的入門,結(jié)果有讀者留言說(shuō)拟杉,Java 都還沒(méi)搞完庄涡,搞什么 Spring Boot,唬得我一愣一愣的搬设。那這篇就繼續(xù)來(lái)搞 Java穴店,推出廣受好評(píng)的我去系列第四集:你竟然還不會(huì)用 this 關(guān)鍵字。

“老大拿穴,能給說(shuō)詳細(xì)地說(shuō)說(shuō) this 關(guān)鍵字嗎泣洞,總感覺(jué)對(duì)這個(gè)關(guān)鍵字的認(rèn)知不夠全面∧”小王又過(guò)來(lái)找我了球凰,他問(wèn)的態(tài)度很謙遜,很卑微腿宰,但我還是忍不住破口大罵:“我擦呕诉,小王,你丫的竟然不會(huì)用 this吃度,我當(dāng)初是怎么面試你進(jìn)來(lái)的甩挫!”

小王被我這句話嚇壞了,趕緊躲到自己崗位上改 bug 去了规肴。我呢捶闸,加班加點(diǎn)開(kāi)始寫這篇文章,真良心用苦啊拖刃。在 Java 中删壮,this 關(guān)鍵字指的是當(dāng)前對(duì)象(它的方法正在被調(diào)用)的引用,能理解吧兑牡,各位親央碟?不理解的話,我們繼續(xù)往下看。

看完再不明白亿虽,你過(guò)來(lái)捶爆我菱涤,我保證不還手,只要不打臉洛勉。

01粘秆、消除字段歧義

我敢賭一毛錢,所有的讀者收毫,不管男女老少攻走,應(yīng)該都知道這種用法,畢竟寫構(gòu)造方法的時(shí)候經(jīng)常用啊此再。誰(shuí)要不知道昔搂,過(guò)來(lái),我給你發(fā)一毛錢紅包输拇,只要你臉皮夠厚摘符。

public class Writer {
    private int age;
    private String name;

    public Writer(int age, String name) {
        this.age = age;
        this.name = name;
    }
}

Writer 類有兩個(gè)成員變量,分別是 age 和 name策吠,在使用有參構(gòu)造函數(shù)的時(shí)候逛裤,如果參數(shù)名和成員變量的名字相同,就需要使用 this 關(guān)鍵字消除歧義:this.age 是指成員變量奴曙,age 是指構(gòu)造方法的參數(shù)别凹。

02、引用類的其他構(gòu)造方法

當(dāng)一個(gè)類的構(gòu)造方法有多個(gè)洽糟,并且它們之間有交集的話,就可以使用 this 關(guān)鍵字來(lái)調(diào)用不同的構(gòu)造方法堕战,從而減少代碼量坤溃。

比如說(shuō),在無(wú)參構(gòu)造方法中調(diào)用有參構(gòu)造方法:

public class Writer {
    private int age;
    private String name;

    public Writer(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public Writer() {
        this(18, "沉默王二");
    }
}

也可以在有參構(gòu)造方法中調(diào)用無(wú)參構(gòu)造方法:

public class Writer {
    private int age;
    private String name;

    public Writer(int age, String name) {
        this();
        this.age = age;
        this.name = name;
    }

    public Writer() {
    }
}

需要注意的是嘱丢,this() 必須是構(gòu)造方法中的第一條語(yǔ)句薪介,否則就會(huì)報(bào)錯(cuò)。

03越驻、作為參數(shù)傳遞

在下例中汁政,有一個(gè)無(wú)參的構(gòu)造方法,里面調(diào)用了 print() 方法缀旁,參數(shù)只有一個(gè) this 關(guān)鍵字记劈。

public class ThisTest {
    public ThisTest() {
        print(this);
    }

    private void print(ThisTest thisTest) {
        System.out.println("print " +thisTest);
    }

    public static void main(String[] args) {
        ThisTest test = new ThisTest();
        System.out.println("main " + test);
    }
}

來(lái)打印看一下結(jié)果:

print com.cmower.baeldung.this1.ThisTest@573fd745
main com.cmower.baeldung.this1.ThisTest@573fd745

從結(jié)果中可以看得出來(lái),this 就是我們?cè)?main() 方法中使用 new 關(guān)鍵字創(chuàng)建的 ThisTest 對(duì)象并巍。

04目木、鏈?zhǔn)秸{(diào)用

學(xué)過(guò) JavaScript,或者 jQuery 的讀者可能對(duì)鏈?zhǔn)秸{(diào)用比較熟悉懊渡,類似于 a.b().c().d()刽射,仿佛能無(wú)窮無(wú)盡調(diào)用下去军拟。

在 Java 中,對(duì)應(yīng)的專有名詞叫 Builder 模式誓禁,來(lái)看一個(gè)示例懈息。

public class Writer {
    private int age;
    private String name;
    private String bookName;
    
    public Writer(WriterBuilder builder) {
        this.age = builder.age;
        this.name = builder.name;
        this.bookName = builder.bookName;
    }

    public static class WriterBuilder {
        public String bookName;
        private int age;
        private String name;

        public WriterBuilder(int age, String name) {
            this.age = age;
            this.name = name;
        }

        public WriterBuilder writeBook(String bookName) {
            this.bookName = bookName;
            return this;
        }

        public Writer build() {
            return new Writer(this);
        }
    }
}

Writer 類有三個(gè)成員變量,分別是 age摹恰、name 和 bookName漓拾,還有它們仨對(duì)應(yīng)的一個(gè)構(gòu)造方法,參數(shù)是一個(gè)內(nèi)部靜態(tài)類 WriterBuilder戒祠。

內(nèi)部類 WriterBuilder 也有三個(gè)成員變量骇两,和 Writer 類一致,不同的是姜盈,WriterBuilder 類的構(gòu)造方法里面只有 age 和 name 賦值了低千,另外一個(gè)成員變量 bookName 通過(guò)單獨(dú)的方法 writeBook() 來(lái)賦值,注意馏颂,該方法的返回類型是 WriterBuilder示血,最后使用 return 返回了 this 關(guān)鍵字。

最后的 build() 方法用來(lái)創(chuàng)建一個(gè) Writer 對(duì)象救拉,參數(shù)為 this 關(guān)鍵字难审,也就是當(dāng)前的 WriterBuilder 對(duì)象。

這時(shí)候亿絮,創(chuàng)建 Writer 對(duì)象就可以通過(guò)鏈?zhǔn)秸{(diào)用的方式告喊。

Writer writer = new Writer.WriterBuilder(18,"沉默王二")
                .writeBook("《Web全棧開(kāi)發(fā)進(jìn)階之路》")
                .build();

05、在內(nèi)部類中訪問(wèn)外部類對(duì)象

說(shuō)實(shí)話派昧,自從 Java 8 的函數(shù)式編程出現(xiàn)后黔姜,就很少用到 this 在內(nèi)部類中訪問(wèn)外部類對(duì)象了。來(lái)看一個(gè)示例:

public class ThisInnerTest {
    private String name;
    
    class InnerClass {
        public InnerClass() {
            ThisInnerTest thisInnerTest = ThisInnerTest.this;
            String outerName = thisInnerTest.name;
        }
    }
}

在內(nèi)部類 InnerClass 的構(gòu)造方法中蒂萎,通過(guò)外部類.this 可以獲取到外部類對(duì)象秆吵,然后就可以使用外部類的成員變量了,比如說(shuō) name五慈。

06纳寂、關(guān)于 super

本來(lái)想單獨(dú)寫一篇 super 關(guān)鍵字的,但可寫的內(nèi)容不多泻拦。本質(zhì)上毙芜,this 關(guān)鍵字和 super 關(guān)鍵字有蠻多相似之處的,所以聪轿,就放在 this 這篇文章的末尾說(shuō)一說(shuō)吧爷肝。

簡(jiǎn)而言之,super 關(guān)鍵字就是用來(lái)訪問(wèn)父類的。

先來(lái)看父類:

public class SuperBase {
    String message = "父類";

    public SuperBase(String message) {
        this.message = message;
    }

    public SuperBase() {
    }

    public void printMessage() {
        System.out.println(message);
    }
}

再來(lái)看子類:

public class SuperSub extends SuperBase {
    String message = "子類";

    public SuperSub(String message) {
        super(message);
    }

    public SuperSub() {
        super.printMessage();
        printMessage();
    }

    public void getParentMessage() {
        System.out.println(super.message);
    }

    public void printMessage() {
        System.out.println(message);
    }
}

1)super 關(guān)鍵字可用于訪問(wèn)父類的構(gòu)造方法

你看灯抛,子類可以通過(guò) super(message) 來(lái)調(diào)用父類的構(gòu)造方法〗鹕猓現(xiàn)在來(lái)新建一個(gè) SuperSub 對(duì)象,看看輸出結(jié)果是什么:

SuperSub superSub = new SuperSub("子類的message");

new 關(guān)鍵字在調(diào)用構(gòu)造方法創(chuàng)建子類對(duì)象的時(shí)候对嚼,會(huì)通過(guò) super 關(guān)鍵字初始化父類的 message夹抗,所以此此時(shí)父類的 message 會(huì)輸出“子類的message”。

2)super 關(guān)鍵字可以訪問(wèn)父類的變量

上述例子中的 SuperSub 類中就有纵竖,getParentMessage() 通過(guò) super.message 方法父類的同名成員變量 message漠烧。

3)當(dāng)方法發(fā)生重寫時(shí),super 關(guān)鍵字可以訪問(wèn)父類的同名方法

上述例子中的 SuperSub 類中就有靡砌,無(wú)參的構(gòu)造方法 SuperSub() 中就使用 super.printMessage() 調(diào)用了父類的同名方法已脓。

07、總結(jié)

親愛(ài)的讀者朋友通殃,我應(yīng)該說(shuō)得很全面了吧度液?我想小王看到了這篇文章后一定會(huì)感謝我的良苦用心的,他畢竟是個(gè)積極好學(xué)的好同事啊画舌。

如果覺(jué)得文章對(duì)你有點(diǎn)幫助堕担,請(qǐng)微信搜索「 沉默王二 」第一時(shí)間閱讀,回復(fù)「并發(fā)」更有一份阿里大牛重寫的 Java 并發(fā)編程實(shí)戰(zhàn)曲聂,從此再也不用擔(dān)心面試官在這方面的刁難了霹购。

本文已收錄 GitHub,傳送門~ 朋腋,里面更有大廠面試完整考點(diǎn)齐疙,歡迎 Star。

我是沉默王二乍丈,一枚有顏值卻靠才華茍且的程序員剂碴。關(guān)注即可提升學(xué)習(xí)效率,別忘了三連啊轻专,點(diǎn)贊、收藏察蹲、留言请垛,我不挑,嘻嘻洽议。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宗收,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子亚兄,更是在濱河造成了極大的恐慌混稽,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異匈勋,居然都是意外死亡礼旅,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門洽洁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)痘系,“玉大人,你說(shuō)我怎么就攤上這事饿自√洌” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵昭雌,是天一觀的道長(zhǎng)复唤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)烛卧,這世上最難降的妖魔是什么佛纫? 我笑而不...
    開(kāi)封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮唱星,結(jié)果婚禮上雳旅,老公的妹妹穿的比我還像新娘。我一直安慰自己间聊,他們只是感情好攒盈,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著哎榴,像睡著了一般型豁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尚蝌,一...
    開(kāi)封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天迎变,我揣著相機(jī)與錄音,去河邊找鬼飘言。 笑死衣形,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的姿鸿。 我是一名探鬼主播谆吴,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼苛预!你這毒婦竟也來(lái)了句狼?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤热某,失蹤者是張志新(化名)和其女友劉穎腻菇,沒(méi)想到半個(gè)月后胳螟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡筹吐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年糖耸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骏令。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蔬捷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出榔袋,到底是詐尸還是另有隱情周拐,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布凰兑,位于F島的核電站妥粟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏吏够。R本人自食惡果不足惜勾给,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锅知。 院中可真熱鬧播急,春花似錦、人聲如沸售睹。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)昌妹。三九已至捶枢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間飞崖,已是汗流浹背烂叔。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留固歪,地道東北人蒜鸡。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像牢裳,于是被迫代替她去往敵國(guó)和親术瓮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349