Miért használjuk java programnyelvben az objektumoknál az explicit típusátalakítás (downcasting) és implicit (upcasting) típusátalakítást?
Házasságot kötött a gyerek, vezessük be a házastárs nevét.
Erre biztos van jobb példa, de eddig megúsztam nélküle.
Nem kellett? Dehogynem!
Amikor streambe írsz, akkor egy általános, Objekteket kiíró metódust használsz. Amikor a kiírottakat visszaolvasod, akkor egy Objekt jön vissza, de magától nem ismeri fel a rendszer, hogy ez mi, úgyhogy kénytelen vagy visszacastolni.
Köszönöm mindenkinek választ! Nekem az nem világos, hogy: maradjunk az állatos példánál. Van az állat osztályom(Animal), ő lesz a ősosztály és van a gyermekosztály a macska(Cat). A macska osztály örököl mindent az állat osztálytól.
Animal allat = new Animal();
Cat macska = new Cat();
Létrehoztam az adott osztályból egy objektumot, ezt értem is.
Számomra az nem világos amikor:
Animal allat2 = new Cat();
Miért akarnék az allat2-ben tárolni egy macska objektumot?
Fordítva meg végképp elvesztem a fonalat:
Animal allat3 = new Animal();
Cat macska 3 = (Cat) allat3;
Itt világos, hogy kasztolunk, az is, hogy meg kell neki mutatni, hogy milyen objektum. Az nem érthető, hogy miért nem elegendő csak simán létrehozni a macska osztályból egy macska objektumot, miért kell/lehet az előbb leírt módon, mint pl. a JPanel osztálynál a Graphics objektumnál?
Hu, kicsit hosszúra sikeredett, ha valaki ezt megválaszolná, örülnék :D Köszi előre is!
A 3-as példa helytelen, mert amit létrehoztál, az Animal, de nem Cat, így abból ClassCastException lesz.
Rég Swingeztem már, de elmékeim szerint a Graphics egy AWT osztály és semmi közük egymáshoz a JPanellel (öröklődési szinten), így nehezem hiszem, hogy egyiket a másikba kellene castolni, hacsak felhasználó fejlesztő (jelen esetben te, vagy akitől ilyen kódot látták) nem csűrt el valamit nagyon csúnyán a saját kódjában.
A Grahpics talán mintha volna néha Graphics2D-vé konvertálva...
Ebben az esetben ugyanaz érvényes, mint alább:
Az "upcasting", ahogyan előttem már írta a 2-es kolléga, akkor használatos, amikor biztos vagy egy adott példány típusában, de csak ősosztály típusként tudod valahonnan lekérni.
Egy ergya példa:
interface Animal {
˙˙˙˙void sayHello();
}
...
class Cat implements Animal {
˙˙˙˙@Override
˙˙˙˙public void sayHello() {
˙˙˙˙˙˙˙˙System.out.println("meow");
˙˙˙˙}
˙˙˙˙public void scratch() {
˙˙˙˙˙˙˙˙// No fuckin' idea
˙˙˙˙}
}
...
List<Animal> stuff = Arrays.asList(new Cat(), new Dog(), new RohadtMindegyMilyenAnimal());
...
/**
* Itt biztosak vagyunk benne, hogy stuff[0] egy Cat,
* hiszen mi tettük azt oda, ám mivel stuff típusa List<Animal>,
* a List#get metódus visszatérési értéke is Animal lesz, így castolnunk kell,
* máskülönben a Cat#scratch metódushoz nem férünk hozzá.
*/
Cat cat = (Cat) stuff.get(0);
cat.scratch();
"Miért akarnék az allat2-ben tárolni egy macska objektumot?"
Mert ez sokszor célravezetőbb. Pl. a fentebb található listába bármilyen állatot betehetek, és ahová csak Animal kell, oda mind tökéletesen meg fog felelni. Ez a polimorfizmus, ami az OO egy elég fontos tulajdonsága, ezen alapszanak a mindenhol használt absztrakciók (azokon pedig többekközt a Dependency Injection, ami simán veri a szeletelt kenyeret).
Ha szabad ajánlanom Robert C. Martintól a Clean Code: A Handbook of Agile Software Craftsmanship című könyvet, mindenképpen olvasd el, mert nemcsak sokmindenre választ ad, de rengeteg advanced dolgot is tanulhatsz belőle, amiből sokat lehet profitálni.
Szerintem ott a probléma, hogy nem érted (vagy csak nem veszed észre), hogy az osztály meg a példány az nem ugyanaz.
"Például implicitnél, miért nem csak egyszerűen örököltetjük a tulajdonságokat?"
Ilyen nincs, ha egyszer castolsz valamit, akkor azt már miből örököltetnéd?
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!