Java this關鍵字


在java中,this關鍵字有很多種用法。 在java中,這是一個參照當前物件的參照變數。

java this關鍵字的用法如下:

  1. this關鍵字可用來參照當前類的範例變數。
  2. this關鍵字可用於呼叫當前類方法(隱式)。
  3. this()可以用來呼叫當前類別建構函式。
  4. this關鍵字可作為呼叫方法中的引數傳遞。
  5. this關鍵字可作為引數在建構函式呼叫中傳遞。
  6. this關鍵字可用於從方法返回當前類的範例。

建議:如果你是java初學者,只學習 this 關鍵字的前三個用法就可以了。

1. this:參照當前類的範例變數

this關鍵字可以用來參照當前類的範例變數。如果範例變數和引數之間存在歧義,則 this 關鍵字可用於明確地指定類變數以解決歧義問題。

了解沒有 this 關鍵字的問題

下面先來理解一個不使用 this 關鍵字的範例:

class Student {
    int rollno;
    String name;
    float fee;

    Student(int rollno, String name, float fee) {
        rollno = rollno;
        name = name;
        fee = fee;
    }

    void display() {
        System.out.println(rollno + " " + name + " " + fee);
    }
}

class TestThis1 {
    public static void main(String args[]) {
        Student s1 = new Student(111, "ankit", 5000f);
        Student s2 = new Student(112, "sumit", 6000f);
        s1.display();
        s2.display();
    }
}

執行上面程式碼輸出結果如下 -

0 null 0.0
0 null 0.0

在上面的例子中,引數(形式引數)和範例變數(rollnoname)是相同的。 所以要使用this關鍵字來區分區域性變數和範例變數。

使用 this 關鍵字解決了上面的問題

class Student {
    int rollno;
    String name;
    float fee;

    Student(int rollno, String name, float fee) {
        this.rollno = rollno;
        this.name = name;
        this.fee = fee;
    }

    void display() {
        System.out.println(rollno + " " + name + " " + fee);
    }
}

class TestThis2 {
    public static void main(String args[]) {
        Student s1 = new Student(111, "ankit", 5000f);
        Student s2 = new Student(112, "sumit", 6000f);
        s1.display();
        s2.display();
    }
}

執行上面程式碼輸出結果如下 -

111 ankit 5000
112 sumit 6000

如果區域性變數(形式引數)和範例變數不同,則不需要像下面的程式一樣使用this關鍵字:

不需要 this 關鍵字的程式範例

class Student {
    int rollno;
    String name;
    float fee;

    Student(int r, String n, float f) {
        rollno = r;
        name = n;
        fee = f;
    }

    void display() {
        System.out.println(rollno + " " + name + " " + fee);
    }
}

class TestThis3 {
    public static void main(String args[]) {
        Student s1 = new Student(111, "ankit", 5000f);
        Student s2 = new Student(112, "sumit", 6000f);
        s1.display();
        s2.display();
    }
}

執行上面程式碼輸出結果如下 -

111 ankit 5000
112 sumit 6000

對變數使用有意義的名稱是一種好的程式設計習慣。所以使用相同名稱的範例變數和引數,並且總是使用this關鍵字。

2. this:呼叫當前類方法

可以使用this關鍵字呼叫當前類的方法。如果不使用this關鍵字,編譯器會在呼叫方法時自動新增此 this 關鍵字。我們來看看這個例子。

執行上面程式碼輸出結果如下 -

hello n
hello m

3. this():呼叫當前類別建構函式

this()建構函式呼叫可以用來呼叫當前類別建構函式。 它用於重用建構函式。 換句話說,它用於建構函式連結。

從引數化建構函式呼叫預設建構函式:

class A {
    A() {
        System.out.println("hello a");
    }

    A(int x) {
        this();
        System.out.println(x);
    }
}

class TestThis5 {
    public static void main(String args[]) {
        A a = new A(10);
    }
}

執行上面程式碼輸出結果如下 -

hello a
10

從預設建構函式呼叫引數化建構函式:

class A {
    A() {
        this(5);
        System.out.println("hello a");
    }

    A(int x) {
        System.out.println(x);
    }
}

class TestThis6 {
    public static void main(String args[]) {
        A a = new A();
    }
}

執行上面程式碼輸出結果如下 -

5
hello a

使用this()建構函式呼叫

this()建構函式呼叫用於從建構函式重用建構函式。 它維護建構函式之間的鏈,即它用於建構函式連結。看看下面給出的範例,顯示this關鍵字的實際使用。

class Student {
    int rollno;
    String name, course;
    float fee;

    Student(int rollno, String name, String course) {
        this.rollno = rollno;
        this.name = name;
        this.course = course;
    }

    Student(int rollno, String name, String course, float fee) {
        this(rollno, name, course);// reusing constructor
        this.fee = fee;
    }

    void display() {
        System.out.println(rollno + " " + name + " " + course + " " + fee);
    }
}

class TestThis7 {
    public static void main(String args[]) {
        Student s1 = new Student(111, "ankit", "java");
        Student s2 = new Student(112, "sumit", "java", 6000f);
        s1.display();
        s2.display();
    }
}

執行上面程式碼輸出結果如下 -

111 ankit java null
112 sumit java 6000

注意:呼叫this()必須是建構函式中的第一個語句。

下面範例為不把 this() 語句放在第一行,因此編譯不通過。

class Student {
    int rollno;
    String name, course;
    float fee;

    Student(int rollno, String name, String course) {
        this.rollno = rollno;
        this.name = name;
        this.course = course;
    }

    Student(int rollno, String name, String course, float fee) {
        this.fee = fee;
        this(rollno, name, course);// C.T.Error
    }

    void display() {
        System.out.println(rollno + " " + name + " " + course + " " + fee);
    }
}

class TestThis8 {
    public static void main(String args[]) {
        Student s1 = new Student(111, "ankit", "java");
        Student s2 = new Student(112, "sumit", "java", 6000f);
        s1.display();
        s2.display();
    }
}

執行上面程式碼輸出結果如下 -

Compile Time Error: Call to this must be first statement in constructor

4. this:作為引數傳遞給方法

this關鍵字也可以作為方法中的引數傳遞。 它主要用於事件處理。 看看下面的一個例子:

class S2 {
    void m(S2 obj) {
        System.out.println("method is invoked");
    }

    void p() {
        m(this);
    }

    public static void main(String args[]) {
        S2 s1 = new S2();
        s1.p();
    }
}

執行上面程式碼輸出結果如下 -

method is invoked

這個應用程式可以作為引數傳遞:

在事件處理(或)的情況下,必須提供一個類的參照到另一個。 它用於在多個方法中重用一個物件。

this:在建構函式呼叫中作為引數傳遞

也可以在建構函式中傳遞this關鍵字。 如果必須在多個類中使用一個物件,可以使用這種方式。 看看下面的一個例子:

class B {
    A4 obj;

    B(A4 obj) {
        this.obj = obj;
    }

    void display() {
        System.out.println(obj.data);// using data member of A4 class
    }
}

class A4 {
    int data = 10;

    A4() {
        B b = new B(this);
        b.display();
    }

    public static void main(String args[]) {
        A4 a = new A4();
    }
}

執行上面程式碼輸出結果如下 -

10

6. this關鍵字用來返回當前類的範例

可以從方法中 this 關鍵字作為語句返回。 在這種情況下,方法的返回型別必須是類型別(非原始)。 看看下面的一個例子:

作為語句返回的語法

return_type method_name(){  
    return this;  
}

從方法中返回為語句的 this 關鍵字的範例

class A {
    A getA() {
        return this;
    }

    void msg() {
        System.out.println("Hello java");
    }
}

class Test1 {
    public static void main(String args[]) {
        new A().getA().msg();
    }
}

執行上面程式碼輸出結果如下 -

Hello java

驗證 this 關鍵字

現在來驗證 this 關鍵字參照當前類的範例變數。 在這個程式中將列印參考變數,這兩個變數的輸出是相同的。

class A5 {
    void m() {
        System.out.println(this);// prints same reference ID
    }

    public static void main(String args[]) {
        A5 obj = new A5();
        System.out.println(obj);// prints the reference ID
        obj.m();
    }
}

執行上面程式碼輸出結果如下 -

A5@22b3ea59
A5@22b3ea59