Phương thức khởi tạo (Constructor)
Mỗi lớp trong Java có một phương thức đặc biệt được gọi là constructor, dùng để khởi tạo đối tượng khi nó được tạo ra bằng từ khóa new.
public class Nguoi {
String ten;
int tuoi;
// Constructor mặc định (không tham số)
public Nguoi() {
// Logic khởi tạo mặc định
}
// Constructor có tham số
public Nguoi(String ten, int tuoi) {
this.ten = ten;
this.tuoi = tuoi;
}
}
Nếu bạn định nghĩa một constructor có tham số, bạn phải định nghĩa rõ ràng constructor không tham số nếu cần.
Kế thừa (Inheritance)
Từ khóa super dùng để tham chiếu đến lớp cha.
super()gọi constructor của lớp cha, phải là câu lệnh đầu tiên trong constructor của lớp con.superchỉ có thể được sử dụng trong các phương thức và constructor của lớp con.supervàthiskhông thể cùng gọi constructor.
Sự khác biệt giữa this và super:
this: Tham chiếu đến đối tượng hiện tại.super: Tham chiếu đến lớp cha.this: Có thể sử dụng trong các lớp không có kế thừa.super: Chỉ có thể sử dụng trong các lớp có kế thừa.
Về constructor:
this(): Gọi constructor của lớp hiện tại.super(): Gọi constructor của lớp cha.
// Lớp cơ sở
public class Nguoi {
protected String ten = "Trần Văn A";
public Nguoi() {
System.out.println("Constructor của lớp Nguoi");
}
public void inThongTin() {
System.out.println("Đây là phương thức của lớp Nguoi");
}
}
// Lớp con kế thừa từ Nguoi
public class SinhVien extends Nguoi {
private String ten = "Lê Văn B";
public SinhVien() {
// super() được gọi ngầm định và phải ở dòng đầu tiên
System.out.println("Constructor của lớp SinhVien");
}
@Override
public void inThongTin() {
System.out.println("Đây là phương thức của lớp SinhVien");
}
public void test() {
inThongTin(); // Gọi phương thức của lớp con
this.inThongTin(); // Gọi phương thức của lớp con
super.inThongTin(); // Gọi phương thức của lớp cha
}
public void testTen(String ten) {
System.out.println(ten); // Biến cục bộ
System.out.println(this.ten); // Biến của lớp con
System.out.println(super.ten); // Biến của lớp cha
}
}
Ghi đè phương thức (Method Overriding)
Ghi đè phương thức xảy ra khi một lớp con cung cấp một triển khai cụ thể cho một phương thức đã được định nghĩa trong lớp cha.
- Tên phương thức phải giống nhau.
- Danh sách tham số phải giống nhau.
- Phạm vi truy cập: Có thể mở rộng (ví dụ:
protectedcó thể ghi đèdefault). - Loại ngoại lệ: Phạm vi có thể thu hẹp nhưng không được mở rộng.
Mục đích của ghi đè là khi chức năng của lớp cha không phù hợp hoặc không đủ cho lớp con.
Đa hình (Polymorphism)
Đa hình là khả năng một phương thức có thể có nhiều hành vi khác nhau tùy thuộc vào đối tượng được truyền vào.
- Đa hình áp dụng cho phương thức, không áp dụng cho thuộc tính.
- Chỉ có lớp cha và lớp con có mối quan hệ kế thừa mới có thể ép kiểu.
- Điều kiện tồn tại: Kế thừa, phương thức cần được ghi đè, tham chiếu của lớp cha trỏ đến đối tượng của lớp con.
Lưu ý:
- Phương thức
staticthuộc về lớp, không thể ghi đè. - Phương thức
finallà hằng số, không thể ghi đè. - Phương thức
privatekhông thể ghi đè.
// Một đối tượng có kiểu thực tế là SinhVien
SinhVien sv = new SinhVien();
// Một tham chiếu của lớp cha có thể trỏ đến đối tượng của lớp con
Nguoi nguoi1 = new SinhVien();
Object nguoi2 = new SinhVien();
// Phương thức nào được gọi phụ thuộc vào kiểu của tham chiếu ở bên trái
nguoi1.inThongTin(); // Gọi phương thức inThongTin() của lớp SinhVien (vì đã ghi đè)
sv.inThongTin();
Giao diện (Interface)
Giao diện định nghĩa một hợp đồng mà các lớp phải tuân thủ.
- Giao diện chỉ chứa các phương thức trừu tượng và các hằng số.
- Giao diện không thể được khởi tạo, không có constructor.
- Một lớp có thể implements nhiều giao diện và phải triển khai tất cả các phương thức của chúng.
public interface DichVuNguoiDung {
// Tất cả các phương thức trong giao diện đều là trừu tượng
// Tất cả các trường trong giao diện đều là public static final
int TUOI_TOI_THIEU = 18;
void them(String ten);
void xoa(String ten);
void capNhat(String ten);
void timKiem(String ten);
}
// Lớp có thể implements giao diện
// Lớp triển khai giao diện phải ghi đè tất cả các phương thức
// Sử dụng giao diện để đạt được đa kế thừa
public class NguoiDungServiceImpl implements DichVuNguoiDung, ThoiGian {
@Override
public void them(String ten) {
System.out.println("Thêm người dùng: " + ten);
}
@Override
public void xoa(String ten) {
System.out.println("Xóa người dùng: " + ten);
}
@Override
public void capNhat(String ten) {
System.out.println("Cập nhật người dùng: " + ten);
}
@Override
public void timKiem(String ten) {
System.out.println("Tìm kiếm người dùng: " + ten);
}
@Override
public void hienThiGio() {
// Logic xử lý thời gian
}
}