Upcasting ve downcasting, Java'nın basit bir sözdizimi kullanarak karmaşık programlar oluşturmamızı sağlayan ve Polimorfizm veya farklı nesneleri gruplandırma gibi büyük avantajlar sağlayan önemli bir parçasıdır. Java, alt sınıf türündeki bir nesneye, herhangi bir üst sınıf türünün nesnesi gibi davranılmasına izin verir. Buna upcasting denir. Upcasting otomatik olarak yapılır, downcasting manuel olarak programcı tarafından yapılmalıdır ve ben neden böyle olduğunu açıklamak için elimden geleni yapacağım.
Upcasting ve downcasting, birinden diğerine döküm ilkelleri DEĞİLDİR ve programcı döküm nesnelerini öğrenmeye başladığında çok fazla karışıklığa neden olan şey olduğuna inanıyorum.
Çok biçimlilik: Java'daki tüm yöntemler varsayılan olarak sanaldır. Bu, miras olarak kullanıldığında herhangi bir yöntemin, nihai veya statik olarak bildirilmediği sürece geçersiz kılınabileceği anlamına gelir .
getType();
Nesne (Köpek, Evcil Hayvan, Polis Köpeği) türüne göre nasıl çalıştığını aşağıdaki örneği görebilirsiniz .
Üç köpeğiniz olduğunu varsayın
Köpek - Bu süper Sınıf.
Evcil Köpek - Evcil Köpek Köpek uzanır.
Polis köpeği - polis köpeği evcil köpek uzatır.
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";
}
}
Çok biçimlilik: Java'daki tüm yöntemler varsayılan olarak sanaldır. Bu, yöntem nihai veya statik olarak bildirilmedikçe, kalıtımda kullanıldığında herhangi bir yöntemin geçersiz kılınabileceği anlamına gelir (Açıklama, Sanal Tablolar Konseptine Aittir).
Sanal Tablo / Dağıtım Tablosu: Bir nesnenin dağıtım tablosu, nesnenin dinamik olarak bağlı yöntemlerinin adreslerini içerir. Yöntem çağrıları, yöntemin adresini nesnenin gönderim tablosundan getirerek gerçekleştirilir. Dağıtım tablosu aynı sınıfa ait tüm nesneler için aynıdır ve bu nedenle genellikle bunlar arasında paylaşılır.
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();
Baskılar Normal Dog
obj2.getType();
Baskılar Pet Dog
obj3.getType();
Baskılar Police Dog
Downcasting'in programcı tarafından manuel olarak yapılması gerekir
Eğer çağırmak çalıştığınızda secretID();
üzerinde yöntemini obj3
hangi PoliceDog object
bunlarla başvurulan Dog
hangi beri hatayı atar hiyerarşisinde bir süper sınıf obj3
erişimi yok secretId()
yöntemle. Bu yöntemi çağırmak için bu obj3'ü manuel olarak PoliceDog
( (PoliceDog)obj3).secretID();
hangi baskılar ID
Benzer şekilde dogName();
, PetDog
sınıftaki yöntemi çağırmak için , obj2'ye başvurulduğundan ve yönteme erişimi olmadığından aşağı obj2
doğru indirmeniz gerekir.PetDog
Dog
dogName();
( (PetDog)obj2).dogName();
Neden böyle, upcasting otomatik, ancak downcasting manuel olmalı? Bakın, upcasting asla başarısız olamaz. Farklı Köpekler bir grup var ve bunların türlerine bir hepsini downcast istiyorsanız, o zaman bir şans bu Köpekler bazılarının aslında farklı türlerden oldukları yani, yani var PetDog
, PoliceDog
ve süreç atma yoluyla, başarısız ClassCastException
.
Nesnelerinizi süper sınıf türüne yönlendirdiyseniz, nesnelerinizi el ile indirmeniz gerekir .
Not: Burada atıfta bulunarak, nesnelerinizin bellek adresini değiştirdiğinizde bellek adresini değiştirmediğiniz anlamına gelir, yine de aynı kalır, bu durumda bunları belirli bir türe gruplandırırsınız Dog
Dog
birAnimal
. Aşırı yüklenmiş bir yöntemi kullanmak istemediğiniz sürece çoğu zaman upcasting gereksizdir.callme
her ikisi de mevcutAnimal
veDog
.callme2
sadece çalışmasını sağlamak içinDog
yayınladığınız .a
Dog