ฉันกำลังอ่านเกี่ยวกับวิธีการแทนที่และการซ่อนบนเว็บไซต์ docs.oracle.com (https://docs.oracle.com/javase/tutorial/java/IandI/override.html) ภายใต้หัวข้อ 'วิธีการแบบคงที่' Oracle กรุณาสรุปให้เราทราบ:
"ความแตกต่างระหว่างการซ่อนวิธีการแบบคงที่และการแทนที่วิธีการแบบอินสแตนซ์มีผลกระทบที่สำคัญ:
- เวอร์ชันของเมธอดอินสแตนซ์ที่ถูกแทนที่ที่ถูกเรียกใช้นั้นเป็นเวอร์ชันในคลาสย่อย
- เวอร์ชันของเมธอดสแตติกที่ซ่อนอยู่ซึ่งถูกเรียกใช้นั้นขึ้นอยู่กับว่ามันถูกเรียกใช้จากซูเปอร์คลาสหรือคลาสย่อย"
สัญลักษณ์แสดงหัวข้อย่อยแรกมีความชัดเจนมาก สัญลักษณ์แสดงหัวข้อย่อยที่สองดูเหมือนมีข้อมูลมาก แต่เมื่ออ่านซ้ำฉันรู้สึกสับสน
จากมุมมองของฉัน ดูเหมือนว่าแต่ละวิธีแบบสแตติกในทั้งซูเปอร์คลาสและคลาสย่อยจะถูกซ่อนไว้ และโดยการผูกล่วงหน้า (การรวมเวลาคอมไพล์) วิธีการที่เหมาะสมจะถูกเลือก และอีกวิธีหนึ่งจะถูกซ่อนไว้ สิ่งนี้ถูกเลือกโดยประเภทการอ้างอิงของตัวแปรที่คุณเรียกใช้ อย่างไรก็ตาม การกำหนดประโยคในสัญลักษณ์แสดงหัวข้อย่อยที่สองทำให้ดูเหมือนว่าคอมไพลเลอร์จะถือว่าทั้งสองวิธีนี้เป็นหนึ่งเดียวเนื่องจากมีลายเซ็นเดียวกัน และมีเวอร์ชัน super และเวอร์ชันย่อย ซึ่งตรงกันข้ามกับการแยกวิธีการที่ซ่อนอยู่และเลือกวิธีที่เหมาะสม .
คำถามของฉันคือมุมใดในสองมุมนี้ที่ถูกต้อง (ทั้งสองวิธีถูกซ่อนหรือวิธีเดียวที่มีสองเวอร์ชันเนื่องจากลายเซ็นของวิธีการ) และมันสำคัญไหมที่ฉันคิดเกี่ยวกับอันไหน โบนัส: ความคิดทั่วไปของฉันเกี่ยวกับเรื่องนี้ถูกต้องหรือไม่?
public class Animal {
public static void testClassMethod() {
System.out.println("The static method in Animal");
}
public void testInstanceMethod() {
System.out.println("The instance method in Animal");
}
}
public class Cat extends Animal {
public static void testClassMethod() {
System.out.println("The static 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();
}
}
//The static method in Animal
//The instance method in Cat