this關鍵字

wen-210162704027發表於2024-08-01

當區域性變數和成員變數重名時,在方法中使用this時,表示的是該方法所在類中的成員變數。(this指的是當前物件自己)
如:public class World {

String s = "World";



public World(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) {

   World x = new World("HelloWorld!");

   System.out.println("s=" + x.s);//驗證成員變數值的改變

}

}

結果為:s = HelloWorld!

1 - this.s = World

2 - this.s = HelloWorld!

s=HelloWorld!

在這個例子中,建構函式World中,引數s與類World的成員變數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();

}

}

結果為:HelloAA from A!

HelloAB from B!

HelloAA from A!

HelloAA from A!

HelloAB from B!

在這個例子中,物件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);

  

}

}

    結果為:this測試成功

25

值得注意的是: 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();

}

}

結果為:9 10