Ngày 1: Sử dụng Polymorphism trong OOP.
Polymorphism là một trong những nguyên lý cốt lõi của OOP. Nó cho phép một đối tượng có thể nhận nhiều hình thức. Trong Java, Polymorphism được đạt được thông qua việc kế thừa và giao diện (interfaces).
Ví dụ chi tiết:
Giả sử chúng ta có hai lớp `Dog` và `Cat` cả hai đều kế thừa từ lớp `Animal`. Trong lớp `Animal` có một phương thức `makeSound()`. Lớp `Dog` và `Cat` cần phải triển khai phương thức này theo từng đặc điểm của chúng.
“`java
public abstract class Animal {
public abstract void makeSound();
}
public class Dog extends Animal {
public void makeSound() {
System.out.println(“Bark”);
}
}
public class Cat extends Animal {
public void makeSound() {
System.out.println(“Meow”);
}
}
“`
Sau khi tạo các đối tượng từ lớp `Dog` và `Cat`, chúng ta có thể gọi đến phương thức `makeSound()` mà không cần biết đối tượng thực sự thuộc lớp nào. Đây chính là cơ chế Polymorphism.
“`java
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.makeSound(); // Outputs: Bark
myCat.makeSound(); // Outputs: Meow
}
}
“`
Dưới góc nhìn performance, Polymorphism tăng sự linh hoạt và giảm sự phụ thuộc giữa các module code. Nhưng lợi ích lớn nhất có thể là khả năng tái sử dụng code và dễ dàng mở rộng.
5 câu hỏi phỏng vấn:
1. Làm thế nào để tạo một lớp Polymorphic trong Java?
2. Mô tả một ví dụ về ứng dụng của Polymorphism?
3. Lợi ích chính của Polymorphism là gì?
4. Điểm khác biệt giữa Polymorphism tĩnh và Polymorphism động là gì?
5. Khi nào nên sử dụng interfaces và khi nào nên sử dụng abstract classes?
Câu trả lời:
1. Bằng cách tạo một superclass (hoặc interface) và cho các subclasses (hoặc lớp cụ thể) kế thừa (hoặc implement) phương thức của superclass/interface.
2. Ví dụ đã giải thích ở trên, sử dụng Animal, Dog và Cat class.
3. Tăng khả năng tái sử dụng code và dễ dàng mở rộng.
4. Polymorphism tĩnh diễn ra trong compile time (VD: Method Overloading), còn Polymorphism động diễn ra trong runtime (VD: Method Overriding).
5. Nên sử dụng interfaces khi muốn đảm bảo rằng các lớp không liên quan cùng triển khai chung một số phương thức, và sử dụng abstract classes khi muốn chia sẻ code giữa các lớp có quan hệ chung.