1. 程式人生 > 其它 >a.使用new關鍵字產生物件會呼叫構造方法_還沒弄明白Java中的this關鍵字嗎,來看這篇就夠了...

a.使用new關鍵字產生物件會呼叫構造方法_還沒弄明白Java中的this關鍵字嗎,來看這篇就夠了...

技術標籤:a.使用new關鍵字產生物件會呼叫構造方法

this關鍵字的作用:

1、區分成員變數和區域性變數(當成員變數和區域性變數重名時)

2、可在構造方法中呼叫同一個類的其他構造方法(但是規定this只能寫在構造方法的第一行)

3、能呼叫構造方法,當然也能呼叫普通方法啦(在同一個類中的方法內部,其實不必要使用this來呼叫,直接寫出方法名即可,但是有的人會認為,寫出this會讓程式碼看起來更規範。我認為這個完全沒必要。這裡看個人習慣吧。)~

我:你看,這不是很簡單嗎?

A:什麼啊,就這?我知道啊,你這不是在給我說點沒用的話嘛。

我:彆氣嘛,那我再給你扯點(絞盡腦汁的想)

4、this關鍵字還可以作為當前的物件的引用進行返回,我讓你看看程式碼你就理解了

public class Student {
    public Student log2(){
        System.out.println("直接返回一個Student的引用");
        return this;
    }
}

就這麼寫。你看,多簡單

A:沒聽懂,返回什麼物件什麼引用啊。。。

我:嗯。。。。好吧,那我再給你解釋一下。再看一下程式碼!

public class TestMain {
    public static void main(String[] args) {
        Student student = new Student();
        Student student2 = student.log2();
        System.out.println(student == student2);
    }
}

34088e682b94497d2d1a6716f1efd2cd.png

你看,你 new 個物件(物件引用),然後去呼叫log2這個方法,就會再返回一個物件,此時這個物件和你new的那個是同一個。但是如果你直接return new Student(); 那此時這個物件就是一個新的物件,所以說,this能返回當前物件(引用)。懂了吧!

A:這樣啊,那你這麼說,我就知道了。

我:再給你掰扯點,彆著急;

你知道如果有兩個Student的物件時,他們都要去呼叫同一個方法,怎麼才能知道,到底是哪個物件在呼叫這個方法呢?比如這樣的程式碼

public class Student {
    public void log2(int i) {
        System.out.println(i); 
    }
}
public class TestMain {
    public static void main(String[] args) {
        Student s1 = new Student();
        Student s2 = new Student();
        s1.log2(2);
        s2.log2(3);
    }
}

是不是覺得這是兩個不同物件的引用啊,當然能區分是誰在呼叫了啊!

其實本質不是這樣滴

你在寫完程式碼後,編譯器悄悄在幫助你做了一個工作,為了讓你省心呢,多麼貼心啊,我要是....

A:你倒是說啊,到底做了什麼?

我:好吧;我說。。。

當你在呼叫方法的時候,其實編譯器悄悄在你傳的引數前邊加了當前的物件,像這樣

s1.log2(s1,2);
s2.log2(s2,3);

當然,如果你這麼寫程式碼,那編譯器肯定會說:這點小事情,還是我替你做吧,就不麻煩小主人了,然後無情的給了你一個紅波浪線;

A:真的假的啊,說的這麼玄乎。

我:害,你還不信,看下邊的程式碼,我們在方法上做個小改動

public class Student {
    public void log2(int i) {
        System.out.println(this + " " + i);
    }
}
public class TestMain {
    public static void main(String[] args) {
        Student s1 = new Student();
        Student s2 = new Student();
        System.out.println("s1的地址----->" + s1);
        System.out.println("s2的地址----->" + s2);
        s1.log2(2);
        s2.log2(3);
    }
}

為了能看清楚是不是這樣,我們吧 s1 s2 指向的地址在主方法中打印出來,發現和方法中的 this 打印出來的地址一樣

43938cac4fc968c28e9c7877b5f40a55.png

這就說明了,確實是將物件給傳了進去。

A:啊,我懂了,我知道了,原來是這樣啊,真神奇。我...我...

我:你怎麼了,還有什麼不懂得嗎?

A: 區分變數我總是記不住到底指向的是誰....

我:這個啊,簡單,你記住就遠原則 "this." 這個this打點呼叫的是誰,誰就是成員變數。如果你的變量出現了同名的情況,如果不進行指向,預設就是使用你的區域性變數。

總結:

由於我個人覺得,如果只是枯燥的堆疊概念,只講述一些術語,不僅看起來無聊,看過之後還會忘得一乾二淨。所以筆記用這種方法展示出來,可能更能讓人記憶更深刻。學習本來沒有固定的方法,不管怎麼學,學會了就行嘛!

如有錯誤,歡迎指出!一定及時改正