Đa hình trong Java
Đa hình là khái niệm mô tả khả năng của một đối tượng để có nhiều dạng khác nhau, tùy thuộc vào ngữ cảnh sử dụng. Trong lập trình, điều này có nghĩa là các đối tượng khác nhau sẽ thực hiện hành vi theo cách riêng biệt.
Cách thức triển khai đa hình
- Hệ thống phải dựa trên cơ chế kế thừa.
- Lớp con phải ghi đè phương thức từ lớp cha.
- Sử dụng tham chiếu từ lớp cha để gọi phương thức đã được ghi đè.
// Lớp cha
public class HocVien {
public void hoc(){
System.out.println("Học viên đang học bài.");
}
}
// Lớp con A
public class A extends HocVien {
public void hoc(){
System.out.println("A đang học Toán.");
}
}
// Lớp con B
public class B extends HocVien {
public void hoc(){
System.out.println("B đang học Văn.");
}
}
// Lớp kiểm thử
public class Tester {
public static void main(String[] args) {
HocVien hv = new HocVien();
hv.hoc();
hv = new B();
hv.hoc();
hv = new A();
hv.hoc();
}
}
Trong ví dụ trên, khi thay đổi đối tượng hv, chương trình sẽ tự động gọi đúng phương thức tương ứng với đối tượng cụ thể.
Ghi đè (Override)
Phương thức của lớp con có thể ghi đè phương thức của lớp cha nếu tuân thủ các quy tắc nhất định:
- Phải trùng tên và kiểu dữ liệu trả về.
- Không được giảm quyền truy cập so với phương thức cha.
- Không thể ghi đè phương thức private hoặc static.
Liên kết tĩnh và liên kết động
Liên kết động xảy ra tại thời điểm chạy, còn liên kết tĩnh xảy ra tại thời điểm biên dịch. Liên kết động giúp xác định chính xác phương thức nào cần gọi dựa trên loại đối tượng thực tế mà tham chiếu đang trỏ đến.
Chuyển đổi lên và xuống
Chuyển đổi lên (upcasting) và chuyển đổi xuống (downcasting) cho phép bạn làm việc linh hoạt với các lớp trong hệ thống kế thừa.
// Chuyển đổi lên
HocVien hv = new A();
// Chuyển đổi xuống
if (hv instanceof A){
A a = (A) hv;
a.hoc(); // Gọi phương thức đặc thù của lớp A.
}