Saya membaca tentang mengganti dan menyembunyikan metode di situs web docs.Oracle.com (https://docs.Oracle.com/javase/tutorial/java/IandI/override.html). Di bawah judul 'Metode Statis', Oracle dengan senang hati merangkumnya untuk kami:
"Perbedaan antara menyembunyikan metode statis dan mengganti metode instan mempunyai implikasi penting:
- Versi metode instance yang diganti yang dipanggil adalah versi yang ada di subkelas.
- Versi metode statis tersembunyi yang dipanggil bergantung pada apakah metode tersebut dipanggil dari superkelas atau subkelas."
Poin pertama sangat jelas. Poin kedua juga terkesan sangat informatif, namun saat saya membacanya kembali, sepertinya saya menjadi bingung.
Dari sudut pandang saya, sepertinya setiap metode statis di superkelas dan subkelas disembunyikan, dan dengan pengikatan awal (pengikatan waktu kompilasi), metode yang sesuai dipilih dan metode lainnya disembunyikan. Ini dipilih berdasarkan tipe referensi dari variabel tempat Anda memanggilnya. Namun rumusan kalimat pada poin kedua membuat seolah-olah kompiler memperlakukan kedua metode ini sebagai satu karena keduanya memiliki tanda tangan yang sama, dan memiliki versi super dan versi sub, dibandingkan harus memisahkan metode tersembunyi dan memilih yang sesuai. .
pertanyaan saya adalah yang mana dari dua sudut ini yang benar (kedua metode disembunyikan atau satu metode dengan dua versi karena tanda tangan metode), dan apakah penting yang mana yang saya pikirkan? bonus: apakah pemikiran umum saya tentang subjek ini benar?
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