Typecasting to jedna z najważniejszych koncepcji, która zasadniczo dotyczy konwersji jednego typu danych na inny typ danych w sposób ukryty lub jawny. W tym artykule omówiono koncepcję typecastingu dla obiektów.
Podobnie jak typy danych, obiekty można również rzutować na typ. Jednak w obiektach występują tylko dwa typy obiektów, tj. obiekt nadrzędny i obiekt podrzędny. Dlatego typowanie obiektów zasadniczo oznacza, że jeden typ obiektu (tj.) jest dzieckiem lub rodzicem innego. Istnieją dwa rodzaje rzutowania. Oni są:
- Upcasting: Upcasting to rzutowanie na typy obiektu podrzędnego do obiektu nadrzędnego . Upcasting można wykonać niejawnie. Przesyłanie w górę zapewnia nam elastyczność dostępu do członków klasy nadrzędnej, ale przy użyciu tej funkcji nie jest możliwy dostęp do wszystkich członków klasy podrzędnej. Zamiast wszystkich członków możemy uzyskać dostęp do niektórych określonych członków klasy potomnej. Na przykład możemy uzyskać dostęp do zastąpionych metod. Downcasting: Podobnie downcasting oznacza typografię a obiekt nadrzędny na obiekt podrzędny . Poniżanie nie może być ukryte.
Poniższy obraz ilustruje koncepcję przesyłania w górę i w dół:
kolekcja Javy
Przykład: Niech będzie klasa nadrzędna. Rodzic może mieć wiele dzieci. Weźmy pod uwagę jedno z dzieci. Dziecko dziedziczy majątek rodzica. Dlatego między dzieckiem a rodzicem istnieje relacja „jest”. Dlatego dziecko może być pośrednio podniesiony do rodzica. Jednakże rodzic może, ale nie musi, dziedziczyć majątek dziecka. Możemy jednak na siłę rzucić rodzica na dziecko, co jest tzw przygnębiający . Po jawnym zdefiniowaniu tego typu rzutowania, kompilator sprawdza w tle, czy ten typ rzutowania jest możliwy, czy nie. Jeśli nie jest to możliwe, kompilator zgłasza wyjątek ClassCastException.
Przyjrzyjmy się następującemu kodowi, aby zrozumieć różnicę:
Jawa
synchronizacja Java
// Java program to demonstrate> // Upcasting Vs Downcasting> // Parent class> class> Parent {> > String name;> > // A method which prints the> > // signature of the parent class> > void> method()> > {> > System.out.println(> 'Method from Parent'> );> > }> }> // Child class> class> Child> extends> Parent {> > int> id;> > // Overriding the parent method> > // to print the signature of the> > // child class> > @Override> void> method()> > {> > System.out.println(> 'Method from Child'> );> > }> }> // Demo class to see the difference> // between upcasting and downcasting> public> class> GFG {> > // Driver code> > public> static> void> main(String[] args)> > {> > // Upcasting> > Parent p => new> Child();> > p.name => 'techcodeview.com'> ;> > //Printing the parentclass name> > System.out.println(p.name);> > //parent class method is overridden method hence this will be executed> > p.method();> > // Trying to Downcasting Implicitly> > // Child c = new Parent(); ->błąd czasu kompilacji> > // Downcasting Explicitly> > Child c = (Child)p;> > c.id => 1> ;> > System.out.println(c.name);> > System.out.println(c.id);> > c.method();> > }> }> |
>
mój flixer
wilk kontra lis
>Wyjście
techcodeview.com Method from Child techcodeview.com 1 Method from Child>
Rysunek ilustrujący powyższy program:
Z powyższego przykładu możemy zaobserwować następujące punkty:
- Składnia przesyłania w górę:
Parent p = new Child();>
- Przesyłanie w górę zostanie wykonane wewnętrznie i dzięki temu obiekt będzie mógł uzyskać dostęp tylko do członków klasy nadrzędnej i określonych członków klasy podrzędnej (przesłonięte metody itp.), ale nie do wszystkich członków.
// This variable is not // accessible p.id = 1;>
- Składnia downcastingu:
Child c = (Child)p;>
- Rzutowanie w dół musi być wykonane zewnętrznie i dzięki temu obiekt podrzędny może uzyskać właściwości obiektu nadrzędnego.
c.name = p.name; i.e., c.name = 'techcodeview.com'>