Kezdőoldal » Számítástechnika » Programozás » Mit csinál a következő kódrész...

Mit csinál a következő kódrészlet (java)? Cat myCat = new Cat () ; Animal myAnimal = (Animal) myCat;

Figyelt kérdés
Amennyiben a Cat és az Animal osztályok már megvannak írva. Az érthető, hogy a Cat osztályból példányosítok egy myCat példányt/objektumot, de az Animal -nál mi a helyzet?

2014. dec. 28. 11:47
 1/8 A kérdező kommentje:
Ebben az osztályban a main metódus létrehoz egy Cat példányt, "beteszi az Animal típusú hivatkozás alá is." ezt a "macskakörmös" részt kellene másképp leírni
2014. dec. 28. 11:50
 2/8 anonim ***** válasza:
100%

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.

2014. dec. 28. 11:51
Hasznos számodra ez a válasz?
 3/8 A kérdező kommentje:
Igen a Cat osztály az Animal osztály leszármazottja (ezt elfelejtettem leírni), most nézek példákat a leszármazott osztály metódusa elrejti a szülőosztálybelit, és a felülírásos módra; köszi a választ az első hozzászólónak és a kasztolás mit jelent?
2014. dec. 28. 11:58
 4/8 anonim ***** válasza:

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;

2014. dec. 28. 12:01
Hasznos számodra ez a válasz?
 5/8 A kérdező kommentje:
Az utolsó válasszal nem vagyok tisztában, tehát: Cat myCat = (Cat) myAnimal; vagyis a myAnimal-t kényszerítem Cat típúsúvá. De fentebb elhangzott ez a mondat: "Ősosztály típusú referenciának értékül adhatsz leszármazott osztály típusú objektumot", de ezek szerint fordítva is igaz csak akkor az ősosztály(Animal) változóit és metódusait örökli és ha van felülírás a Catban, akkor azt használja... de akkor ez a sor megegyezik a Cat myCat = new Cat(); vagyis nem egészen mert a myAnimal... wtf kicsit belebonyolódtam? a referencia fogalmát elmagyarázná valaki érthetően?
2014. dec. 28. 12:55
 6/8 anonim ***** válasza:

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.

2014. dec. 28. 15:56
Hasznos számodra ez a válasz?
 7/8 A kérdező kommentje:

[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.

2014. dec. 29. 10:52
 8/8 anonim ***** válasza:

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:

[link]

2014. dec. 29. 23:03
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!