Ở bài trước mình có giới thiệu cho các bạn constructor trong java rồi phải không nào ? Nhưng liệu bạn có thắc mắc vì sao lại có đoạn lệnh sau trong constructor không ?
class Bike{ int id; String name; Bike(int id, String name){ this.id = id; // Tại sao lại có this this.name = name; // Tại sao lại có this } }
Vậy chúng ta cùng tìm hiểu từ khóa this trong java nhé.
Dùng để tham chiếu tới các biến instance
Từ khóa this dùng để phân biệt những thuộc tính của lớp với các tham số truyền vào (nếu cùng tên). Nếu không cùng tên thì chương trình có thể tự phân biệt được nên có thể không cần từ khóa this.
Cùng xem ví dụ dưới đây.
class Bike{ int id; String name; Bike(int id, String name){ id = id; name = name; } public void display(){ System.out.println("id : "+ id); System.out.println("name : "+ name); } } public class TEST { public static void main(String[] args){ Bike bike_1 = new Bike(15,"nam"); bike_1.display(); } }
id : 0 name : null
Tại sao ? Chúng ta đã khởi tạo bằng constructor rồi mà ! Câu trả lời là chương trình không thể tự phân biệt đâu là tham số truyền vào và đâu là thuộc tính của lớp. Ở ví dụ id = id
chương trình hiểu là lấy tham số truyền vào ( id ) và gán giá trị đó cho chính nó. Tức là trong constructor có biến instance trùng tên với biến local nên chương trình ưu tiên dùng biến local.
Để khắc phục các bạn cần tham chiếu tới hai biến instance của lớp Bike bằng từ khóa this.
Bike(int id, String name){ this.id = id; this.name = name; }
Hoặc
Bike(int _id, String _name){ id = _id; name = _name; }
Dùng để gọi lại constructor
- Có thể gọi lại constructor trong các constructor khác của lớp bằng từ khóa this().
- Nếu gọi lại constructor bằng từ khóa this() thì từ khóa this() phải được khai báo dòng lệnh đầu tiên trong Constructor.
Cùng xem ví dụ sau nhé.
class Bike{ int id; String name; Bike(){ System.out.println("Constructor mac dinh"); //Constructor mặc định } Bike(int id){ this(); this.id = id; } Bike(int id, String name){ this(id); this.name = name; } public void display(){ System.out.println("id : "+ id); System.out.println("name : "+ name); } } public class TEST { public static void main(String[] args){ Bike bike_1 = new Bike(15); bike_1.display(); Bike bike_2 = new Bike(16,"tuan"); bike_2.display(); } }
Constructor mac dinh id : 15 name : null Constructor mac dinh id : 16 name : tuan
Dùng để trả về lớp hiện tại
- Bạn có thể dễ dàng trả về lớp hiện tại bằng từ khóa this.
- Kiểu trả về sẽ là kiểu class nhé (không phải kiểu nguyên thủy đâu).
Cùng xem ví dụ sau nhé
class Bike{ int id; String name; Bike(){ } Bike(int id,String name){ this.name = name; this.id = id; } public void display(){ System.out.println("id : "+ id); System.out.println("name : "+ name); } public Bike getBike(){ this.id += 10; this.name += "Anh"; return this; } } public class TEST { public static void main(String[] args){ Bike bike = new Bike(1,"Tuan "); bike.display(); bike.getBike().display(); } }
id : 1 name : Tuan id : 11 name : Tuan Anh
Giải thích: phương thức getBike()
trả về là một đối tượng thuộc lớp Bike. Mà lớp Bike thì có phương thức display()
nên ta có thể viết liên tục là bike.getBike().display()
.
Bài viết của mình đến đây là kết thúc. Cám ơn các bạn đã theo dõi !
Trả lời