Kezdőoldal » Számítástechnika » Programozás » Nem úgy van, hogy osztály...

Nem úgy van, hogy osztály csak 1-et, interfészt viszont akármennyit lehet örököltetni Java-ban? Akkor ez itt mi?

Figyelt kérdés

Böngészgettem az interfészek használatáról a példákat a neten, mivel most szeretném elkezdeni őket használni aktívan, és itt látom hogy egy ilyen kód van:


[link]


kiemelem a lényeget:

interface Narancs extends Gyumolcs, Savanyú {

...

}


Nos, az extends az nem osztályokra vonatkozik csak, az implements pedig interfészekre? Vagy ez valami speciális eset, amikor az interfészt is extends kulcsszóval lehet örököltetni? Így tanulás közben eléggé megkavart most ez a dolog. Valamint egy kérdés: Van mondjuk ez az osztály:


class Citrom implements Gyumolcs{

public isSavanyu = true;

}

class Eper implements Gyumolcs{

public isSavanyu = false;

}

interface Gyumolcs{

public boolean isSavanyu;

}


class Main{

Eper eper = new Eper();

System.out.println(Boolean.valueOf(eper.isSavanyu);

Citrom citrom = new Citrom();

System.out.println(Boolean.valueOf(citrom.isSavanyu);

}


Ezzel tulajdonképpen jól "kihasználtam" az interfész lényegét, vagy semmit sem értem el vele csak egy fölösleges deklaráció? Bár ez így lehet nullpointer lenne mivel nem adtam kezdőértéket a Gyumolcs-nek..



2015. jún. 8. 21:43
 1/8 anonim ***** válasza:

Én is kiemelem a lényeget:

"interface Narancs extends"

"interface Narancs"


Az interface nem tud megvalósítani semmit, ezért az "implements" kulcsszó hülyeség lenne. Ezért interface-ek esetén az öröklődéshez az extends kulcsszót használjuk. Ennyi. :)


Class esetén van extends (öröklődés) és implements (interfész megvalósítás). Interface-nél csak extends (öröklődés, kiterjesztés).

2015. jún. 8. 22:02
Hasznos számodra ez a válasz?
 2/8 anonim ***** válasza:

Ez a példád pedig hibás:


class Citrom implements Gyumolcs{

public isSavanyu = true;

}

class Eper implements Gyumolcs{

public isSavanyu = false;

}

interface Gyumolcs{

public boolean isSavanyu;

}


Egyrészt interfészben nincs példányszintű adattag, másrészt ha függvényként gondoltad, akkor lemaradt a zárójel + nem valósítottad meg az osztályokban.

2015. jún. 8. 22:04
Hasznos számodra ez a válasz?
 3/8 anonim ***** válasza:

> mivel nem adtam kezdőértéket a Gyumolcs-nek


Interfésznek nem is tudnál értéked adni.

2015. jún. 8. 22:07
Hasznos számodra ez a válasz?
 4/8 anonim ***** válasza:

Bocs a floodért, de a kezdő kérdésre még nem írtam :D


> Nem úgy van, hogy osztály csak 1-et, interfészt viszont akármennyit lehet örököltetni Java-ban?


De.

- Egy osztálynak egyetlen közvetlen ősosztálya van és akármennyi interfészt megvalósíthat.

- Egy interfész akármennyi interfészt kiterjeszthet.

2015. jún. 8. 22:10
Hasznos számodra ez a válasz?
 5/8 anonim ***** válasza:

Interfészek interfésztől extends kulcsszóval örökölnek és interfészek között működik a többszörös öröklődés mert mivel nincsenek implementálva a függvények, itt nem jelent gondot a gyémánt probléma ( [link]


Az implements kulcsszóval azt mondjuk meg hogy egy interface függvényeit "implementálni" akarjuk, amit csak osztállyal lehet. A példád hibás, mert nem függvényt implementálsz hanem tagváltozót próbálsz örököltetni, amit egyrészt nem lehet interfészekkel (kivéve a konstansokat), másrészt meg nem is erre jó.


Az interfészek akkor jók ha minket nem érdekel az osztály és hogy mi van benne csak az hogy fel legyen ruházva valamilyen tulajdonságokkal, de ezt könnyebb példával illusztrálni:


class SokatTudóOsztály implements Szerializálható, Szálasítható, SzeretiAzEpret, Iterálható {

...

}


Ilyenkor egyes tulajdonságainak felhasználásakor nem érdekel mi is van valójában az osztályban, de az biztos hogy foreach-el végig tudunk rajta iterálni, külön szálon tudjuk futtatni mert implementálva van a run() függvény és akár ki is tudjuk menteni a lemezre a tartalmát szerializálással, meg amúgy is az eper finom, a citrom kevésbé.


Ezt származtatással nem lehet megcsinálni mert egy gyermeknek csak egy közvetlen szülője lehet. A kettő hasonlít de teljesen másra valók.

2015. jún. 8. 22:18
Hasznos számodra ez a válasz?
 6/8 anonim ***** válasza:

Az extends használható interface-nél, és ez az interface kiterjesztését jelenti. Némi kötekedés (ez nem a kérdezőnek szól): az interface default metódusai tartalmazhatnak megvalósítást Java 8-ban. Így lehetséges a diamond öröklés problémája, hogy meg adnod két ütköző (default-default/default-nem default) implementáció közül melyiket használja az osztály.


Az adattagoknál(mezőknél) elrejtés van, nem öröklődés mint a metódusoknál. Típust is változtathatsz, viszont feljebb nem látszik az ősosztály felől és super kulcsszóval elérhető.

2015. jún. 8. 22:37
Hasznos számodra ez a válasz?
 7/8 A kérdező kommentje:
Aha, ezt nem tudtam hogy interfészt extends kulcsszóval kell "kibővíteni". A kezdőérték adást úgy értettem, hogy először kell példányosítani a Gyumolcs interface-t is nem?
2015. jún. 9. 09:33
 8/8 anonim ***** válasza:
100%
Nem, interfészt nem tudsz példányosítani. Ahogy absztrakt osztályt sem.
2015. jún. 9. 12: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!