การ upcasting และ downcasting เป็นส่วนสำคัญของ Java ซึ่งช่วยให้เราสามารถสร้างโปรแกรมที่ซับซ้อนโดยใช้ไวยากรณ์ง่าย ๆ และให้ประโยชน์ที่ยอดเยี่ยมแก่เราเช่น Polymorphism หรือการจัดกลุ่มวัตถุต่าง ๆ Java อนุญาตให้วัตถุประเภท subclass จะถือว่าเป็นวัตถุประเภท superclass ใด ๆ สิ่งนี้เรียกว่าการถ่ายทอดสด การอัพแคสต์จะกระทำโดยอัตโนมัติในขณะที่นักดาวน์ไลท์จะต้องทำเองโดยโปรแกรมเมอร์และฉันจะอธิบายให้ดีที่สุดว่าทำไมมันถึงเป็นเช่นนั้น
การ upcasting และ downcasting นั้นไม่เหมือนกับการทำการแคสติ้งแบบดั้งเดิมจากที่หนึ่งไปยังอีกที่หนึ่งและฉันเชื่อว่านั่นเป็นสิ่งที่ทำให้เกิดความสับสนมากเมื่อโปรแกรมเมอร์เริ่มเรียนรู้การคัดเลือกวัตถุ
ความหลากหลาย: วิธีการทั้งหมดใน java เป็นเสมือนโดยค่าเริ่มต้น นั่นหมายความว่าวิธีการใด ๆ สามารถแทนที่เมื่อนำมาใช้ในการรับมรดกเว้นแต่วิธีการที่ถูกประกาศเป็นครั้งสุดท้ายหรือคง
คุณสามารถดูตัวอย่างด้านล่างวิธีการgetType();
ทำงานตามประเภทของวัตถุ (สุนัขสัตว์เลี้ยงสุนัขตำรวจ)
สมมติว่าคุณมีสุนัขสามตัว
Dog - นี่คือ Super Class
สัตว์เลี้ยงสุนัข - สุนัขสัตว์เลี้ยงขยายสุนัข
Police Dog - Dog Police ขยาย Dog Pet
public class Dog{
public String getType () {
System.out.println("NormalDog");
return "NormalDog";
}
}
/**
* Pet Dog has an extra method dogName()
*/
public class PetDog extends Dog{
public String getType () {
System.out.println("PetDog");
return "PetDog";
}
public String dogName () {
System.out.println("I don't have Name !!");
return "NO Name";
}
}
/**
* Police Dog has an extra method secretId()
*/
public class PoliceDog extends PetDog{
public String secretId() {
System.out.println("ID");
return "ID";
}
public String getType () {
System.out.println("I am a Police Dog");
return "Police Dog";
}
}
ความหลากหลาย: วิธีการทั้งหมดใน java เป็นเสมือนโดยค่าเริ่มต้น ซึ่งหมายความว่าวิธีการใด ๆ สามารถแทนที่ได้เมื่อใช้ในการสืบทอดเว้นแต่ว่าวิธีการนั้นจะถูกประกาศเป็นขั้นสุดท้ายหรือคงที่ (คำอธิบายเป็นแนวคิดของตารางเสมือนจริง)
ตารางเสมือน / ตารางส่งข้อมูล: ตารางส่งของวัตถุจะมีที่อยู่ของวิธีการผูกแบบไดนามิกของวัตถุ การเรียกเมธอดจะดำเนินการโดยดึงที่อยู่ของเมธอดจากตารางการจัดส่งของวัตถุ ตารางการจัดส่งจะเหมือนกันสำหรับวัตถุทั้งหมดที่อยู่ในระดับเดียวกันและโดยทั่วไปจะใช้ร่วมกันระหว่างพวกเขา
public static void main (String[] args) {
/**
* Creating the different objects with super class Reference
*/
Dog obj1 = new Dog();
` /**
* Object of Pet Dog is created with Dog Reference since
* Upcasting is done automatically for us we don't have to worry about it
*
*/
Dog obj2 = new PetDog();
` /**
* Object of Police Dog is created with Dog Reference since
* Upcasting is done automatically for us we don't have to worry
* about it here even though we are extending PoliceDog with PetDog
* since PetDog is extending Dog Java automatically upcast for us
*/
Dog obj3 = new PoliceDog();
}
obj1.getType();
พิมพ์ Normal Dog
obj2.getType();
พิมพ์ Pet Dog
obj3.getType();
พิมพ์ Police Dog
โปรแกรมเมอร์ต้องทำด้วยตนเอง
เมื่อคุณพยายามที่จะเรียกใช้secretID();
เมธอดobj3
ที่PoliceDog object
อ้างถึงDog
ซึ่งเป็นคลาสระดับสูงในลำดับชั้นมันจะพ่นข้อผิดพลาดเนื่องจากobj3
ไม่มีการเข้าถึงsecretId()
เมธอด ในการที่จะเรียกใช้เมธอดนั้นคุณจำเป็นต้อง Downcast ที่ obj3 ด้วยตนเอง PoliceDog
( (PoliceDog)obj3).secretID();
ซึ่งพิมพ์ ID
ในทำนองเดียวกันกับเรียกdogName();
วิธีการในPetDog
ระดับที่คุณต้องเศร้าใจobj2
ไปPetDog
ตั้งแต่ obj2 มีการอ้างอิงไปDog
และไม่ได้มีการเข้าถึงdogName();
วิธีการ
( (PetDog)obj2).dogName();
ทำไมเป็นเช่นนั้นการอัพคาสต์จึงเป็นไปโดยอัตโนมัติ แต่การดาวน์สตรีมจะต้องทำด้วยตนเอง คุณจะเห็นว่าการอัปสต์ไม่อาจล้มเหลวได้ แต่ถ้าคุณมีกลุ่มของสุนัขที่แตกต่างกันและต้องการที่จะเศร้าใจพวกเขาทั้งหมดเพื่อประเภทของพวกเขาแล้วมีโอกาสที่บางส่วนของสุนัขเหล่านี้เป็นจริงที่แตกต่างกันเช่น, PetDog
, และกระบวนการล้มเหลวโดยการขว้างปาPoliceDog
ClassCastException
นี่คือเหตุผลที่คุณจำเป็นต้องdowncast วัตถุของคุณด้วยตนเองหากคุณได้อ้างอิงวัตถุของคุณเป็นประเภทซุปเปอร์คลาส
หมายเหตุ: ที่นี่โดยการอ้างอิงหมายความว่าคุณไม่ได้เปลี่ยนที่อยู่หน่วยความจำของ oject ของคุณเมื่อคุณ downcast มันยังคงเหมือนเดิมคุณเพียงแค่จัดกลุ่มให้เป็นประเภทเฉพาะในกรณีนี้ Dog
Dog
Animal
เวลาในการถ่ายทอดข้อมูลส่วนใหญ่นั้นไม่จำเป็นเว้นแต่ว่าคุณต้องการใช้วิธีการโอเวอร์โหลดที่แน่นอนcallme
ที่มีอยู่ทั้งในและAnimal
มีอยู่เฉพาะในที่คุณนำมาใช้เพื่อให้ทำงานได้Dog
callme2
Dog
a
Dog