Từ khóa this trong java

Mn cho e hỏi về từ khóa This khi được sử dụng như tham số trong phương thức ạ. Tra gg mà không rõ lắm.

là nó truyền chính nó vào phương thức thôi

2 Likes

Sao lại truyền chính nó được ạ.

Bạn phải có một góc nhìn thế này:
Ngày xưa khi chưa đi theo OOP, người ta lập trình theo một mô phạm gọi là “Lập trình về thủ tục”, lúc đó chỉ đơn giản là: bắt đầu chương trình là một hàm số, và hàm số nhận vào một tập hợp giá trị, và trả về một giá trị, bên trong hàm có thể tạo ra biến số, và nó cũng có thể đọc hoặc ghi biến số ở bên ngoài nó (mình gọi là global variable).
Sau này người ta nghĩ rằng nên mô hình hóa thế này: lập trình là lập trình với “đối tượng”, mỗi đối tượng có những thuộc tính và chức năng (hàm số) gắn với nó. Và thế là chúng ta có OOP đặt đè nên cái nền lập trình thủ tục.
Khi đưa vào lập trình cụ thể, bạn phải biết rằng tuy là nói như trên, nhưng trong bộ nhớ người ta lưu đối tượng là bao gồm các thuộc tính của riêng nó ở một nơi, nhưng hàm số thì lại đặt riêng một nơi khác, vì hàm số - chức năng là cái chung giữa các đối tượng, giờ chúng nó được gọi là phương thức.
Khi bạn gọi phương thức thì bạn phải có cách biết rằng bạn đang gọi phương thức - chức năng của đối tượng nào, bạn có thấy rằng trong mọi trường hợp kiểu gì bạn cũng phải gõ thế này:

someObject.someMethod();

để xác định là bạn muốn gọi phương thức nhưng phải gắn với đối tượng cụ thể nào, và từ khóa this là giao diện để bạn làm điều đó, tức như trên là để truy cập vào biến someObject.

6 Likes

thì là truyền chính nó, còn tại sao thì là do ngôn ngữ cho phép thế.

Cá nhân mình thấy không nên giải thích hời hợt như vậy, không dẫn người ta đi đến đâu cả.

6 Likes

Bản chất đúng như em nói. Quá trình cụ thể, giả sử có class:

public class Foo {
    public void bar(String name) {
        System.out.println("Foo.bar(): " + name);
    }
    public void baz(int p1, int p2, int p3) {
        System.out.println("Foo.baz(): " + p1 + ", " + p2 + ", " + p3);
    }
}

Sau đó em tạo object và gọi phương thức:

Foo foo = new Foo();
foo.bar("phong"); // (1)

JVM biên dịch đổi phương thức bar() thành Foo$bar(), có sẵn 1 tham số đầu tiên tên this kiểu Foo, các tham số còn lại được thêm ở vị trí thứ 2 trở đi.

public void Foo$bar(Foo this, String name) { ... }

Để ý: $ là kí tự hợp lệ trong Java

Khi gọi (1), thì (1) được gọi bằng:

Foo$bar(foo, "phong");

Tương tự đối với baz():

public void Foo$baz(Foo this, int p1, int p2, int p3) { ... }

Lúc gọi

foo.baz(1, 2, 3);

thì đổi thành

Foo$baz(foo, 1, 2, 3);

Màn chém gió đến đây là hết

7 Likes

Bản chất của từ khóa this đúng như @hungaya đã giải thích. Sau khi biến đổi, nó luôn là tham số đầu tiên của hàm (không phải phương thức).

Có vài cách thể hiển khác nhau của từ khóa this ở các ngôn ngữ khác nhau. Như:

  • this: Java, C#, Javascript,…
  • me: VB.NET, …
  • self: Python, Lua, …

Đều có nghĩa là đối tượng hiện tại của phương thức đang gọi.

Điều này có thể thấy rõ trong 1 số ngôn ngữ, như Lua (Lua 5) chẳng hạn. Đặc biệt là ngôn ngữ đang được dùng nhiều hiện nay: Python cũng có cách thực hiện khai báo các phương thức trong lớp khi truyền tham số đầu tiên là self dưới dạng 1 hàm.

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?