Constructor trong Java là gì?
Constructor là một phương thức đặc biệt được sử dụng để khởi tạo một đối tượng Trong Java. Constructor có thể có tham số hoặc không có tham số.
Nếu bạn đơn thuần chỉ muốn khởi tạo đối tượng và không cần các giá trị mặc định ban đầu, thì bạn không cần viết thêm constructor.
Nếu bạn muốn khởi tạo đối tượng kèm theo các giá trị ban đầu thì các bạn hãy viết thêm constructor mới bên cạnh constructor mặc định.
Nếu dùng constructor mặc định của hệ thống, thì trình biên dịch sẽ tự động khởi tạo các giá trị mặc định cho các trường
- kiểu dữ liệu số được đặt thành 0
- kiểu dữ liệu char được đặt thành ký tự null ('\ 0')
- các biến tham chiếu được đặt thành null
Trong hướng dẫn này, bạn sẽ học-
- Constructor trong Java là gì
- Quy tắc để tạo ra 1 Constructor
- Constructor Overloading
- Chuỗi Constructor
Các quy tắc để tạo Constructor trong Java
- Nó có cùng tên với lớp
- Nó không có giá trị trả về (thậm chỉ cả kiểu void cũng không được)
Ví dụ 1 : Tạo Constructor đầu tiên trong Java
Bước 1) Viết đoạn code sau
class CodeLean{
int value1;
int value2;
CodeLean(){
value1 = 10;
value2 = 20;
System.out.println("Inside Constructor");
}
public void display(){
System.out.println("Value1 === "+value1);
System.out.println("Value2 === "+value2);
}
public static void main(String args[]){
CodeLean d1 = new CodeLean();
d1.display();
}
}
Bước 2) Lưu, chạy và biên dịch mã. Quan sát đầu ra.
Đầu ra:
Inside Constructor
Value1 === 10
Value2 === 20
Constructor Overloading - nạp chồng constructor
Constructor Overloading là một kỹ thuật trong Java, trong đó một lớp có thể có bất kỳ số lượng constructor với danh sách cá tham số khác nhau. Trình biên dịch phân biệt các constructor này bằng cách tính đến số lượng tham số trong danh sách và kiểu của chúng.
Ví dụ về các constructor hợp lệ cho lớp Account
Account(int a);
Account (int a,int b);
Account (String a,int b);
Ví dụ 2 : Để hiểu hơn về Constructor Overloading ta hãy làm ví dụ sau
Bước 1) Viết đoạn code sau
class CodeLean{
int value1;
int value2;
/*CodeLean(){
value1 = 10;
value2 = 20;
System.out.println("Inside 1st Constructor");
}*/
CodeLean(int a){
value1 = a;
System.out.println("Inside 2nd Constructor");
}
CodeLean(int a,int b){
value1 = a;
value2 = b;
System.out.println("Inside 3rd Constructor");
}
public void display(){
System.out.println("Value1 === "+value1);
System.out.println("Value2 === "+value2);
}
CodeLean d1 = new CodeLean();
CodeLean d3 = new CodeLean(30,40);
d1.display();
d2.display();
d3.display();
}
}
Bước 2) Lưu, biên dịch và chạy mã.
Bước 3) Lỗi = ?. Hãy thử và gỡ lỗi trước khi tiếp tục bước tiếp theo.
Bước 4) Mỗi lớp có một Constructor mặc định. Constructor mặc định cho lớp CodeLean là CodeLean() . Trong trường hợp bạn không cung cấp constructor này, trình biên dịch sẽ tạo nó cho bạn và khởi tạo các biến thành các giá trị mặc định. Bạn có thể chọn nạp chồng constructor mặc định này và khởi tạo các biến thành các giá trị mong muốn của bạn như trong Ví dụ 1.
Nhưng nếu bạn chỉ định một constructor được tham số hóa như CodeLean (int a) và muốn sử dụng Tconstructor mặc định CodeLean(), thì bắt buộc bạn phải chỉ định nó.
Nói cách khác, trong trường hợp Constructor của bạn bị ghi đè và bạn muốn sử dụng hàm tạo mặc định, thì nó cần phải được chỉ định.
Bước 5) Bỏ đi chú thích code đoạn # 4-8. Lưu, biên dịch và chạy mã.
Chuỗi constructor
Hãy xem xét trường hợp sau, ví dụ ta có lớp cha lớp con. Trong đó lớp con được mở rộng từ lớp cha, và bất cứ khi nào một đối tượng của lớp con được tạo thì hàm khởi tạo (constructor của lớp cha) được gọi trước tiên.
Điều này được tạm gọi là chuỗi constructor (tức là một loạt constructor được gọi theo thứ tự thừa kế cha con)
Ví dụ 3: Để hiểu về chuỗi constructor ta hãy làm ví dụ sau
Bước 1) Code đoạn chương trình sau
class CodeLean{
int value1;
int value2;
CodeLean(){
value1 = 1;
value2 = 2;
System.out.println("Inside 1st Parent Constructor");
}
CodeLean(int a){
value1 = a;
System.out.println("Inside 2nd Parent Constructor");
}
public void display(){
System.out.println("Value1 === "+value1);
System.out.println("Value2 === "+value2);
}
public static void main(String args[]){
CodeLeanChild d1 = new CodeLeanChild();
d1.display();
}
}
class CodeLeanChild extends CodeLean{
int value3;
int value4;
Bước 2) Chạy mã. Do chuỗi constructor, khi đối tượng của lớp con CodeLeanChild được tạo, thì constructor CodeLean() của lớp cha được gọi trước và sau đó là constructor CodeLeanChild() của con được khởi tạo.
Output dự kiến là
Inside 1st Parent Constructor
Inside the Constructor of Child
Value1 === 1
Value2 === 2
Value1 === 3
Value2 === 4
Bước 3) Bạn có thể quan sát constructor của lớp cha CodeLean bị ghi đè. Điều gì sẽ xảy ra nếu bạn muốn gọi constructor bị ghi đè (int a) thay vì constructor mặc định () khi đối tượng con của bạn được tạo?
Trong các trường hợp như vậy, bạn có thể sử dụng từ khóa "super" để gọi các hàm tạo bị ghi đè của lớp cha.
Cú pháp: -
super();
--or--
super(parameter list);
Ví dụ: Nếu hàm tạo của bạn giống như CodeLean (string, int), bạn sẽ chỉ định super ("Java", 5) Nếu được sử dụng, super từ khóa cần phải là dòng mã đầu tiên trong hàm tạo của lớp con.
Bước 4) Bỏ đi comment của dòng # 26 và chạy mã. Quan sát đầu ra.
Đầu ra:
Inside 2nd Parent Constructor
Inside the Constructor of Child
Value1 === 5
Value2 === 0
Value1 === 3
Value2 === 4
إرسال تعليق