1. Constructor trong Java là gì?

Constructor trong Java là một hàm tạo. Ta có thể hiểu đơn giản nhất nó là một thuật ngữ để ta xây dựng một cái gì đó trong chương trình của mình. Và ở đây constructor là một kiểu đặc biệt để khởi tạo đối tượng và trả về đối tượng của lớp mà nó được định nghĩa. Constructor có tên tương tự với các tên lớp mà nó đã được định nghĩa, đương nhiên chúng cũng không được định nghĩa theo dạng một kiểu giá trị được trả về.

Ta có thể coi lớp (class) là một là chủ đề quan trọng nhất của các constructor . Mỗi lớp có ít nhất một constructor. Nếu chúng ta không viết một constructor một cách rõ ràng cho một lớp thì bộ biên dịch Java xây dựng một constructor mặc định cho lớp đó. Đồng thời mỗi khi một đối tượng mới được tạo ra, ít nhất một constructor sẽ được gọi.

2. Quy tắc để tạo costructor trong Java

Có hai loại Constructor: Loại thứ nhất là Constructor mặc định, loại này không có tham số. Và loại thứ hai là Constructor được tham số hóa.

2.1. Constructor mặc định

Một constructor mặc định đơn giản là nó không có tham số. Ta có cú pháp của nó như sau:

<class_name>() {
    // code
}

Ví dụ:

//tạo lớp Animal:
class Main{
  //khai báo các thuộc tính:
  int id; //mã nhận diện
  String name; //tên
  float age; //tuổi

  //hàm tạo không tham số
  public Main() {
    id=1234;
    name="Moon";
    age=1;
  }
}

Ví dụ trên có một phương thức là Main() và đây chính là hàm tạo. Phương thức này được gọi để khởi tạo cho các thuộc tính như id , name , age khi đối tượng của lớp được tạo. Hàm này không có bất kỳ tham số nào vì thế nó được gọi là hàm tạo không tham số.

Hạn chế của việc sử dụng một hàm constructor mặc định được Java tạo tự động là sau đó chúng ta không thể thiết lập các giá trị ban đầu cho các thuộc tính của đối tượng.

Ví dụ:

class Main
{
    // Constructor
    Main(){
        System.out.println("Đây là hàm constructor");
    }
    public static void main(String args[]){
        // Tạo đối tượng mới
        Main a = new Main();
    }
}

Kết quả

Đây là hàm constructor

Lưu ý

Hàm tạo mặc định này cung cấp các giá trị mặc định cho đối tượng như 0, null, … tùy thuộc vào kiểu.

Nếu không có hàm constructor được định nghĩa trong class Java, thì trình biên dịch Java sẽ tự động tạo một hàm constructor mặc định cho class đó. Đồng thời nó cũng tự động được gọi khi đối tượng được tạo.

Ví dụ:

class Main{  
    int id;  
    String name;  
   
    void display() {
        System.out.println(id+" "+name);
    }  
   
    public static void main(String args[]) {
        Main s1=new Main();  
        Main s2=new Main();  
        s1.display();  
        s2.display();  
    }  
}

Kết quả

0 null
0 null

2.2. Constructor có tham số

Một phương thức khởi tạo có các tham số được gọi là phương thức khởi tạo được tham số hóa. Nếu chúng ta muốn khởi tạo các trường của lớp với các giá trị của riêng chúng ta, thì hãy sử dụng một phương thức khởi tạo được tham số hóa. Constructor tham số được sử dụng để cung cấp các giá trị khác nhau cho các đối tượng khác nhau.

Ví dụ:

class Main {
    // Thuộc tính
    int id;
    String name;
    // Constructor có tham số
    Main(int i, String n) {
        id = i;
        name = n;
    }
    // Phương thức
    void display(){
        System.out.println(id + " " + name);
    }
    public static void main(String args[]) {
        // Tạo đối tượng
        Main s1 = new Main(19, "Lập trình từ đầu");
        Main s2 = new Main(20, "Java");
        // Gọi phương thức
        s1.display();
        s2.display();
    }
}

Kết quả

19 Lập trình từ đầu
20 Java

2.3. Sự khác biệt giữa constructor và các phương thức khác

Với các hàm tạo phải có cùng tên với lớp mà nó được định nghĩa. Còn với phương thức khác điều này là không quan trọng, tên có thể là bất kỳ và tuân thủ theo quy tắc đặt tên.

Cùng với đó các hàm tạo sẽ không trả về giá trị nào trong khi đó các phương thức khác thì có. Đồng thời các phương thức khác trong Java sẽ trả về void nếu không trả về giá trị nào.

Các hàm tạo chỉ được gọi một lần tại thời điểm tạo Đối tượng trong khi các phương thức khác có thể được gọi bất kỳ số lần nào.

Cách sử dụng cũng khác nhau rõ ràng. Trong khi một phương thức được sử dụng để phơi bày hành vi của một đối tượng Java, thì một hàm constructor được sử dụng để khởi tạo trạng thái giống nhau.

Trình biên dịch Java không bao giờ cung cấp một phương thức. Tuy nhiên, trình biên dịch Java cung cấp một constructor mặc định nếu không có một cái nào được định nghĩa trong class.

3. Constructor Overloading trong Java

Như ta đã học về Overloading  chính là việc nạp chồng các phương thức. Cũng tương tự thì hàm tạo khi nạp chồng là một kỹ thuật trong Java. Ta có thể tạo nhiều constructor trong cùng một lớp với danh sách tham số truyền vào khác nhau. Trình biên dịch phân biệt các constructor này thông qua số lượng và kiểu của các tham số truyền vào.

Ví dụ:

class Main{
    int id;
    String name;
    int age;
    // Constructor có 2 tham số
    Main(int i,String n){
        id = i;
        name = n;
    }
    // Constructor có 3 tham số
    Main(int i, String n, int a){
        id = i;
        name = n;
        age = a;
    }
    // Phương thức
    void display(){
        System.out.println(id + " " + name + " " + age);
    }
    public static void main(String args[]){
        // Tạo đối tượng và truyền vào 2 tham số
        Main s1 = new Main(19, "Lập trình từ đầu");
        // Tạo đối tượng và truyền vào 3 tham số
        Main s2 = new Main(20, "Java", 22);
        // Gọi phương thức
        s1.display();
        s2.display();
    }
}

Kết quả

19 Lập trình từ đầu 0
20 Java 22