Constructor overloading là việc một class có nhiều constructor cùng tên với class nhưng khác danh sách tham số (kiểu, số lượng, hoặc thứ tự). Khi gọi new, compiler chọn constructor khớp với argument truyền vào.
Cơ chế hoạt động giống method overloading: Java dùng kiểu tĩnh của argument tại call site để chọn signature. Nếu không có overload nào khớp chính xác, compiler áp dụng widening primitive conversion (ví dụ int thành long) trước khi báo lỗi. Nhờ vậy có thể khởi tạo object theo nhiều cách mà không cần đặt tên khác nhau.
public class Box {
public Box() { this(1, 1, 1); } // default
public Box(int size) { this(size, size, size); } // cube
public Box(int l, int w, int h) { /* ... */ }
}
new Box(); // 1×1×1
new Box(5); // 5×5×5
new Box(2, 3, 4); // 2×3×4Lỗi thường gặp: tạo hai overload chỉ khác kiểu trả về — không hợp lệ vì constructor không có kiểu trả về. Cũng không thể overload chỉ khác thứ tự nếu các tham số cùng kiểu (Box(int, int) và Box(int, int) là trùng). Khi dùng this(...) hoặc super(...), câu lệnh đó phải là câu đầu tiên trong constructor.
Lưu ý: Nếu số tham số nhiều hoặc có nhiều tổ hợp optional, đừng nhồi quá nhiều constructor; dùng Builder pattern hoặc record (Java 16+) sẽ rõ ràng hơn.