Tôi bối rối về việc ghi đè khác với ẩn trong Java như thế nào. Bất cứ ai có thể cung cấp thêm chi tiết về cách chúng khác nhau? Tôi đã đọc Hướng dẫn Java nhưng mã mẫu vẫn khiến tôi bối rối.
Nói rõ hơn, tôi hiểu rõ việc ghi đè. Vấn đề của tôi là tôi không thấy ẩn có bất kỳ sự khác biệt nào, ngoại trừ thực tế là một cái ở cấp cá thể trong khi cái kia ở cấp lớp.
Nhìn vào mã hướng dẫn Java:
public class Animal {
public static void testClassMethod() {
System.out.println("Class" + " method in Animal.");
}
public void testInstanceMethod() {
System.out.println("Instance " + " method in Animal.");
}
}
Sau đó, chúng tôi có một lớp con Cat
:
public class Cat extends Animal {
public static void testClassMethod() {
System.out.println("The class method" + " in Cat.");
}
public void testInstanceMethod() {
System.out.println("The instance method" + " in Cat.");
}
public static void main(String[] args) {
Cat myCat = new Cat();
Animal myAnimal = myCat;
Animal.testClassMethod();
myAnimal.testInstanceMethod();
}
}
Sau đó, họ nói:
Kết quả từ chương trình này như sau:
Phương thức lớp trong Animal.
Phương thức instance trong Cat.
Đối với tôi, việc gọi một phương thức lớp testClassMethod()
trực tiếp từ Animal
lớp thực thi phương thức trong Animal
lớp là khá rõ ràng, không có gì đặc biệt ở đó. Sau đó, họ gọi testInstanceMethod()
từ tham chiếu tới myCat
, vì vậy một lần nữa khá rõ ràng rằng phương thức được thực thi sau đó là phương thức trong trường hợp của Cat
.
Theo những gì tôi thấy, ẩn cuộc gọi hoạt động giống như ghi đè, vậy tại sao lại có sự khác biệt đó? Nếu tôi chạy mã này bằng các lớp ở trên:
Cat.testClassMethod();
Tôi sẽ nhận được:
Phương thức lớp trong Cat.
Nhưng nếu tôi xóa testClassMethod()
khỏi Cat, thì tôi sẽ nhận được:
Phương thức lớp trong Animal.
Điều này cho tôi thấy rằng việc viết một phương thức tĩnh, với cùng chữ ký như trong lớp cha, trong một lớp con thực hiện ghi đè khá nhiều.
Hy vọng rằng tôi đang làm rõ nơi tôi đang bối rối và ai đó có thể làm sáng tỏ. Cảm ơn rất nhiều trước!