Upcasting vs Downcasting v Jave
Typové obsadenie je jedným z najdôležitejších konceptov, ktorý sa v podstate zaoberá konverziou jedného dátového typu na iný dátový typ implicitne alebo explicitne. V tomto článku sa diskutuje o koncepte typizácie objektov.
Rovnako ako dátové typy, aj objekty môžu byť typizované. V objektoch však existujú iba dva typy objektov, t. j. nadradený objekt a podriadený objekt. Typové obsadenie objektov teda v podstate znamená, že jeden typ objektu (t. j.) je potomkom alebo rodičom druhému. Existujú dva typy pretypovania. Oni sú:
- Upcasting: Upcasting je typové obsadenie podriadeného objektu k rodičovskému objektu . Upcasting je možné vykonať implicitne. Upcasting nám poskytuje flexibilitu prístupu k členom rodičovskej triedy, ale pomocou tejto funkcie nie je možné získať prístup ku všetkým členom triedy podriadených. Namiesto všetkých členov máme prístup k niektorým špecifikovaným členom podradenej triedy. Napríklad máme prístup k prepísaným metódam. Downcasting: Podobne, downcasting znamená pretypovanie a rodičovský objekt na podriadený objekt . Downcasting nemôže byť implicitný.
Nasledujúci obrázok ilustruje koncept upcastingu a downcastingu:
Príklad: Nech je tu rodičovská trieda. Rodičov môže byť veľa detí. Zoberme si jedno z detí. Dieťa zdedí vlastnosti rodiča. Preto existuje vzťah medzi dieťaťom a rodičom. Preto môže byť dieťa implicitne upcasted rodičovi. Rodič však môže alebo nemusí zdediť vlastnosti dieťaťa. Môžeme však násilím obsadiť rodiča dieťaťu, ktoré je známe ako downcasting . Po explicitnom definovaní tohto typu castingu kompilátor na pozadí skontroluje, či je tento typ castingu možný alebo nie. Ak to nie je možné, kompilátor vyvolá ClassCastException .
Poďme pochopiť nasledujúci kód, aby sme pochopili rozdiel:
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(); ->chyba času kompilácie> > // Downcasting Explicitly> > Child c = (Child)p;> > c.id => 1> ;> > System.out.println(c.name);> > System.out.println(c.id);> > c.method();> > }> }> |
Výkon
techcodeview.com Method from Child techcodeview.com 1 Method from Child
Ilustračný obrázok vyššie uvedeného programu:
Z vyššie uvedeného príkladu môžeme pozorovať nasledujúce body:
- Syntax funkcie Upcasting:
Parent p = new Child();
- Upcasting sa bude vykonávať interne a kvôli upcastingu má objekt povolený prístup len k členom nadradenej triedy a k špecifikovaným členom podradenej triedy (prepísané metódy atď.), ale nie ku všetkým členom.
// This variable is not // accessible p.id = 1;
- Syntax downcastingu:
Child c = (Child)p;
- Downcasting musí byť vykonaný externe a vďaka downcastingu môže podriadený objekt získať vlastnosti nadradeného objektu.
c.name = p.name; i.e., c.name = 'techcodeview.com'