Java Từ khóa this

Trong bài viết này, chúng ta sẽ tìm hiểu về từ khóa này trong Java, cách sử dụng chúng ở đâu và như thế nào với sự trợ giúp của các ví dụ.

từ khóa THIS

Trong Java, từ khóa này được sử dụng để tham chiếu đến đối tượng hiện tại bên trong một phương thức hoặc một phương thức khởi tạo. Ví dụ,

class Main {
    int instVar;

    Main(int instVar){
        this.instVar = instVar;
        System.out.println("this reference = " + this);
    }

    public static void main(String[] args) {
        Main obj = new Main(8);
        System.out.println("object reference = " + obj);
    }
}

Đầu ra :

this reference = Main@23fc625e
object reference = Main@23fc625e

Trong ví dụ trên, chúng ta đã tạo một đối tượng có tên là obj của lớp Main . Sau đó, chúng tôi in tham chiếu đến đối tượng obj và thistừ khóa của lớp.

Ở đây, chúng ta có thể thấy rằng tham chiếu của cả obj và thisgiống nhau. Nó có nghĩa là đây không là gì ngoài tham chiếu đến đối tượng hiện tại.

Sử dụng Từ khoá này

Có nhiều tình huống mà thistừ khóa thường được sử dụng.

Sử dụng điều này cho các tên biến mơ hồ

Trong Java, không được phép khai báo hai hoặc nhiều biến có cùng tên trong một phạm vi (phạm vi lớp hoặc phạm vi phương thức). Tuy nhiên, các biến cá thể và tham số có thể có cùng tên. Ví dụ,

class MyClass {
    // instance variable
    int age;

    // parameter
    MyClass(int age){
        age = age;
    }
}

Trong chương trình trên, biến instance và tham số có cùng tên: age. Ở đây, trình biên dịch Java bị nhầm lẫn do sự không rõ ràng về tên.

Trong tình huống như vậy, chúng tôi sử dụng từ khóa này. Ví dụ,

Đầu tiên, hãy xem một ví dụ mà không sử dụng thistừ khóa:

class Main {

    int age;
    Main(int age){
        age = age;
    }

    public static void main(String[] args) {
        Main obj = new Main(8);
        System.out.println("obj.age = " + obj.age);
    }
}

Đầu ra :

obj.age = 0

Trong ví dụ trên, chúng ta đã chuyển 8dưới dạng giá trị cho hàm tạo. Tuy nhiên, chúng tôi đang nhận được 0như một đầu ra. Điều này là do trình biên dịch Java bị nhầm lẫn vì sự không rõ ràng trong tên giữa cá thể biến và tham số.

Bây giờ, hãy viết lại đoạn mã trên bằng thistừ khóa.

class Main {

    int age;
    Main(int age){
        this.age = age;
    }

    public static void main(String[] args) {
        Main obj = new Main(8);
        System.out.println("obj.age = " + obj.age);
    }
}

Đầu ra :

obj.age = 8

Bây giờ, chúng tôi đang có được sản lượng như mong đợi. Đó là bởi vì khi hàm tạo được gọi, thisbên trong hàm tạo được thay thế bằng đối tượng obj đã được gọi là hàm tạo. Do đó, biến age được gán giá trị 8 .

Ngoài ra, nếu tên của tham số và biến phiên bản khác nhau, trình biên dịch sẽ tự động thêm từ khóa này. Ví dụ, mã:

class Main {
    int age;

    Main(int i) {
        age = i;
    }
}

tương đương với:

class Main {
    int age;

    Main(int i) {
        this.age = i;
    }
}

điều này với Getters và Setters

Một cách sử dụng phổ biến khác của thistừ khóa là trong các phương thức setters và getters của một lớp. Ví dụ:

class Main {
   String name;

   // setter method
   void setName( String name ) {
       this.name = name;
   }

   // getter method
   String getName(){
       return this.name;
   }

   public static void main( String[] args ) {
       Main obj = new Main();

       // calling the setter and the getter method
       obj.setName("Toshiba");
       System.out.println("obj.name: "+obj.getName());
   }
}

Đầu ra :

obj.name: Toshiba

Ở đây, chúng tôi đã sử dụng thistừ khóa:

  • to assign value inside the setter method
  • to access value inside the getter method

Sử dụng điều này trong Nạp chồng khối lệnh

Trong khi làm việc với quá trình nạp chồng phương thức khởi tạo , chúng ta có thể phải gọi một phương thức khởi tạo từ một phương thức khởi tạo khác. Trong trường hợp như vậy, chúng ta không thể gọi hàm tạo một cách rõ ràng. Thay vào đó, chúng ta phải sử dụng thistừ khóa.

Ở đây, chúng tôi sử dụng một dạng khác của từ khóa này. Đó là this(),. Hãy lấy một ví dụ,

class Complex {

    private int a, b;

    // constructor with 2 parameters
    private Complex( int i, int j ){
        this.a = i;
        this.b = j;
    }

    // constructor with single parameter
    private Complex(int i){
        // invokes the constructor with 2 parameters
        this(i, i); 
    }

    // constructor with no parameter
    private Complex(){
        // invokes the constructor with single parameter
        this(0);
    }

    @Override
    public String toString(){
        return this.a + " + " + this.b + "i";
    }

    public static void main( String[] args ) {
  
        // creating object of Complex class
        // calls the constructor with 2 parameters
        Complex c1 = new Complex(2, 3); 
    
        // calls the constructor with a single parameter
        Complex c2 = new Complex(3);

        // calls the constructor with no parameters
        Complex c3 = new Complex();

        // print objects
        System.out.println(c1);
        System.out.println(c2);
        System.out.println(c3);
    }
}

Đầu ra :

2 + 3i
3 + 3i
0 + 0i

Trong ví dụ trên, chúng tôi đã sử dụng thistừ khóa,

  • to call the constructor Complex(int i, int j) from the constructor Complex(int i)
  • to call the constructor Complex(int i) from the constructor Complex()

Lưu ý dòng,

System.out.println(c1);

Ở đây, khi chúng ta in đối tượng c1 , đối tượng được chuyển đổi thành một chuỗi. Trong quá trình này, cái toString()được gọi là. Vì chúng tôi ghi đè toString()phương thức bên trong lớp của mình, chúng tôi nhận được kết quả đầu ra theo phương thức đó.

Một trong những lợi thế rất lớn của this()nó là giảm số lượng mã trùng lặp. Tuy nhiên, chúng ta nên luôn cẩn thận trong khi sử dụng this().

Điều này là do việc gọi hàm tạo từ một hàm tạo khác sẽ thêm chi phí và nó là một quá trình chậm. Một lợi thế lớn khác của việc sử dụng this()là giảm số lượng mã trùng lặp.

Lưu ý : Việc gọi một hàm tạo từ một hàm tạo khác được gọi là gọi hàm tạo rõ ràng.

Chuyển điều này làm đối số

Chúng ta có thể sử dụng thistừ khóa để chuyển đối tượng hiện tại làm đối số cho một phương thức. Ví dụ,

class ThisExample {
    // declare variables
    int x;
    int y;

    ThisExample(int x, int y) {
       // assign values of variables inside constructor
        this.x = x;
        this.y = y;

        // value of x and y before calling add()
        System.out.println("Before passing this to addTwo() method:");
        System.out.println("x = " + this.x + ", y = " + this.y);

        // call the add() method passing this as argument
        add(this);

        // value of x and y after calling add()
        System.out.println("After passing this to addTwo() method:");
        System.out.println("x = " + this.x + ", y = " + this.y);
    }

    void add(ThisExample o){
        o.x += 2;
        o.y += 2;
    }
}

class Main {
    public static void main( String[] args ) {
        ThisExample obj = new ThisExample(1, -2);
    }
}

Đầu ra :

Before passing this to addTwo() method:
x = 1, y = -2
After passing this to addTwo() method:
x = 3, y = 0

Trong ví dụ trên, bên trong hàm tạo ThisExample(), hãy để ý dòng,

add(this);

Ở đây, chúng tôi đang gọi add()phương thức bằng cách chuyển nó như một đối số. Vì từ khóa này chứa tham chiếu đến đối tượng obj của lớp, chúng ta có thể thay đổi giá trị của x và y bên trong add()phương thức.









Gõ tìm kiếm nhanh...