Constructor (Hàm Khởi Tạo)

"Trong Java, Constructor (hàm khởi tạo) là một thành phần không thể thiếu trong lập trình hướng đối tượng, giúp khởi tạo đối tượng một cách hiệu quả và linh hoạt. Dưới đây là những điều cơ bản bạn cần biết về Constructor trong Java."

Ⅰ. Constructor (Hàm khởi tạo) trong Java là gì?

Constructor (hàm khởi tạo) là một loại phương thức đặc biệt được sử dụng để khởi tạo đối tượng trong Java. Constructor có cùng tên với lớp mà nó thuộc về và không có kiểu trả về (không có void, int, v.v.).

Đặc điểm của Constructor (Hàm khởi tạo):

↳ Tên Constructor trùng với tên lớp: Đây là điểm phân biệt chính giữa constructor và các phương thức khác.

↳ Không có kiểu trả về: Constructor không có kiểu trả về, kể cả void.

↳ Tự động được gọi khi tạo đối tượng: Khi bạn tạo một đối tượng mới bằng từ khóa new, constructor tương ứng sẽ được gọi tự động để khởi tạo đối tượng đó.

Ⅱ. Các loại Constructor (Hàm khởi tạo)

Có thể có nhiều constructor khác nhau cho cùng một lớp, được phân biệt bởi số lượng và kiểu của các tham số:

↳ Constructor không có tham số (No-arg constructor)

↳ Constructor có tham số (Parameterized constructor)

Các loại Constructor trong Java - minh họa
Ảnh mô tả các loại constructor trong java.

1. Constructor không có tham số (No-arg constructor)

hay còn gọi constructor mặc đinh khi không có bất kì tham số nào được truyền vào. Được cung cấp tự động bởi trình biên dịch Java nếu bạn không định nghĩa bất kỳ constructor nào.

Cú pháp Constructor không có tham số (No-arg constructor):

Cú Pháp

Tên_Class() {
    // Constructor mặc định do trình biên dịch tự động tạo ra
}

Ví dụ: MyClass.java

public class MyClass {
    // Constructor mặc định do trình biên dịch tự động tạo ra
    MyClass(){
        System.out.println("đây là lớp học của tôi");
    }
    public static void main(String[] args) {
        MyClass myclass = new MyClass();
    }
}

Kết quả của chương trình là:

đây là lớp học của tôi

Quy tắc: Nếu không có hàm tạo (constructor) nào được định nghĩa trong một lớp, trình biên dịch Java sẽ tự động tạo ra một hàm tạo mặc định (default constructor).

Constructor không tham số được thêm bởi trình biên dịch Java - minh họa
Ảnh mô tả constructor không có tham số sẽ được thêm vào bởi trình biên dịch.

Mục đích của constructor mặc định là gì?

Hàm tạo mặc định là một loại hàm tạo đặc biệt. Nó được gọi tự động khi bạn tạo một đối tượng của lớp mà không cung cấp giá trị khởi tạo nào. Mục đích chính của hàm tạo mặc định là gán các giá trị mặc định cho các thuộc tính (property) của đối tượng mới.

Ví dụ về các giá trị mặc định:

↳ Số nguyên (int): 0

↳ Số thực (double): 0.0

↳ Kiểu logic (boolean): false

↳ Chuỗi (String): null

↳ Kiểu dữ liệu tham chiếu (reference type): null

Hàm tạo mặc định giúp bạn dễ dàng tạo các đối tượng với các giá trị khởi đầu hợp lý, đảm bảo chúng hoạt động chính xác ngay cả khi bạn không cung cấp giá trị cụ thể khi tạo.

Ví dụ: MyClass.java

public class MyClass {
    // Constructor mặc định do trình biên dịch tự động tạo ra
    int a;
    String b;
    void ThongTin(){
        System.out.println("Đây là số nguyên: "+a);
        System.out.println("Đây là một chuỗi: "+b);
    }
    public static void main(String[] args) {
        MyClass myclass = new MyClass();
        myclass.ThongTin();
    }
}

Kết quả của chương trình là:

Đây là số nguyên: 0
Đây là một chuỗi: null

Trong chương trình trên, mặc dù bạn không tạo bất kì constructor nào nhưng trình biên dịch vẫn cung cấp cho bạn một constructor mặc đinh. Giá trị 0 và null ở kết quả chương trình được cung cấp bởi constructor mặc định.

2. Constructor có tham số (Parameterized constructor)

Constructor cho phép truyền một hoặc nhiều tham số để cung cấp giá trị khởi tạo cho các thuộc tính của đối tượng. Được sử dụng để khởi tạo đối tượng với các giá trị khác nhau.

Ví dụ: MyClass.java

public class MyClass {
        int MSV;
        String Tên;
        // Constructor có tham số
        public MyClass(int a) {
            MSV = a;
            System.out.println("Mã sinh viên: "+a);
        }
        public MyClass(int a,String b) {
            MSV = a;
            Tên = b;
            System.out.println("Mã sinh viên: "+ a +" Tên: "+b);
        } 
    public static void main(String[] args) {
        MyClass myclass = new MyClass(227520004);  
        MyClass myclass1 = new MyClass(227520005,"VTD");
    }
}

Kết quả của chương trình là:

Mã sinh viên: 227520004
Mã sinh viên: 227520005 Tên: VTD

Ⅲ. Quá tải hàm khởi tạo (Constructor Overloading) trong Java

Trong lập trình Java, hàm khởi tạo (constructor) là một phương thức đặc biệt dùng để tạo và khởi tạo các đối tượng mới. Nó giống như một công thức để "nặn ra" các đối tượng thuộc về một lớp (class) nào đó.

Quá Tải Hàm Khởi Tạo (Constructor Overloading) là kỹ thuật hay ho cho phép bạn định nghĩa nhiều hàm khởi tạo khác nhau cho cùng một lớp. Mỗi hàm khởi tạo này sẽ có một danh sách tham số (parameter list) riêng, giúp bạn cung cấp các giá trị ban đầu khác nhau cho các thuộc tính (property) của đối tượng.

Cách phân biệt các hàm khởi tạo trùng tải:

Trình biên dịch Java sẽ phân biệt các hàm khởi tạo dựa vào số lượng tham số và kiểu dữ liệu của chúng.

Mỗi hàm khởi tạo cần có danh sách tham số duy nhất.

Ví dụ: MyClass.java

public class MyClass {
        int MSV;
        String Tên;
        int Tuoi;
        // Constructor có tham số
        public MyClass(int a) {
            MSV = a;
            System.out.println("Mã sinh viên: "+a);
        }
        public MyClass(int a,String b) {
            MSV = a;
            Tên = b;
            System.out.println("Mã sinh viên: "+ a +" Tên: "+b);
        }  
        public MyClass(int a,String b, int c) {
            MSV = a;
            Tên = b;
            Tuoi = c;
            System.out.println("Mã sinh viên: "+ a +" Tên: "+b+" Tuổi: "+c);
        } 

    public static void main(String[] args) {
        MyClass myclass = new MyClass(227520004);  
        MyClass myclass1 = new MyClass(227520005,"VTD");
        MyClass myclass2 = new MyClass(227520005,"VTD",27);
    }
}

Kết quả của chương trình là:

Mã sinh viên: 227520004
Mã sinh viên: 227520005 Tên: VTD
Mã sinh viên: 227520005 Tên: VTD Tuổi: 27

Ⅳ. Sao chép Constructor (Hàm khởi tạo) trong Java

Trong Java, không tồn tại khái niệm Hàm Sao Chép (copy constructor) giống như trong C++. Tuy nhiên, chúng ta có thể sao chép các giá trị từ một đối tượng này sang một đối tượng khác tương tự như Sao Chép (copy constructor) trong C++.

Các cách sao chép giá trị đối tượng trong Java:

↳ Sử dụng Constructor: Đây là một cách để sao chép giá trị trong quá trình tạo đối tượng mới.

↳ Gán Trực Tiếp: Bạn có thể gán giá trị của các thuộc tính từ một đối tượng sang một đối tượng khác.

↳ Phương thức clone(): Lớp Object cung cấp phương thức clone() để tạo ra một bản sao của đối tượng.

Ví dụ: Sao chép giá trị đối tượng bằng Constructor

Mặc dù Java không có hàm sao chép theo đúng nghĩa, bạn có thể mô phỏng hành vi sao chép bằng cách tạo một constructor mới nhận đối tượng hiện có làm tham số và gán các giá trị của nó cho đối tượng mới.

Ví dụ: MyClass.java

class SinhVien {
    String hoTen;
    int maSV;
    double diemSo;

    // Constructor bình thường
    public SinhVien(String hoTen, int maSV, double diemSo) {
        this.hoTen = hoTen;
        this.maSV = maSV;
        this.diemSo = diemSo;
    }
    // Phương thức để hiển thị thông tin sinh viên
    public void hienThiThongTin() {
        System.out.println("Họ Tên: " + hoTen);
        System.out.println("Mã SV: " + maSV);
        System.out.println("Điểm Số: " + diemSo);
    }
}
public class Main {
    public static void main(String[] args) {
        // Tạo một đối tượng SinhVien
        SinhVien sv1 = new SinhVien("Nguyen Van A", 11111, 8.5);

        // Tạo đối tượng SinhVien thứ hai với điểm số là 0
        SinhVien sv2 = new SinhVien("Nguyen Van B",22222, 0);
        // Sao điểm số của sv1 gán cho sv2
        sv2.diemSo = sv1.diemSo;

        // Hiển thị thông tin của cả hai đối tượng
        System.out.println("Thông tin sinh viên 1:");
        sv1.hienThiThongTin();

        System.out.println("\nThông tin sinh viên 2:");
        sv2.hienThiThongTin();
    }
}

Kết quả của chương trình là:

Thông tin sinh viên 1:
Họ Tên: Nguyen Van A
Mã SV: 11111
Điểm Số: 8.5

Thông tin sinh viên 2:
Họ Tên: Nguyen Van B
Mã SV: 22222
Điểm Số: 8.5

Trong ví dụ này, khi chạy chương trình bạn sẽ thấy rằng cả hai đối tượng sv1 và sv2 đều chứa cùng một điểm số là 8.5, cho thấy rằng chúng ta đã sao chép thành công các giá trị diemso từ sv1 sang sv2 bằng cách gán giá trị diemso.

Ⅴ. Sự khác nhau giữa constructor (Hàm khởi tạo) và Method (Phương thức) trong java

Constructor (Hàm khởi tạo) và Method (Phương thức) là hai thành phần quan trọng trong lập trình Java. Tuy nhiên, chúng có những đặc điểm riêng biệt:

Điểm giống nhau: Đều thuộc về lớp (class), cả constructor và method đều được định nghĩa bên trong một lớp và có thể truy cập được từ các đối tượng của lớp đó.

Điểm khác nhau:

Đặc điểmConstructorPhương thức
Mục đíchTạo và khởi tạo đối tượng mới.Thực hiện các hành động cụ thể trên đối tượng.
TênGiống tên lớp.Tự do đặt tên.
Kiểu trả vềKhông có kiểu trả về.Có thể trả về giá trị (kiểu dữ liệu) hoặc không trả về (void).
GọiTự động gọi khi tạo đối tượng mới bằng toán tử new.Gọi bằng cách sử dụng tên phương thức và đối tượng.
OverloadingCó thể trùng tải dựa vào danh sách tham số.Có thể trùng tải dựa vào danh sách tham số.
Mặc địnhCó thể có constructor mặc định do trình biên dịch tự động tạo.Không có phương thức mặc định.

Câu Nói Truyền Cảm Hứng

“Bắt đầu ở đâu không quan trọng, quan trọng là bạn sẵn sàng bắt đầu.” – W. Clement Stone

Không Gian Tích Cực

“Chúc bạn luôn giữ vững niềm tin và sức mạnh để vượt qua mọi thử thách trong cuộc sống.”