+2 امتیاز
قبل در برنامه نویسی توسط (467 امتیاز)
ویرایش شده قبل توسط

سلام. لطف کنید به کد زیر دقت کنید:

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 پاک کنیم، باید با خطای کامپایل مواجه بشیم. ممنون.

1 پاسخ

+3 امتیاز
قبل توسط (365 امتیاز)
انتخاب شده قبل توسط
 
بهترین پاسخ

پولیمورفیسم و Dynamic Binding فقط مربوط به متدها است. در مورد فیلدها ما پولیمورفیسم و dynamic binding نداریم. به عبارت دیگر، در مورد فیلدها (متغیرهای کلاس) نوع واقعی شیء مهم نیست و فقط نوع رفرنس شیء مهم است. در واقع پولیمورفیسم یعنی «رفتار» شیء در زمان اجرا bind میشود و رفتار شیء هم یعنی مجموعه متدهای آن (نه فیلدهای آن). اصلاً همنام تعریف کردن فیلدها هم رایج و خوب نیست و override کردن برای فیلدها معنی ندارد.

مثلاً این دو کلاس را ببینید:

 

class Parent{
	String s = "Parent";
}
class Child extends Parent{
	String s = "Child";
}

حالا حاصل اجرا این قطعه کد:

		Parent p = new Parent();
		Parent p2c = new Child();
		Child c = new Child();
		System.out.println(p.s);
		System.out.println(p2c.s);
		System.out.println(c.s);

 

این گونه خواهد بود:

Parent
Parent
Child

سؤال خیلی خوبی بود!

سوالات مشابه

0 امتیاز
1 پاسخ 570 بازدید
+1 امتیاز
2 پاسخ 3.3هزار بازدید
0 امتیاز
1 پاسخ 495 بازدید
0 امتیاز
1 پاسخ 825 بازدید
+2 امتیاز
1 پاسخ 780 بازدید
+1 امتیاز
1 پاسخ 691 بازدید
...