سلام. لطف کنید به کد زیر دقت کنید:
class Animal {
String name = "Animal";
public void show() {
System.out.println("Animal");
}
}
class Dog extends Animal {
String name = "Dog";
public void show() {
System.out.println("Dog");
}
}
class Cat extends Animal {
String name = "Cat";
public void show() {
System.out.println("Cat");
}
}
public class MainApp {
public static void main(String[] args) {
}
}
همانطور که اطلاع دارید، فیلدها Override نمیشوند و Override شدن فقط مخصوص متدها است. اما در کلاسهای فوق بنده از روی عمد، فیلدها و متدها را همنام تعریف کردهام. حالا به کدهای کلاس main در زیر توجه کنید:
public class MainApp {
public static void main(String[] args) {
Animal animal = new Dog();
System.out.println(animal.name);
animal.show();
}
}
در اینجا UpCasting اتفاق افتاده است. در آموزش جاوا کاپ و در قسمت Polymorphism، چندریختی را اینطور توضیح داده است: نوع دقیق شی تعیین کنندهی رفتار شی است، نه نوع ارجاع آن. برداشت من از این جمله این است که یک شی (رفرنس) به فیلدها و متدهای کلاسی دسترسی دارد که آن شی از روی آن کلاس new شده باشد. یعنی در کد فوق، رفرنس animal، به فیلدها و متدهای کلاس Dog دسترسی باید داشته باشد. در صورتی که اینطور نیست. اگر برنامه فوق را اجرا کنید، خروجی برنامه، Animal و Dog است. یعنی فیلد کلاس Animal و اجرا کرده و چون متد ()show اصطلاحا Override شده، خروجی کلاس فرزند و نمایش میده، در صورتی که اگر متد ()show را از کلاس Dog پا کنیم، متد ()show کلاس پدر و اجرا میکنه. میشه در این مورد توضیح بدین؟ با توجه به توضیح: نوع دقیق شی تعیین کنندهی رفتار شی است، در کد بالا اگر متد ()show را از Dog پاک کنیم، باید با خطای کامپایل مواجه بشیم. ممنون.