Bài đăng nổi bật



Trong phần này chúng ta sẽ tìm hiểu về:
  • Constructor trong Java là gì?
  • Quy tắc tạo constructor
  • Constructor overleading
  • Constructor Chaining

Constructor 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 mới và được gọi ngay sau khi bộ nhớ được cấp phát cho đối tượng. Phương thức khởi tạo còn được sử dụng để khởi tạo thuộc tính của đối tượng thành các giá trị mong muốn hoặc mang giá trị mặc định tại thời điểm tạo đối tượng. Khi tạo một lớp không bắt buộc phải viết mã tạo phương thức khởi tạo.
Nếu không có hàm tạo nào được tạo, trình biên dịch gọi hàm tạo mặc định và khởi tạo các biến thành viên theo các giá trị mặc định của nó.
  • Với biến có kiểu dữ liệu số giá trị mặc định khởi tạo là 0
  • Với biến có kiểu dữ liệu ký tự giá trị mặc định khởi tạo là null (‘\0’)
  • Các biến tham chiếu được khởi tạo là null

Các quy tắc để tạo Constructor

1.    Constructor phải có cùng tên với tên lớp của nó
2.    Constructor không có kiểu dữ liệu trả về (thậm chí là kiểu dữ liệu void)
3.    Constructor được gọi sử dụng toán tử new khi một đối tượng được tạo. 

Constructor đóng vai trò quan trọng trong việc khởi tạo đối tượng.
Ví dụ 1 - Tạo constructor đầu tiên trong Java
Bước 1: Nhập mã sau vào trình soạn thảo của bạn.
class Demo{
      int  value1;
      int  value2;
      Demo(){
         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[]){
       Demo d1 = new Demo();
      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ó nhiều hàm tạo với các tham số đầu vào khác nhau. Trình biên dịch phân biệt các hàm tạo 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 hàm tạo hợp lệ cho lớp Account
Account(int a);
Account (int a,int b);
Account (String a,int b);
Ví dụ 2 - Constructor Overloading
Bước 1: Nhập mã vào trình soạn thảo.
class Demo{
      int  value1;
      int  value2;
      /*Demo(){
       value1 = 10;
       value2 = 20;
       System.out.println("Inside 1st Constructor");
     }*/
 
     Demo(int a){
      value1 = a;
      System.out.println("Inside 2nd Constructor");
     }
 
     Demo(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);
     }
  
     public static void main(String args[]){
        Demo d1 = new Demo();
        Demo d2 = new Demo(30);
        Demo d3 = new Demo(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 Demo là Demo(). Trong trường hợp bạn không cung cấp constructor mặc định, 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 ghi đè hàm tạo 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.

Lưu ý: Nếu bạn chỉ định một hàm tạo với tham số đầu vào như Demo (int a) và muốn sử dụng hàm tạo mặc định Demo(), thì bắt buộc bạn phải tạo nó. Nói cách khác, trong trường hợp hàm tạo 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 xây dựng khi tạo lớp.
Bước 5: Bỏ chú thích ở mã lệnh ở dòng # 4- 8. Lưu, biên dịch và chạy mã.


Constructor Chaining

Hãy xem xét một kịch bản trong đó một lớp cơ sở được mở rộng bởi một lớp con. Bất cứ khi nào một đối tượng của lớp con được tạo, hàm tạo của lớp cha được gọi trước tiên. Điều này được gọi là Constructor Chaining.
Ví dụ 3 - Hiểu được constructor chaining
Bước 1: Sao chép mã sau vào trình soạn thảo.
class Demo{
   int  value1;
   int  value2;
 
   Demo(){
      value1 = 1;
      value2 = 2;
      System.out.println("Inside 1st Parent Constructor");
   }
 
   Demo(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[]){
     DemoChild d1 = new DemoChild();
     d1.display();
   }
}
 
class DemoChild extends Demo{
    int value3;
    int value4;
 
    DemoChild(){
     //super(5);
     value3 = 3;
     value4 = 4;
     System.out.println("Inside the Constructor of Child");
    }
 
    public void display(){
      System.out.println("Value1 === "+value1);
      System.out.println("Value2 === "+value2);
      System.out.println("Value1 === "+value3);
      System.out.println("Value2 === "+value4);
   }
}
Bước 2: Chạy mã. Khi đối tượng của lớp con DemoChild được tạo, constructor Demo() của lớp cha được gọi trước và sau đó hàm tạo DemoChild() của lớp con được tạo. 
Kết quả dự kiến:
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 hàm tạo của lớp cha Demo bị ghi đè. Điều gì sẽ xảy ra nếu bạn muốn gọi hàm tạo Demo(int a) thay vì hàm tạo mặc định Demo() khi đối tượng của lớp con đượ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ư Demo(String Name,int a), bạn sẽ chỉ định super ("Java", 5) Nếu được sử dụng, từ khóa super được đặt ở dòng mã đầu tiên trong hàm tạo của lớp con.
Bước 4: Bỏ chú thích 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


Post a Comment

أحدث أقدم