上一篇文章寫的是 Spring Boot 的入門,結果有讀者留言說,Java 都還沒搞完,搞什么 Spring Boot,唬得我一愣一愣的,那這篇就繼續來搞 Java,推出廣受好評的我去系列第四集:你竟然還不會用 this 關鍵字,
“老大,能給說詳細地說說 this 關鍵字嗎,總感覺對這個關鍵字的認知不夠全面,”小王又過來找我了,他問的態度很謙遜,很卑微,但我還是忍不住破口大罵:“我擦,小王,你丫的竟然不會用 this,我當初是怎么面試你進來的!”

小王被我這句話嚇壞了,趕緊躲到自己崗位上改 bug 去了,我呢,加班加點開始寫這篇文章,真良心用苦啊,在 Java 中,this 關鍵字指的是當前物件(它的方法正在被呼叫)的參考,能理解吧,各位親?不理解的話,我們繼續往下看,
看完再不明白,你過來捶爆我,我保證不還手,只要不打臉,
01、消除欄位歧義
我敢賭一毛錢,所有的讀者,不管男女老少,應該都知道這種用法,畢竟寫構造方法的時候經常用啊,誰要不知道,過來,我給你發一毛錢紅包,只要你臉皮夠厚,
public class Writer {
private int age;
private String name;
public Writer(int age, String name) {
this.age = age;
this.name = name;
}
}
Writer 類有兩個成員變數,分別是 age 和 name,在使用有參建構式的時候,如果引數名和成員變數的名字相同,就需要使用 this 關鍵字消除歧義:this.age 是指成員變數,age 是指構造方法的引數,
02、參考類的其他構造方法
當一個類的構造方法有多個,并且它們之間有交集的話,就可以使用 this 關鍵字來呼叫不同的構造方法,從而減少代碼量,
比如說,在無參構造方法中呼叫有參構造方法:
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, "沉默王二");
}
}
也可以在有參構造方法中呼叫無參構造方法:
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() 必須是構造方法中的第一條陳述句,否則就會報錯,

03、作為引數傳遞
在下例中,有一個無參的構造方法,里面呼叫了 print() 方法,引數只有一個 this 關鍵字,
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);
}
}
來列印看一下結果:
print com.cmower.baeldung.this1.ThisTest@573fd745
main com.cmower.baeldung.this1.ThisTest@573fd745
從結果中可以看得出來,this 就是我們在 main() 方法中使用 new 關鍵字創建的 ThisTest 物件,
04、鏈式呼叫
學過 JavaScript,或者 jQuery 的讀者可能對鏈式呼叫比較熟悉,類似于 a.b().c().d(),仿佛能無窮無盡呼叫下去,
在 Java 中,對應的專有名詞叫 Builder 模式,來看一個示例,
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 類有三個成員變數,分別是 age、name 和 bookName,還有它們仨對應的一個構造方法,引數是一個內部靜態類 WriterBuilder,
內部類 WriterBuilder 也有三個成員變數,和 Writer 類一致,不同的是,WriterBuilder 類的構造方法里面只有 age 和 name 賦值了,另外一個成員變數 bookName 通過單獨的方法 writeBook() 來賦值,注意,該方法的回傳型別是 WriterBuilder,最后使用 return 回傳了 this 關鍵字,
最后的 build() 方法用來創建一個 Writer 物件,引數為 this 關鍵字,也就是當前的 WriterBuilder 物件,
這時候,創建 Writer 物件就可以通過鏈式呼叫的方式,
Writer writer = new Writer.WriterBuilder(18,"沉默王二")
.writeBook("《Web全堆疊開發進階之路》")
.build();
05、在內部類中訪問外部類物件
說實話,自從 Java 8 的函式式編程出現后,就很少用到 this 在內部類中訪問外部類物件了,來看一個示例:
public class ThisInnerTest {
private String name;
class InnerClass {
public InnerClass() {
ThisInnerTest thisInnerTest = ThisInnerTest.this;
String outerName = thisInnerTest.name;
}
}
}
在內部類 InnerClass 的構造方法中,通過外部類.this 可以獲取到外部類物件,然后就可以使用外部類的成員變數了,比如說 name,
06、關于 super
本來想單獨寫一篇 super 關鍵字的,但可寫的內容不多,本質上,this 關鍵字和 super 關鍵字有蠻多相似之處的,所以,就放在 this 這篇文章的末尾說一說吧,
簡而言之,super 關鍵字就是用來訪問父類的,
先來看父類:
public class SuperBase {
String message = "父類";
public SuperBase(String message) {
this.message = message;
}
public SuperBase() {
}
public void printMessage() {
System.out.println(message);
}
}
再來看子類:
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 關鍵字可用于訪問父類的構造方法
你看,子類可以通過 super(message) 來呼叫父類的構造方法,現在來新建一個 SuperSub 物件,看看輸出結果是什么:
SuperSub superSub = new SuperSub("子類的message");
new 關鍵字在呼叫構造方法創建子類物件的時候,會通過 super 關鍵字初始化父類的 message,所以此此時父類的 message 會輸出“子類的message”,
2)super 關鍵字可以訪問父類的變數
上述例子中的 SuperSub 類中就有,getParentMessage() 通過 super.message 方法父類的同名成員變數 message,
3)當方法發生重寫時,super 關鍵字可以訪問父類的同名方法
上述例子中的 SuperSub 類中就有,無參的構造方法 SuperSub() 中就使用 super.printMessage() 呼叫了父類的同名方法,
07、總結
親愛的讀者朋友,我應該說得很全面了吧?我想小王看到了這篇文章后一定會感謝我的良苦用心的,他畢竟是個積極好學的好同事啊,
如果覺得文章對你有點幫助,請微信搜索「 沉默王二 」第一時間閱讀,回復「并發」更有一份阿里大牛重寫的 Java 并發編程實戰,從此再也不用擔心面試官在這方面的刁難了,
本文已收錄 GitHub,傳送門~ ,里面更有大廠面試完整考點,歡迎 Star,
我是沉默王二,一枚有顏值卻靠才華茍且的程式員,關注即可提升學習效率,別忘了三連啊,點贊、收藏、留言,我不挑,嘻嘻,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/183581.html
標籤:Java
上一篇:架構師需要懂的環境配置標準化
