Java nyelv. Mi a válasz és miért, példával? Meghívható-e egy A statikus típusú, nem null referencián az A egy absztrakt metódusa?
Igen. Mert ha nem null, az azt jelenti, hogy van ott egy példány. Ha van példány, az nem lehet absztrakt. Ha nem absztrakt, akkor az absztrakt metódus implementálva van. A dinamikus kötés miatt a statikus típus lehet a dinamikus típus őse is. Tehát ha a B osztály megvalósítja az A-t, akkor egy A típusú referenciának értékül adhatsz egy B példányt. Legjobb példa erre szerintem az, ahogy a listákat használjuk:
List list = new ArrayList();
list.size();
A size() metódus a List-ben van deklarálva absztraktként.
@Piert
Te inkább arra gondolsz, hogy egy absztrakt metódust sosem tudsz meghívni (nincs törzse, nem is lehet, de magát az absztrakt classt sem tudod példányosítani, amiben van, így nincs is értelme a kérdésnek, nem?).
Ellenben az ugyanolyan nevűt (implementációt) a subclassból meg tudod hívni az A referencián, és a kérdés valószínűleg erre irányult (és ahogy az első mondta, ha nem null a referencia, az azt jelenti, hogy amire mutat, az implementálja A absztrakt metódusát).
#1 vagyok
@Piert:
"egy A statikus típusú, nem null referencián az A egy absztrakt metódusa"
Ez szerinted mit jelent, ha nem ezt?
List lista; // A=List statikus típusú
lista = new ArrayList(); // nem null referencia
lista.size(); // A=List egy absztrakt metódusa
Akkor fussunk neki mégegyszer, mert úgy látom gondok vannak:
- A kommentekben vázolt List list = new ArrayList(); deklaráció ( azon túl, hogy raw típus és emiatt nem biztonságos, noha fordul) bal oldala, vagyis a List a statikus típus, míg a jobb oldal (az ArrayList) a dinamikus. Liskov óta tudjuk, hogy egy típus helyetteíthető bármelyik leszármazottjával. De vissza a témához:
Ha van egy statikus és egy példányszintű eljárásod, akkor előbbi minden esetben a statikus típushoz ( esetünkben List), míg utóbbi mindig a dinamikus típushoz (ArrayList) fog kötni. Ez azt jelenti, hogy hiába van a List-nek és az ArrayListnek is size művelete, mivel az példánszintűként van deklarálva a List-ben, így mindig a jobboldalon lévő típus size függvényét fogja hívni a fordító.
Továbbmenve: Ahogy fentebb is írtam, absztrakt metódus nem hívható és egy olyan osztály, amely taratlmaz ilyen metódust, nem példányosítható ( pont az ilyen hibák elkerülése miatt). Ebből kifolyóan kedves első, még mindig hülyeségeket beszélsz.
Kérdező: Summázva a dolgokat, az a válaszom, hogy ilyen esetekben mindig a jobb oldalon lévő osztálybeli függvény hívódik meg, kivéve, ha osztályszintű a függvényed. És absztrakt függvényt nem tudsz hívni.
> Ez azt jelenti, hogy hiába van a List-nek és az ArrayListnek is size művelete, mivel az példánszintűként van deklarálva a List-ben, így mindig a jobboldalon lévő típus size függvényét fogja hívni a fordító.
Pontosan. Ezt mondom én is. És ennek a dolgonak az ismeretére irányul a kérdés. Amire a válasz igen, mert meghívható, ld. példa.
> Ahogy fentebb is írtam, absztrakt metódus nem hívható
Dehogynem, ott a példa. Az absztaktot hívod látszólag, de a dinamikus kötés miatt valójában az implementáció fog lefutni.
A kódban az látszik, hogy a List size() metódusa van meghívva (ld. feladat, az absztrakt), de valójában az ArrayList size() metódusa fog lefutni.
Erről szól a feladat.
> és egy olyan osztály, amely taratlmaz ilyen metódust, nem példányosítható ( pont az ilyen hibák elkerülése miatt).
Nem is mondta senki, hogy az absztrakt osztály van példányosítva. Az van a feladatban, hogy a statikus típus egy absztrakt típus, és egy nem null referenciáról beszélünk. -> Innen következik, hogy ha nem null, akkor van ott valamilyen objektum. NYILVÁNVALÓ, hogy nem az absztrakt osztály példánya, mert az értelmetlen, hanem egy azt megvalósító konkrét osztály példánya. Ezért is írtam konkrét példát, hogy látni lehessen...
Follow-up:
Azért is írtam, hogy igaz, mert lefogadtam volna, hogy BME-s szofttech vizsgáról van szó, ott ez biztosan igaz lenne.
Időközben viszont megtaláltam a kérdést, ELTE-s, meglepő módon itt is igaz:
Epilógus:
Piert ott ment félre, hogy statikus/példányszíntű metódusokról beszél, pedig ilyen nincs a kérdésben. #1-nek igaza van a megoldásban, viszont a kérdésről is lehetne vitázni, hogy egyáltalán miért kell megemlíteni benne, hogy statikus típus, mikor Java-ban nincs dinamikus típus, csak statikus. Van viszont dinamikus kötés, amit #1 is említett, bár egy kicsit ő is belekevert dinamikus típust, ami ahogy írtam nem létezik Java-ban.
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!