CodeGym /Blog Java /Ngẫu nhiên /Java từ khóa này

Java từ khóa này

Xuất bản trong nhóm
Trên CodeGym, sinh viên được làm quen với từ khóa Java this ngay từ những bài học đầu tiên. Theo thời gian, ý nghĩa của nó trở nên rõ ràng. Nhưng nhìn lại, có lẽ nhiều người tự thú nhận rằng lâu nay họ không hiểu được tính Thiền của từ khóa này. Bài viết này sẽ kéo lại bức màn che đậy bí mật của từ khóa this cho những ai chưa làm được... Tôi đã có tài liệu tham khảo về Java của Schildt rồi, đến trang 171 bạn có thể thấy từ khóa this là cần thiết cho một phương thức để tham chiếu đối tượng đã gọi nó. Chúng ta có thể kết thúc bài học với điều đó. Nhưng chúng ta cần chi tiết cụ thể. Theo quy định, bạn cần sử dụng điều này trong hai trường hợp:
  1. Khi một biến thể hiện và biến phương thức/hàm tạo có cùng tên;
  2. Khi bạn cần gọi một loại hàm tạo cụ thể (ví dụ: hàm tạo mặc định hoặc hàm tạo được tham số hóa) từ một loại hàm tạo khác. Đây cũng được gọi là lệnh gọi hàm tạo rõ ràng.
Và đó là về nó - chỉ có hai trường hợp từ khóa đáng sợ này được sử dụng. Bây giờ hãy xem xét hai trường hợp này trong các ví dụ.

Ví dụ 1: Biến thể hiện và biến phương thức có cùng tên.

Giả sử chúng ta có một lớp Human định nghĩa một trường tên: Hãy tạo một bộ thiết lập cho biến tên (bộ thiết lập có đầy đủ chức năng — không có vấn đề gì ở đây):

class Human {
    String name;


    public void setName(String newName) {
        name = newName;
    }
}
Lưu ý rằng chúng tôi chuyển Chuỗi newName cho phương thức setName setter Chúng tôi đã khai báo một biến mới và có thể đặt tên cho nó là bất cứ thứ gì chúng tôi muốn vì nó sẽ chỉ hiển thị trong dấu ngoặc nhọn ({}) bao quanh phương thức setName . Lưu ý rằng setter có một dòng duy nhất:

name = newName;
Ở đây chúng tôi đã giới thiệu một biến mới gọi là newName và gán nó cho biến tên hiện có của đối tượng . Nhiều lập trình viên có thể thấy lạ khi giới thiệu một biến có tên mới khi cuối cùng chúng ta đang nói về cùng một thứ. Đó là, chúng ta đang nói về trường tên trong lớp Người . Đó là lý do tại sao những người tạo ra Java đã nghĩ ra một cách để sử dụng cùng một tên biến một cách thuận tiện. Nói cách khác, tại sao lại có hai tên cho một biến biểu thị cùng một thứ. Nói cách khác, chúng tôi muốn làm một cái gì đó như thế này:

class Human {
    String name;


    public void setName(String name) {
        name = name;
    }
}
Nhưng ở đây chúng ta gặp phải một vấn đề . Bây giờ chúng ta có hai biến có cùng tên. Một tên String thuộc về lớp Human , trong khi tên String khác thuộc về phương thức setName của nó . Do đó, JVM sẽ không biết bạn đang đề cập đến biến nào khi bạn viết dòng sau vào trình thiết lập:

name = name;
Java giả định rằng bạn muốn nói đến biến tên gần nhất , tức là biến từ phương thức setName : Từ khóa this (có ví dụ) - 3Vì vậy, hóa ra bạn chỉ đơn giản gán biến tên của phương thức cho chính nó. Mà tất nhiên không có ý nghĩa gì. Do đó, ngôn ngữ cần một số cách để phân biệt biến name của lớp Human với biến name trong phương thức setName . Vấn đề này đã được giải quyết bằng cách giới thiệu từ khóa this , trong trường hợp này chỉ ra rằng bạn định tham chiếu đến biến được liên kết với một thể hiện của lớp Human , chứ không phải biến trong phương thức: Nói cách khác, thisTừ khóa this (có ví dụ) - 4đề cập đến đối tượng gọi, như chúng tôi đã đề cập ở đầu bài viết. Kết quả là, phương thức setName đặt tên của người đó trên đối tượng đã tạo. Dưới đây là mã chương trình không sử dụng từ khóa this . Đoạn mã tạo một đối tượng Human và gán tên cho nó: Từ khóa this (có ví dụ) - 5Và đây là đoạn mã với từ khóa this :

public class Solution {
    public static void main(String[] args) {
        Human human1 = new Human();
        human1.setName("Vinny");
        human1.print();
    }
}
class Human {
    String name;
    public String getName() {
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
    void print() {
        System.out.println(name);
    }
}
Do đó, điều này cho phép chúng ta tránh đưa vào các biến mới để biểu thị cùng một thứ, làm cho mã sạch hơn và ít lộn xộn hơn với các biến phụ.

Ví dụ 2: Sử dụng điều này cho một lệnh gọi hàm tạo rõ ràng

Việc gọi một hàm tạo từ một hàm tạo khác có thể hữu ích khi bạn có (thật kỳ lạ) nhiều hàm tạo và bạn không muốn hàm tạo mới sao chép mã khởi tạo đã được viết trước đó trong một hàm tạo khác. Bối rối? Nó không quá đáng sợ như nó có vẻ. Nhìn vào mã dưới đây. Nó có hai hàm tạo cho lớp Human :

class Human {
    int age;
    int weight;
    int height;

    Human(int age, int weight) {
        this.age = age;
        this.weight = weight;
    }
    Human(int age, int weight, int height) {
        // Call the constructor with two parameters
        this(age, weight);
        // and then initialize the missing variable
        this.height = height;
    }
}
Ở đây, trước tiên chúng tôi đã cung cấp một hàm tạo với hai tham số: int ageint weight . Giả sử nó có hai dòng mã:

this.age = age;
this.weight = weight;
Sau đó, chúng tôi quyết định thêm một hàm tạo khác có ba tham số, thêm chiều cao vào các tham số tuổi và cân nặng hiện có. Bạn có thể viết hàm tạo mới như thế này:

this.age = age;
this.weight = weight;
this.height = height;
Nhưng thay vì lặp lại mã hiện có trong hàm tạo này, bạn có thể sử dụng từ khóa this để gọi hàm tạo một cách rõ ràng với hai tham số:

this(age, weight);
// and then initialize the missing variable:
this.height = height;
Như thể chúng ta đang nói với hàm tạo ba tham số:
  • gọi hàm tạo khác này có hai tham số
  • và sau đó thêm một biến khác.
Thế thôi =). Cuối cùng, chúng tôi lưu ý rằng trong Java, từ khóa this chỉ được sử dụng trong các phương thức và hàm tạo. Nhưng điều này được truyền hoàn toàn cho tất cả các phương thức không tĩnh (đó là lý do tại sao điều này thường được gọi là tham số ẩn) và có thể được sử dụng để chỉ đối tượng được gọi là phương thức. Đừng sợ từ khóa này, bởi vì điều này không đáng sợ.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION