Mit csinál a következő kódrészlet (java)? Cat myCat = new Cat () ; Animal myAnimal = (Animal) myCat;
A Cat osztály gondolom az Animal osztály leszármazottja. Ez fontos infó.
Ősosztály típusú referenciának értékül adhatsz leszármazott osztály típusú objektumot, ez történik ebben a sorban:
Animal myAnimal = myCat;
Elvileg kasztolni nem is kéne szerintem.
A lényeg, hogy a myAnimal referenciát a továbbiakban nem Cat-ként, hanem Animal-ként kezeled, tehát csak az Animal osztályban is elérhető metódusait hívhatod.
Ennek pölö ott van jelentősége, hogy ha nyilván akarsz tartani Cat és Dog objektumokat is, akkor megteheted egy Animal típusú listában/tömbben.
A kasztolás a típuskényszerítés. A te kódodban ebben a sorban van:
Animal myAnimal = (Animal) myCat;
CÉLTÍPUS ref = (CÉLTÍPUS) obj;
Ezt igazából pont fordított esetben szokás inkább használni, pölö amikor tudod, hogy a myAnimal egy Cat, akkor megteheted ezt:
Cat myCat = (Cat) myAnimal;
Minden változóban a változó típusnak leszármazottaiból készült objektumokat tudod tárolni. Tehát egy Animal változónak értékül adhatsz Cat, Dog... objektumokat.
Ezt azért teheted meg, mert az összes osztály, ami az Animalt kiterjeszti kompatibilis az Animallal, hiszen ugyanazok a metódusok megvannak a leszármazottakban is (persze felül lehet definiálni őket, de attól még "kívülről" ugyanolyanok (ugyanazok a paraméterek, a visszatérési érték kompatibilis...)), ezáltal minden amit megtehetsz az Animallal, azt megteheted a Cat-tel is.
Azaz ezt megteheted:
Cat myCat = new Cat();
Animal myAnimal = myCat;
mivel ugye egy cicát kezelhetsz nyugodtan állatként is.
Ahogy írtad fordítva is van ilyesmi. Vannak olyan esetek, amikor szükség van arra, hogy cast-oljunk. Ez a fenti példa fordítottja, azaz egy ős típusú változó értékét PRÓBÁLJUK meg betenni egy leszármazottéba. Tehát vmi ilyesmi:
Animal myAnimal;
...
Cat myCat = (Cat) myAnimal;
Mint látod ebben az esetben szükség van cast-olásra (ez a zárójelben levő Cat). Ez azért szükséges, hogy felhívja a figyelmünket arra, hogy lehet, hogy az Animalban nem egy cica van (hanem pl. egy kígyó), és ugye a kígyót nem lehet belerakni egy Cat változóba (mivel a Snake nem terjeszti ki a Cat-et), ekkor egy ClassCastException keletkezik. Ha egy cica van a változóban akkor hiba nélkül végbemegy a castolás.
Nagyon fontos: attól, hogy egy objektumot különféle típusú változókban tárolsz, nem fog másként viselkedni, csupán annyi a különbség, hogy kevesebb dolgot tudsz vele csinálni.
[Ez a Superclass.java]
public class Superclass {
public boolean aVariable;
public void aMethod() {
aVariable = true;
System.out.println("Superclass: " + aVariable);
}
public static void main(String[] args) {
Subclass tester = new Subclass(); //.1
Superclass pelda = (Superclass) tester; //.2
Superclass pelda2 = new Superclass(); //.3
Subclass tester2 = (Subclass) pelda; //.4
System.out.print("1. ");
tester.aMethod();
System.out.println();
System.out.print("2. ");
pelda.aMethod();
System.out.println();
System.out.print("3. ");
pelda2.aMethod();
System.out.println();
System.out.print("4. ");
tester2.aMethod();
System.out.println();
}
}
[Ez a Subclass.java]
public class Subclass extends Superclass {
public boolean aVariable; // hides aVariable in Superclass
public void aMethod() { // overrides aMethod in Superclass
aVariable = false;
System.out.print("super.aMethod(): ");
super.aMethod();
/*System.out.println(aVariable);
System.out.println(super.aVariable);*/
System.out.println("Subclass: " + aVariable);
System.out.println("Sublclass(super.aVariable): " + super.aVariable);
}
}
[Console - Kimenet]
1. super.aMethod(): Superclass: true
Subclass: false
Sublclass(super.aVariable): true
2. super.aMethod(): Superclass: true
Subclass: false
Sublclass(super.aVariable): true
3. Superclass: true
4. super.aMethod(): Superclass: true
Subclass: false
Sublclass(super.aVariable): true
[Kérdés]: Engem a második pont érdekelne, ahol a Subclass tester-ét Superclas-á alakítóm pelda objektummá, de a Subclass metódusát íratja ki mégis, gondolom a felülírás miatt, mert ez egy példánymetódus volt, DE a boolean változó is csak példányváltozó azt mégsem írja felül(mert ugye a példánymetódus-változókat felül lehet írni. Ha osztálymetódus-változókat(static) akarok felülírni, akkor azokat elvileg csak elrejteni tudom az ősosztályban.
Most meglepődtem, én is azt hittem eddig, hogy a változók is felülíródnak, de nem. Nem ajánlatos használni ezt, sok bajt okozhat.
Egy hasonló kérdés, érdemes megnézni:
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, 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!