Trong lập trình Java, Constructor (hay Hàm khởi tạo) là một phần không thể thiếu trong việc xây dựng các đối tượng. Nếu bạn muốn làm chủ lập trình hướng đối tượng, việc hiểu rõ và sử dụng Constructor một cách thành thạo là điều rất quan trọng. Hãy cùng khám phá những đặc điểm và loại của Constructor trong Java để biết cách tận dụng tối đa tính năng này!
Xem đầy đủ về Constructor tại đây: https://interdata.vn/blog/constructor-la-gi/
Constructor Là Gì?
Constructor trong Java là một khối lệnh đặc biệt dùng để khởi tạo đối tượng. Khi một đối tượng của một lớp được tạo ra, Constructor sẽ được gọi tự động. Mục đích chính của nó là gán giá trị ban đầu cho các biến thành viên (instance variables) của đối tượng hoặc thực hiện bất kỳ thao tác thiết lập cần thiết nào khi đối tượng được tạo lập. Constructor có tên giống hệt với tên của lớp chứa nó.

Tại Sao Cần Constructor?
Constructor đóng vai trò cực kỳ quan trọng trong lập trình hướng đối tượng (OOP) bởi nó đảm bảo rằng các đối tượng luôn được tạo ra trong một trạng thái hợp lệ. Không có Constructor, một đối tượng có thể được tạo ra với các giá trị mặc định không mong muốn, dẫn đến lỗi hoặc hành vi không dự đoán được trong chương trình. Constructor giúp kiểm soát chặt chẽ quá trình khởi tạo, cung cấp các giá trị ban đầu cần thiết cho đối tượng ngay từ khi nó được sinh ra.
Ví dụ, nếu bạn có một lớp Person với các thuộc tính name và age, Constructor có thể đảm bảo rằng mọi đối tượng Person đều có tên và tuổi được thiết lập ngay lập tức, không để chúng ở trạng thái null hoặc 0.
Các Loại Constructor Phổ Biến
Trong Java, có ba loại Constructor phổ biến mà bạn sẽ thường xuyên gặp: Default Constructor, No-Argument Constructor và Parameterized Constructor. Ngoài ra, Constructor Overloading cũng là một khái niệm quan trọng.
Default Constructor (Constructor Mặc Định)
Khi bạn không định nghĩa bất kỳ Constructor nào trong một lớp, trình biên dịch Java (Java compiler) sẽ tự động thêm một Default Constructor công khai (public), không có tham số và không có thân (empty body) vào lớp đó. Constructor này được gọi là Default Constructor.
Mục đích của nó là cho phép bạn tạo đối tượng của lớp mà không cần cung cấp bất kỳ tham số nào.
Ví dụ:
Java
public class HinhTron {
double banKinh;
// Không có Constructor nào được định nghĩa
}
// Cách sử dụng:
public class Main {
public static void main(String[] args) {
HinhTron ht = new HinhTron(); // Java tự động thêm Default Constructor
System.out.println(“Bán kính mặc định: ” + ht.banKinh); // banKinh sẽ là 0.0
}
}
Khi bạn sử dụng dịch vụ như Thuê VPS như VPS AMD, bạn có thể tạo các môi trường phát triển nhanh chóng mà không cần lo lắng về cấu hình phần cứng ban đầu, tương tự như cách Default Constructor giúp bạn khởi tạo đối tượng một cách dễ dàng.
No-Argument Constructor (Constructor Không Tham Số)
Đây là một loại Constructor do người lập trình tự định nghĩa, không nhận bất kỳ tham số nào. Nó khác với Default Constructor ở chỗ nó được viết tường minh bởi lập trình viên và có thể chứa các câu lệnh khởi tạo bên trong.
Nếu bạn đã định nghĩa ít nhất một Constructor (dù là có tham số hay không tham số) trong lớp, thì trình biên dịch sẽ không tự động thêm Default Constructor nữa.
Ví dụ:
Java
public class HinhChuNhat {
double chieuDai;
double chieuRong;
// Constructor không tham số tự định nghĩa
public HinhChuNhat() {
this.chieuDai = 10.0;
this.chieuRong = 5.0;
System.out.println(“Đối tượng HinhChuNhat đã được tạo với chiều dài 10 và chiều rộng 5.”);
}
}
// Cách sử dụng:
public class Main {
public static void main(String[] args) {
HinhChuNhat hcn = new HinhChuNhat();
}
}
Việc tự định nghĩa Constructor không tham số cho phép bạn kiểm soát chính xác giá trị khởi tạo ban đầu, chẳng hạn như thiết lập một giá trị mặc định cụ thể cho chieuDai và chieuRong thay vì giá trị 0.0.
Parameterized Constructor (Constructor Có Tham Số)
Constructor có tham số là loại Constructor nhận một hoặc nhiều đối số. Các đối số này được sử dụng để gán giá trị cho các biến thành viên của đối tượng khi nó được tạo ra. Đây là cách phổ biến nhất để khởi tạo đối tượng với dữ liệu cụ thể.
Ví dụ:
Java
public class SanPham {
String tenSanPham;
double giaTien;
int soLuong;
// Constructor có tham số
public SanPham(String tenSanPham, double giaTien, int soLuong) {
this.tenSanPham = tenSanPham;
this.giaTien = giaTien;
this.soLuong = soLuong;
}
}
// Cách sử dụng:
public class Main {
public static void main(String[] args) {
SanPham laptop = new SanPham(“Laptop ABC”, 1500.0, 10);
System.out.println(“Tên sản phẩm: ” + laptop.tenSanPham);
System.out.println(“Giá tiền: ” + laptop.giaTien);
System.out.println(“Số lượng: ” + laptop.soLuong);
SanPham banPhim = new SanPham(“Bàn phím cơ”, 200.0, 50);
}
}
Constructor có tham số giúp đảm bảo rằng các đối tượng được tạo ra luôn ở trạng thái đầy đủ thông tin cần thiết ngay từ đầu. Khi bạn muốn triển khai các ứng dụng Java trên các máy chủ ảo, việc lựa chọn gói thuê VPS Windows hoặc thuê VPS Linux sẽ giúp bạn tùy chỉnh môi trường với các thông số phù hợp, tương tự như cách Constructor có tham số cho phép bạn định nghĩa các thuộc tính cụ thể cho đối tượng.
Constructor Overloading (Nạp Chồng Constructor)
Constructor Overloading là khả năng một lớp có nhiều Constructor với cùng tên (tức là tên của lớp) nhưng khác nhau về số lượng hoặc kiểu dữ liệu của các tham số. Điều này cho phép bạn tạo đối tượng bằng nhiều cách khác nhau, tùy thuộc vào dữ liệu bạn muốn cung cấp khi khởi tạo.
Ví dụ:
Java
public class Book {
String title;
String author;
int publicationYear;
// Constructor 1: Chỉ với tiêu đề và tác giả
public Book(String title, String author) {
this.title = title;
this.author = author;
this.publicationYear = 0; // Giá trị mặc định
}
// Constructor 2: Với tiêu đề, tác giả và năm xuất bản
public Book(String title, String author, int publicationYear) {
this.title = title;
this.author = author;
this.publicationYear = publicationYear;
}
}
// Cách sử dụng:
public class Main {
public static void main(String[] args) {
Book book1 = new Book(“Java Programming”, “John Doe”);
Book book2 = new Book(“Effective Java”, “Joshua Bloch”, 2018);
}
}
Trong ví dụ trên, lớp Book có hai Constructor được nạp chồng. Bạn có thể tạo một đối tượng Book chỉ với tiêu đề và tác giả, hoặc cung cấp thêm năm xuất bản. Điều này mang lại sự linh hoạt cho người sử dụng lớp.

Sự Khác Biệt Giữa Constructor Và Phương Thức (Method)
Sự khác biệt giữa Constructor và Phương thức (Method) là một điểm quan trọng trong lập trình Java mà nhiều người học thường nhầm lẫn. Mặc dù cả hai đều là các khối lệnh có thể chứa code, mục đích và cách thức hoạt động của chúng lại hoàn toàn khác nhau.
Mục Đích Khác Biệt
Đầu tiên, hãy nói về mục đích. Constructor được tạo ra với một mục đích duy nhất: khởi tạo trạng thái của một đối tượng. Điều này có nghĩa là khi bạn tạo một đối tượng mới từ một lớp bằng từ khóa new, Constructor sẽ tự động được gọi để gán các giá trị ban đầu cho các biến thành viên (instance variables) của đối tượng đó. Nó đảm bảo rằng đối tượng được “sinh ra” trong một trạng thái hợp lệ và sẵn sàng để sử dụng.
Ngược lại, một phương thức (hay còn gọi là hàm) có mục đích rộng hơn nhiều. Phương thức được sử dụng để thực hiện một hành động cụ thể hoặc một tập hợp các hành động. Nó có thể thực hiện các phép tính, thay đổi trạng thái của đối tượng, hoặc tương tác với các đối tượng khác. Một phương thức đại diện cho hành vi của đối tượng.
Tên Gọi và Cú Pháp
Một khác biệt rõ ràng khác nằm ở tên gọi và cú pháp. Tên của Constructor phải giống hệt tên của lớp chứa nó. Đây là một quy tắc bắt buộc trong Java. Ví dụ, nếu bạn có một lớp tên là SinhVien, Constructor của nó cũng phải được đặt tên là SinhVien.
Trong khi đó, tên của một phương thức có thể là bất kỳ tên hợp lệ nào tuân theo quy tắc đặt tên của Java (không trùng với từ khóa, bắt đầu bằng chữ cái thường, v.v.).
Kiểu Trả Về
Đây là một điểm khác biệt then chốt. Constructor không có bất kỳ kiểu trả về nào, kể cả void. Bạn không thể định nghĩa một kiểu trả về cho Constructor. Điều này là bởi vì Constructor không “trả về” một giá trị theo nghĩa thông thường; thay vào đó, nó chịu trách nhiệm khởi tạo và trả về chính đối tượng được tạo ra.
Ngược lại, phương thức phải có một kiểu trả về tường minh. Kiểu trả về này có thể là bất kỳ kiểu dữ liệu hợp lệ nào (ví dụ: int, String, boolean, tên một lớp khác) hoặc là void nếu phương thức không trả về bất kỳ giá trị nào.
Cách Gọi
Về cách gọi, Constructor được gọi tự động ngay khi bạn sử dụng từ khóa new để tạo một đối tượng. Bạn không cần phải gọi Constructor một cách tường minh bằng tên của nó. Ví dụ, new TenLop() sẽ tự động gọi Constructor của lớp TenLop.
Ngược lại, một phương thức phải được gọi tường minh thông qua một đối tượng (hoặc thông qua tên lớp nếu là phương thức static). Bạn sẽ sử dụng cú pháp tenDoiTuong.tenPhuongThuc() để gọi một phương thức.
Kế Thừa và Từ Khóa Khác
Constructor không được kế thừa. Khi một lớp con được tạo, nó không “thừa hưởng” Constructor của lớp cha. Thay vào đó, lớp con sẽ có Constructor riêng của mình, mặc dù Constructor của lớp cha có thể được gọi từ bên trong Constructor của lớp con bằng từ khóa super().
Phương thức thì có thể được kế thừa từ lớp cha sang lớp con. Lớp con có thể sử dụng lại phương thức của lớp cha, hoặc ghi đè (override) nó để cung cấp một triển khai riêng biệt.
Thêm vào đó, Constructor không thể được khai báo là static, final, abstract, hoặc synchronized. Chúng chỉ có thể được khai báo với các bộ điều chỉnh truy cập (access modifiers) như public, private, protected hoặc mặc định.
Trong khi đó, phương thức có thể được khai báo là static, final, abstract, hoặc synchronized, tùy thuộc vào mục đích và yêu cầu thiết kế.
Tóm lại, Constructor và phương thức phục vụ hai vai trò riêng biệt nhưng bổ sung cho nhau trong lập trình hướng đối tượng. Constructor tập trung vào việc thiết lập đối tượng, còn phương thức tập trung vào các hành động mà đối tượng có thể thực hiện. Việc hiểu rõ sự khác biệt này là nền tảng để viết code Java chính xác và hiệu quả.
Những Quy Tắc Quan Trọng Của Constructor
Để sử dụng Constructor một cách hiệu quả và tránh lỗi, bạn cần nắm vững một số quy tắc quan trọng:
Tên Constructor phải khớp với tên lớp: Đây là quy tắc cơ bản và bắt buộc. Nếu không, trình biên dịch sẽ coi nó là một phương thức thông thường chứ không phải Constructor.
Không có kiểu trả về: Constructor không bao giờ có kiểu trả về, ngay cả void.
Được gọi tự động: Constructor luôn được gọi khi đối tượng được tạo bằng từ khóa new. Bạn không thể gọi một Constructor một cách tường minh như một phương thức thông thường (ngoại trừ việc gọi this() hoặc super() bên trong một Constructor khác).
Chỉ có thể được gọi một lần: Một Constructor chỉ được gọi một lần duy nhất cho mỗi đối tượng, tại thời điểm đối tượng đó được khởi tạo.
Không thể là static: Constructor không thể là static vì nó luôn liên quan đến việc khởi tạo một thể hiện (instance) cụ thể của lớp.
Không thể là final, abstract, synchronized: Constructor không thể được khai báo với các từ khóa này vì bản chất của chúng không phù hợp với vai trò khởi tạo đối tượng. final ngăn chặn ghi đè, abstract yêu cầu triển khai bởi lớp con (nhưng Constructor không kế thừa), synchronized liên quan đến đồng bộ hóa luồng (thread synchronization) trong khi Constructor chỉ được gọi một lần duy nhất khi khởi tạo.
Có thể có access modifiers:Constructor có thể là public, private, protected hoặc mặc định. Điều này kiểm soát khả năng tạo đối tượng của lớp từ các lớp khác.
public: Có thể tạo đối tượng từ bất cứ đâu.
private: Chỉ có thể tạo đối tượng từ bên trong cùng lớp. Thường dùng trong mô hình Singleton.
protected: Có thể tạo đối tượng trong cùng package hoặc từ lớp con.
Mặc định (không có từ khóa): Chỉ có thể tạo đối tượng trong cùng package.
Việc nắm rõ các quy tắc này sẽ giúp bạn tránh các lỗi phổ biến và viết code Java chuẩn mực. Nếu bạn muốn triển khai ứng dụng Java trên một môi trường có hiệu suất cao, việc lựa chọn các dịch vụ thuê Hosting hoặc thuê Cloud Server là một giải pháp tối ưu.
Constructor là một khái niệm cơ bản nhưng vô cùng quan trọng trong lập trình hướng đối tượng với Java. Việc hiểu rõ định nghĩa, cú pháp, các loại Constructor và sự khác biệt giữa chúng với các phương thức thông thường sẽ giúp bạn xây dựng các ứng dụng Java một cách chính xác, hiệu quả và dễ bảo trì hơn. Thực hành là chìa khóa để nắm vững kiến thức này. Hãy thử tự mình viết các lớp và định nghĩa các Constructor khác nhau để củng cố sự hiểu biết.