重溫java this關鍵字
給大家推薦個靠譜的公眾號程式設計師探索之路,大家一起加油
1. 當成員變數和區域性變數重名時,在方法中使用this時,表示的是該方法所在類中的成員變數。(this是當前物件自己)
public class Hello { String s = "Hello"; public Hello(String s) { System.out.println("s = " + s); System.out.println("1 -> this.s = " + this.s); this.s = s;//把引數值賦給成員變數,成員變數的值改變 System.out.println("2 -> this.s = " + this.s); } public static void main(String[] args) { Hello x = new Hello("HelloWorld!"); System.out.println("s=" + x.s);//驗證成員變數值的改變 } }
1 2 3 4 |
|
在這個例子中,建構函式Hello中,引數s與類Hello的成員變數s同名,這時如果直接對s進行操作則是對引數s進行操作。若要對類Hello的成員變數s進行操作就應該用this進行引用。執行結果的第一行就是直接對建構函式中傳遞過來的引數s進行列印結果; 第二行是對成員變數s的列印;第三行是先對成員變數s賦傳過來的引數s值後再列印,所以結果是HelloWorld!而第四行是主函式中直接列印類中的成員變數的值,也可以驗證成員變數值的改變。
2.把自己當作引數傳遞時,也可以用this.(this作當前引數進行傳遞)
class A { public A() { new B(this).print();// 呼叫B的方法 } public void print() { System.out.println("HelloAA from A!"); } } class B { A a; public B(A a) { this.a = a; } public void print() { a.print();//呼叫A的方法 System.out.println("HelloAB from B!"); } } public class HelloA { public static void main(String[] args) { A aaa = new A(); aaa.print(); B bbb = new B(aaa); bbb.print(); } }
1 2 3 4 5 6 |
|
在這個例子中,物件A的建構函式中,用new B(this)把物件A自己作為引數傳遞給了物件B的建構函式。
3.有時候,我們會用到一些內部類和匿名類,如事件處理。當在匿名類中用this時,這個this則指的是匿名類或內部類本身。這時如果我們要使用外部類的方法和變數的話,則應該加上外部類的類名。如:
public class HelloB {
int i = 1;
public HelloB() {
Thread thread = new Thread() {
public void run() {
for (int j=0;j<20;j++) {
HelloB.this.run();//呼叫外部類的方法
try {
sleep(1000);
} catch (InterruptedException ie) {
}
}
}
}; // 注意這裡有分號
thread.start();
}
public void run() {
System.out.println("i = " + i);
i++;
}
public static void main(String[] args) throws Exception {
new HelloB();
}
}
在上面這個例子中, thread 是一個匿名類物件,在它的定義中,它的 run 函式裡用到了外部類的 run 函式。這時由於函式同名,直接呼叫就不行了。這時有兩種辦法,一種就是把外部的 run 函式換一個名字,但這種辦法對於一個開發到中途的應用來說是不可取的。那麼就可以用這個例子中的辦法用外部類的類名加上 this 引用來說明要呼叫的是外部類的方法 run。
4. 在建構函式中,通過this可以呼叫同一類中別的建構函式。如:
public class ThisTest {
ThisTest(String str) {
System.out.println(str);
}
ThisTest() {
this("this測試成功!");
}
public static void main(String[] args) {
ThisTest thistest = new ThisTest();
}
}
為了更確切的說明this用法,另外一個例子為:
public class ThisTest {
private int age;
private String str;
ThisTest(String str) {
this.str=str;
System.out.println(str);
}
ThisTest(String str,int age) {
this(str);
this.age=age;
System.out.println(age);
}
public static void main(String[] args) {
ThisTest thistest = new ThisTest("this測試成功",25);
}
}
1 2 3 |
|
值得注意的是:
1:在構造呼叫另一個建構函式,呼叫動作必須置於最起始的位置。
2:不能在建構函式以外的任何函式內呼叫建構函式。
3:在一個建構函式內只能呼叫一個建構函式。
5.this同時傳遞多個引數。
public class TestClass {
int x;
int y;
static void showtest(TestClass tc) {//例項化物件
System.out.println(tc.x + " " + tc.y);
}
void seeit() {
showtest(this);
}
public static void main(String[] args) {
TestClass p = new TestClass();
p.x = 9;
p.y = 10;
p.seeit();
}
}
1 |
|
程式碼中的showtest(this),這裡的this就是把當前例項化的p傳給了showtest()方法,從而就運行了