ฉันสับสนว่าการลบล้างแตกต่างจากการซ่อนใน Java อย่างไร ใครช่วยให้รายละเอียดเพิ่มเติมว่าสิ่งเหล่านี้แตกต่างกันอย่างไร ฉันอ่านJava Tutorialแต่โค้ดตัวอย่างยังทำให้ฉันสับสน
เพื่อให้ชัดเจนยิ่งขึ้นฉันเข้าใจการลบล้างได้ดี ปัญหาของฉันคือฉันไม่เห็นว่าการซ่อนแตกต่างกันอย่างไรยกเว้นความจริงที่ว่าหนึ่งอยู่ในระดับอินสแตนซ์ในขณะที่อีกอันอยู่ในระดับชั้นเรียน
ดูโค้ดสอน 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.");
}
}
จากนั้นเรามีคลาสย่อย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();
}
}
จากนั้นพวกเขาพูดว่า:
ผลลัพธ์จากโปรแกรมนี้มีดังนี้:
วิธีการคลาสในสัตว์
วิธีการอินสแตนซ์ใน Cat
สำหรับฉันความจริงที่ว่าการเรียกเมธอดคลาสtestClassMethod()
โดยตรงจากAnimal
คลาสเรียกใช้เมธอดในAnimal
คลาสนั้นค่อนข้างชัดเจนไม่มีอะไรพิเศษที่นั่น จากนั้นพวกเขาเรียกtestInstanceMethod()
จากการอ้างอิงถึงmyCat
ดังนั้นจึงค่อนข้างชัดเจนอีกครั้งว่าวิธีการที่ดำเนินการนั้นเป็นวิธีที่อยู่ในตัวอย่างของCat
.
จากสิ่งที่ฉันเห็นการซ่อนการโทรทำงานเหมือนกับการลบล้างดังนั้นทำไมจึงสร้างความแตกต่าง หากฉันเรียกใช้รหัสนี้โดยใช้คลาสด้านบน:
Cat.testClassMethod();
ฉันจะได้รับ:
วิธีการเรียนใน Cat
แต่ถ้าฉันลบออกtestClassMethod()
จาก Cat ฉันจะได้รับ:
เมธอดคลาสใน Animal
ซึ่งแสดงให้ฉันเห็นว่าการเขียนวิธีการแบบคงที่โดยมีลายเซ็นเดียวกับในพาเรนต์ในคลาสย่อยนั้นค่อนข้างจะลบล้างได้
หวังว่าฉันจะอธิบายให้ชัดเจนว่าฉันสับสนตรงไหนและใครบางคนสามารถส่องแสงได้ ขอบคุณมากล่วงหน้า!