Trong lập trình Java, hàm Constructor đóng vai trò vô cùng quan trọng, là nền tảng cho việc tạo lập và quản lý các đối tượng. Bài viết này sẽ cung cấp tất tần tật kiến thức về hàm Constructor trong Java để giúp bạn xây dựng chương trình hiệu quả.
Tìm hiểu về Constructor trong Java
Constructor là một phương thức đặc biệt trong Java đóng vai trò quan trọng có nhiệm vụ khởi tạo và thiết lập trạng thái ban đầu cho các đối tượng. Khi bạn sử dụng từ khóa new, constructor sẽ được tự động gọi để khởi tạo một đối tượng mới, sau đó gán các thuộc tính và giá trị mặc định cho thuộc tính cũng như khởi tạo các đối tượng phụ thuộc cần thiết cho đối tượng đó.
Các quy tắc tạo Constructor trong Java
Dưới đây là các quy tắc then chốt mà bất cứ lập trình viên nào cũng phải ghi nhớ khi tạo Constructor trong Java:
- Không có kiểu trả về: Constructor không có kiểu trả về, đồng thời không thể được khai báo với các từ khóa abstract, final, static hay synchronized. Lý do nằm ở chỗ Constructor chỉ phục vụ cho mục đích khởi tạo đối tượng, không mang tính kế thừa, chỉ thuộc về đối tượng cụ thể chứ không phải lớp và không thể được gọi độc lập.
- Tên Constructor: Tên Constructor phải giống hệt tên với tên lớp chứa nó. Quy ước này giúp phân biệt Constructor với các phương thức thông thường trong Java.
3 kiểu hàm khởi tạo trong Java
1. Hàm khởi tạo mặc định
Hàm khởi tạo mặc định (hay Default constructor) là một phương thức đặc biệt được tạo ra tự động bởi Java nếu không có constructor nào được khai báo trong lớp. Đây là constructor không có tham số và có nhiệm vụ khởi tạo các thuộc tính của lớp với giá trị mặc định tương ứng: số nguyên: 0, số thực: 0.0, boolean: false, đối tượng: null
Cú pháp:
public ClassName() {
// Các câu lệnh khởi tạo
}
Ví dụ:
public class SinhVien {
private String name;
private int age;
// Default constructor
public SinhVien() {
this.name= "";
this.age= 0;
}
]
2. Hàm khởi tạo không có tham số
Hàm khởi tạo không có tham số (hay No-args constructor) là phương thức đặc biệt giúp bạn bạn kiểm soát cách khởi tạo giá trị cho các thuộc tính của một đối tượng mới. Ví dụ, bạn có thể thiết lập kết nối tới database hoặc gán giá trị mặc định cho các thuộc tính.
Đây cũng là một constructor không có tham số tương tự như hàm khởi tạo mặc định. Tuy nhiên khác với default constructor có phần mã thân (body) rỗng và không chứa câu lệnh, no-args constructor cho phép bạn viết mã khởi tạo tùy chỉnh.
Cú pháp:
public ClassName() {
// Các câu lệnh khởi tạo
}
Ví dụ:
public class SinhVien {
private String name;
private int age;
// No-args constructor
public SinhVien() {
name = "Lan";
age = 20;
}
]
Có thể thấy No-args constructor được định nghĩa cho lớp SinhVien để bạn có thể chỉ định giá trị mặc định khi khởi tạo cho các thuộc tính ten, tuoi.
3. Hàm khởi tạo có tham số
Hàm khởi tạo có tham số (hay Parameterized constructor) là phương thức đặc biệt dùng để khởi tạo đối tượng với các giá trị ban đầu được chỉ định. Đây là constructor có tham số rất hữu ích khi bạn cần truyền giá trị cụ thể cho các thuộc tính của đối tượng ngay khi tạo. Từ đó đảm bảo rằng đối tượng được khởi tạo với các trạng thái mong muốn ngay từ đầu.
Cú pháp:
public ClassName(Type1 param1, Type2 param2, …) {
// Các câu lệnh khởi tạo
}
Ví dụ:
public class SinhVien {
private String name;
private int age;
public SinhVien(String name, int age) {
this.name = name;
this.age = age;
}
}
Tìm hiểu về Constructor Overloading trong Java là gì?
Constructor overloading là một kỹ thuật quan trọng trong Java cho phép tạo nhiều constructor trong cùng một lớp với các tham số khác nhau. Nhờ vậy, lập trình viên có thể khởi tạo đối tượng một cách linh hoạt, phù hợp với từng trường hợp cụ thể.
Ví dụ: Bạn đang phát triển phần mềm quản lý nhân viên và muốn tạo 1 lớp Staff để lưu trữ thông tin của từng người. Lớp này cần có một constructor để khởi tạo đối tượng Staff với các thông tin cơ bản như tên, tuổi, giới tính và địa chỉ. Đồng thời, bạn cũng cần thêm một constructor để khởi tạo đối tượng với đầy đủ thông tin trên và thêm thông tin mức lương trung bình.
public class Staff {
String name;
int age;
String gender;
String address;
double salary;
// Constructor với thông tin cơ bản
public Staff(String name, int age, String gender, String address) {
this.name = name;
this.age = age;
this.gender = gender;
this.address = address;
}
// Constructor với tất cả thông tin
public Staff(String name, int age, String gender, String address, double salary) {
this.name = name;
this.age = age;
this.gender = gender;
this.address = address;
this.salary = salary;
}
// Getter and setter methods for all attributes
// …
}
Trong ví dụ trên, chúng ta tạo hai đối tượng staff1 và staff2 đại diện cho hai nhân viên khác nhau. Sau đó, chúng ta in ra thông tin của từng nhân viên bằng cách sử dụng các thuộc tính của đối tượng (staff1.name, staff1.age, …).
Khái niệm Copy Constructor trong Java
Copy constructor là một loại constructor đặc biệt trong Java, được sử dụng để tạo ra một bản sao chính xác của một đối tượng hiện có. Copy constructor thường được định nghĩa với 2 tham số:
- this: tham chiếu đến đối tượng mới.
- other: tham chiếu đối tượng nguồn cần sao chép.
Ngoài copy constructor, Java còn cung cấp hai phương pháp sao chép phổ biến khác là gán trực tiếp giá trị của một đối tượng cho đối tượng khác và sử dụng phương thức clone(). Tuy nhiên trong những trường hợp sau, phương thức copy constructor sẽ được ưu tiên sử dụng:
- Tạo đối tượng mới là bản sao chính xác (với các thuộc tính y hệt) của một đối tượng hiện có.
- Khi muốn thực hiện các thao tác trên đối tượng mà không ảnh hưởng đến bản gốc.
- Cần thực hiện các phép toán trên đối tượng mà không muốn thay đổi giá trị của chúng.
Ví dụ sử dụng copy constructor:
public class Car {
private String model;
private int year;
// Constructor
public Car(String model, int year) {
this.model = model;
this.year = year;
}
// Copy constructor
public Car(Car otherCar) {
this.model = otherCar.model;
this.year = otherCar.year;
}
// Getters and setters
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
}
// Main class
public class Main {
public static void main(String[] args) {
// Tạo một đối tượng Car với model là “BMW” và năm sản xuất là 2021
Car car1 = new Car(“BMW”, 2021);
// Sử dụng copy constructor để tạo một đối tượng Car mới từ car1
Car car2 = new Car(car1);
// Thay đổi model và năm sản xuất của car2
car2.setModel(“Mercedes”);
car2.setYear(2022);
// In ra model và năm sản xuất của cả hai xe
System.out.println(“Car 1: ” + car1.getModel() + “, ” + car1.getYear());
System.out.println(“Car 2: ” + car2.getModel() + “, ” + car2.getYear());
}
}
Kết quả nhận được:
Car 1: BMW, 2021
Car 2: Mercedes, 2022
Tìm hiểu kế thừa Constructor trong Java là gì
Kế thừa Constructor là cơ chế cho phép lớp con gọi constructor của lớp cha để kế thừa thuộc tính của lớp cha. Việc sử dụng từ khóa super() ở dòng đầu tiên trong constructor của lớp con sẽ giúp thực hiện điều này, đồng thời đảm bảo constructor của lớp cha được gọi trước khi khởi tạo constructor của lớp con. Nếu constructor của lớp con không sử dụng super(), trình biên dịch Java sẽ tự động gọi constructor mặc định (no-args constructor) của lớp cha.
Ví dụ:
public class Staff extends Person {
public Staff (String name, int age, String team) {
super(name,age); // gọi constructor của lớp cha Person
this.team = team; // khởi tạo thuộc tính team của lớp con Staff
}
}
Trong ví dụ trên, cú pháp super(name,age) đã được sử dụng để gọi constructor của lớp cha Person. Sau đó, khởi tạo trực tiếp thuộc tính team của lớp Student bằng biến team được truyền vào constructor.
Constructor trong Java dùng để làm gì?
Constructor đóng vai trò thiết yếu trong lập trình hướng đối tượng Java, giúp khởi tạo và gán giá trị ban đầu cho thuộc tính của các đối tượng mới.
Ví dụ:
public class XeHoi {
String ten;
String mauSac;
int namSanXuat;
// Constructor mặc định
public XeHoi() {
this.ten = "Chưa rõ";
this.mauSac = "Chưa rõ";
this.namSanXuat = 0;
}
// Constructor có tham số
public XeHoi(String ten, String mauSac, int namSanXuat) {
this.ten = ten;
this.mauSac = mauSac;
this.namSanXuat = namSanXuat;
}
}
Đoạn code này định nghĩa một lớp (class) có tên là XeHoi
để biểu diễn các đối tượng xe hơi. Mỗi đối tượng xe hơi sẽ có các thuộc tính (attributes) như tên (ten
), màu sắc (mauSac
) và năm sản xuất (namSanXuat
). Lớp XeHoi
cũng có hai constructor để khởi tạo các đối tượng xe hơi với các giá trị ban đầu khác nhau.
Trường hợp bạn tự không định nghĩa constructor nào cho một lớp thì Java sẽ tự động gọi constructor mặc định (default constructor) để gán giá trị ban đầu (mặc định thường là 0, null, …) tương ứng theo thuộc tính của đối tượng.
So sánh sự khác biệt giữa Method và Constructor trong lập trình Java
Đặc điểm | Constructor | Method |
Mục đích sử dụng | Được sử dụng để khởi tạo đối tượng và gán giá trị ban đầu cho các thuộc tính của đối tượng. | Được sử dụng để thực hiện một hành động hoặc tính toán nào đó. |
Kiểu trả về | Không có kiểu trả về (cũng không sử dụng từ khóa void ). | Có thể có hoặc không có kiểu trả về (nếu không có kiểu trả về thì sử dụng từ khóa void ). |
Cách gọi | Được gọi ngầm định khi sử dụng từ khóa new để tạo đối tượng. | Được gọi một cách tường minh thông qua tên của đối tượng và dấu chấm (. ), ví dụ: tenDoiTuong.tenPhuongThuc() .drive_spreadsheetExport to Sheets |
Tạo tự động | Trình biên dịch có sẵn một constructor mặc định nếu người dùng không tự định nghĩa | Trình biên dịch không tạo tự động mà cần được lập trình viên khai báo |
Tên | Phải trùng với tên lớp | Tự do, không cần trùng với tên lớp |
Lời kết
Trên đây là toàn bộ thông tin về constructor trong Java mà bất cứ lập trình viên nào cũng cần nắm rõ. Hy vọng rằng với những kiến thức được chia sẻ trong bài viết này, bạn đã có thể sử dụng constructor thành thạo cho các dự án của mình.