Constructor trong Java là phương thức đặc biệt được gọi tự động khi tạo đối tượng từ class. Khác với method thông thường, constructor không có kiểu trả về và phải trùng tên với class chứa nó. Vai trò chính của constructor là khởi tạo giá trị ban đầu cho các thuộc tính của đối tượng ngay khi object được tạo ra.
Constructor Java là gì?
Đặc điểm nhận diện constructor
Constructor có ba đặc điểm cốt lõi giúp phân biệt với method thông thường:
Tên trùng với class. Nếu class có tên Student, constructor phải là Student(). Quy tắc này bắt buộc và không có ngoại lệ.
Không khai báo kiểu trả về. Constructor không dùng void, int hay bất kỳ kiểu dữ liệu nào. Compiler tự hiểu constructor trả về instance của class hiện tại.
Được gọi tự động. Khi dùng từ khóa new, JVM tự động gọi constructor phù hợp. Developer không cần gọi thủ công như method thông thường.
public class Student { String name; int age; // Constructor - không có kiểu trả về, trùng tên class public Student(String name, int age) { this.name = name; this.age = age; } } // Tạo object - constructor được gọi tự động Student student = new Student("An", 20);
Hai loại constructor cơ bản
Default constructor
Default constructor không nhận tham số đầu vào. Nếu developer không viết constructor nào, Java compiler tự động tạo một default constructor với thân rỗng.
public class Product { String name; double price; // Default constructor do compiler tạo tự động (nếu không khai báo) public Product() { // Các thuộc tính nhận giá trị mặc định // name = null, price = 0.0 } }
Giá trị mặc định phụ thuộc kiểu dữ liệu: số nguyên nhận 0, số thực nhận 0.0, boolean nhận false, object reference nhận null.
⚠️ Lưu ý: Khi đã khai báo bất kỳ constructor nào có tham số, compiler sẽ không tự động tạo default constructor. Lúc này nếu cần default constructor, phải khai báo thủ công.
Parameterized constructor
Constructor trong Java có tham số cho phép truyền giá trị khởi tạo cụ thể khi tạo object. Đây là cách phổ biến để đảm bảo object luôn có trạng thái hợp lệ ngay từ đầu.
public class Account { String username; String email; // Parameterized constructor public Account(String username, String email) { this.username = username; this.email = email; } } // Tạo object với giá trị cụ thể Account acc = new Account("john_doe", "john@example.com");
Từ khóa this phân biệt giữa tham số constructor và thuộc tính instance khi chúng trùng tên.
Ví dụ minh họa cho hàm Constructor mặc định
Constructor overloading
Constructor overloading cho phép tạo nhiều constructor trong cùng class với danh sách tham số khác nhau. Compiler phân biệt các constructor dựa vào số lượng và kiểu dữ liệu tham số.
public class Rectangle { double width; double height; // Constructor không tham số - tạo hình vuông đơn vị public Rectangle() { this.width = 1.0; this.height = 1.0; } // Constructor một tham số - tạo hình vuông public Rectangle(double side) { this.width = side; this.height = side; } // Constructor hai tham số - tạo hình chữ nhật public Rectangle(double width, double height) { this.width = width; this.height = height; } }
Kỹ thuật này tăng tính linh hoạt khi khởi tạo object theo nhiều cách khác nhau, phù hợp với từng ngữ cảnh sử dụng.
Đoạn code demo Constructor Overloading trong Java
Constructor chaining
Constructor chaining là kỹ thuật gọi constructor này từ constructor khác trong cùng class hoặc từ class cha. Java cung cấp hai từ khóa:
this() gọi constructor khác trong cùng class. Phải đặt ở dòng đầu tiên trong constructor.
super() gọi constructor của class cha. Cũng phải đặt ở dòng đầu tiên.
public class Employee { String name; int id; String department; // Constructor đầy đủ public Employee(String name, int id, String department) { this.name = name; this.id = id; this.department = department; } // Constructor rút gọn - gọi constructor đầy đủ public Employee(String name, int id) { this(name, id, "General"); // Gọi constructor 3 tham số } }
Constructor chaining giảm code trùng lặp và đảm bảo logic khởi tạo nhất quán.
Constructor Chaining trong Java là gì?
So sánh constructor và method
| Tiêu chí | Constructor | Method |
|---|---|---|
| Mục đích | Khởi tạo object | Thực hiện hành động |
| Tên | Trùng với class | Tùy ý đặt |
| Kiểu trả về | Không có | Bắt buộc có |
| Cách gọi | Tự động qua new |
Gọi thủ công qua object |
| Tạo tự động | Có (default) | Không |
| Kế thừa | Không được kế thừa | Được kế thừa |
Constructor không thể kế thừa vì tên phải trùng class, trong khi class con có tên khác class cha. Tuy nhiên class con có thể gọi constructor cha qua super().
Access modifier với constructor
Constructor trong Java hỗ trợ đầy đủ access modifier để kiểm soát phạm vi tạo object:
public cho phép tạo object từ bất kỳ đâu. Đây là modifier phổ biến nhất.
protected giới hạn trong cùng package và các subclass.
private chặn tạo object từ bên ngoài class. Thường dùng trong Singleton pattern hoặc factory pattern.
Default (không modifier) chỉ cho phép tạo object trong cùng package.
public class DatabaseConnection { private static DatabaseConnection instance; // Private constructor - ngăn tạo object từ bên ngoài private DatabaseConnection() { // Khởi tạo kết nối } // Factory method để lấy instance duy nhất public static DatabaseConnection getInstance() { if (instance == null) { instance = new DatabaseConnection(); } return instance; } }
Các tác vụ nâng cao trong constructor
Constructor có thể thực hiện mọi logic mà method thông thường làm được:
Validation dữ liệu đầu vào để đảm bảo object luôn ở trạng thái hợp lệ.
public class BankAccount { private double balance; public BankAccount(double initialBalance) { if (initialBalance < 0) { throw new IllegalArgumentException("Số dư không được âm"); } this.balance = initialBalance; } }
Khởi tạo resource như mở file, kết nối database, hoặc tạo thread.
Gọi method khác để thực hiện logic phức tạp.
⚠️ Lưu ý: Tránh logic quá phức tạp trong constructor. Nếu khởi tạo có thể thất bại, cân nhắc dùng factory method thay vì constructor.
Câu hỏi thường gặp
Constructor có trả về giá trị không?
Constructor không khai báo kiểu trả về nhưng ngầm định trả về instance của class hiện tại. Đây là lý do có thể gán kết quả của new cho biến.
Có thể dùng return trong constructor không?
Có thể dùng return; (không giá trị) để thoát sớm khỏi constructor, nhưng không thể return một giá trị cụ thể.
Constructor có thể là static không?
Không. Constructor luôn gắn với instance cụ thể, trong khi static thuộc về class. Hai khái niệm này mâu thuẫn nhau.
Khi nào nên dùng constructor chaining?
Dùng khi có nhiều constructor với logic khởi tạo tương tự nhau. Constructor đơn giản gọi constructor phức tạp hơn với giá trị mặc định, tránh lặp code.
Constructor là nền tảng của lập trình hướng đối tượng trong Java. Hiểu rõ cách hoạt động và các kỹ thuật liên quan giúp viết code sạch, dễ bảo trì và ít lỗi hơn.
Cập nhật lần cuối 14/03/2026 by Hiếu IT
