Kezdőoldal » Számítástechnika » Programozás » Java nyelv. Mi a válasz és...

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?

Figyelt kérdés

2016. jan. 7. 10:04
 1/8 anonim ***** válasza:
71%

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.

2016. jan. 7. 10:11
Hasznos számodra ez a válasz?
 2/8 Piert ***** válasza:
0%
Nem. Az előző hülyeségeket beszél. Hacsak nem statikus maga a függvény is, mert a size() ugyan valóban a List interface-ből öröklődik de mivel példányszintű metódus, így a dinamikus típushoz köt ( ami arraylist jelen esetben). De ha ez még rendben is volna, akkor se fordulna mert egy absztrakt függvénynek nem feltétlenül van törzse, így pedig a fordító nem tudja értelmezni. Nem véletlen, hogy absztrakt osztályok vagy interfészek nem lehetnek dinamikus típusok.
2016. jan. 7. 19:50
Hasznos számodra ez a válasz?
 3/8 anonim ***** válasza:
100%

@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).

2016. jan. 8. 00:22
Hasznos számodra ez a válasz?
 4/8 anonim ***** válasza:
100%

#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

2016. jan. 8. 09:29
Hasznos számodra ez a válasz?
 5/8 Piert ***** válasza:
0%

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.

2016. jan. 8. 10:40
Hasznos számodra ez a válasz?
 6/8 anonim ***** válasza:
71%

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

2016. jan. 8. 10:59
Hasznos számodra ez a válasz?
 7/8 anonim ***** válasza:

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:

[link]

2016. jan. 13. 12:51
Hasznos számodra ez a válasz?
 8/8 anonim válasza:

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.

2016. febr. 12. 21:23
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!