JAVA elméleti kérdés

Kezdőlap Fórumok Programozás JAVA elméleti kérdés

10 bejegyzés megtekintése - 1-10 / 55
  • Szerző
    Bejegyzés
  • #2014494
    kelemengabor
    Felhasználó

      Valaki meg tudja mondani néhány szóban, hogy mi a különbség az extends és az implements között?

      Logikus az lenne, ha osztálytól öröklõdésre lenne az implements, interface használatára meg az extends, de ez nem világos, és azt hiszem, nem is így van…

      Egészen pontosan még azt sem értem, hogy mi a különbség az interface és az absztrakt osztály között. Talán az, hogy interfésznek minden absztrakt metódusát meg kell valósítani az általa használt osztályban, míg absztrakt osztály esetében nem? Pasz, nem tudok másra gondolni, de valahogy így sem kerek a dolog.

      [align=right][snapback]132260[/snapback][/align]

      No végre, valami olyan, amihez gondolkodnom is kell 🙂
      Szóval, konyhanyelven megfogalmazva, implements-t akkor kell használni, ha absztrakt osztályt/interfészt implementálsz, vagyis az adott osztály által megvalósított (magyarul implementált) dolgokat sorolod fel utána. Az extends meg az öröklõdésre van, azaz ez után az adott osztály õsét adod meg.

      Az interfész pedig abban különbözik az absztrakt osztálytól, hogy a metódusai kötelezõen nincsenek implementálva, míg absztrakt osztály esetén nem, azaz lehet köztük néhány, amit már megvalósítottál, de interfésznél csak specifikációk lehetnek.

      Hasznos olvasmány még ebben a témában az itt:
      http://lka.hu/home/djtaughty/
      megtalálható nemhivatalos prog2 jegyzet, nagy vonalakban benne van minden, amit a javaról elméleti szinten (legalábbis a sikeres vizsgához 🙂 ) illik tudni.

      #2014495
      Derrick
      Felhasználó

        No végre, valami olyan, amihez gondolkodnom is kell 🙂
        [align=right][snapback]132283[/snapback][/align]

        Ennek örülök. Akkor talán nem csak nekem nyûg ennek a megértése. 🙂

        A pdf-et most szedtem le, megnézem, remélem megértem a dolgokat ez alapján.

        Mutatok egy egyszerû, konkrét példát, és azon el tudom mondani, hogy mi az, amit nem értek:
        interface Gyumolcs {
          void egyedMeg(int i);
        }
        interface Alma extends Gyumolcs{
          int színe();
          void szín[code]interface Gyumolcs {
          void egyedMeg(int i);
        }
        interface Alma extends Gyumolcs{
          int színe();
          void szín

        #2014496
        kelemengabor
        Felhasználó

          A Jonatan implementálja az Alma-t, a VilmosKorte meg a Korte-t. Itt még van setét folt. Miért nem lehet itt is extends?
          [align=right][snapback]132339[/snapback][/align]

          Mert az interfészek alkotnak egy gráfot, amiben az implements segítségével helyezel el osztályokat. Az osztályok egy fát alkotnak, amiben az extends segítségével helyezed el az osztályokat, valamint az interfészek gráfjába is ezzel pakolsz újabb interfészeket. A példában a VilmosKorte osztályt a Korte interfészt megvalósító osztályként akarod elhelyezni (így találkozik az interfészgráf és a csomaghierarchia), ezért kell az implements. Az a lényeg, hogy az interfészgráf és az osztályhierarchia (nem szólva a csomaghierarchiáról, ami megint keresztbe metszi ezt a kettõt 🙂 ) két külön dolog, az elõbbi funkciója szerint inkább a tervezés eszköze, míg a másik a megvalósításé. Olvasd el a jegyzetet, abban ez mind benne van, én is abból vagyok ilyen „okos” 🙂

          #2014497
          Derrick
          Felhasználó

            Mert az interfészek alkotnak egy gráfot, amiben az implements segítségével helyezel el osztályokat. Az osztályok egy fát alkotnak, amiben az extends segítségével helyezed el az osztályokat, valamint az interfészek gráfjába is ezzel pakolsz újabb interfészeket. A példában a VilmosKorte osztályt a Korte interfészt megvalósító osztályként akarod elhelyezni (így találkozik az interfészgráf és a csomaghierarchia), ezért kell az implements. Az a lényeg, hogy az interfészgráf és az osztályhierarchia (nem szólva a csomaghierarchiáról, ami megint keresztbe metszi ezt a kettõt 🙂 ) két külön dolog, az elõbbi funkciója szerint inkább a tervezés eszköze, míg a másik a megvalósításé. Olvasd el a jegyzetet, abban ez mind benne van, én is abból vagyok ilyen „okos” 🙂
            [align=right][snapback]132348[/snapback][/align]

            Hálás köszönet a segítségért, azt hiszem, már értem. Kicsit még idegen a dolog, csináltam 1 példaprogramot a fentiek alapján saját fejbõl, küzdöttem vele, míg átláttam, de azt hiszem, már világos:

            Code:
            interface Dolgozok {
                   void addID(int i);
                   int readID();
            }

            interface Fonokok extends Dolgozok {
                   void addBeosztott(int i);
                   int readBeosztott();
            }

            class Dolgozo implements Dolgozok {
                   int ID;
                   public void addID(int i) { ID=i; }
                   public int readID() {return ID;}
            }

            class Fonok extends Dolgozo implements Fonokok {
                   int beosztott;
                   public void addBeosztott(int i) { beosztott=i; }
                   public int readBeosztott() {return beosztott;}
            }

            public class mytest {
                   public static void main (String args[]) {
                           Fonokok fonok;
                           Dolgozok beosztott;
                           fonok = new Fonok();
                           beosztott = new Dolgozo();
                           fonok.addID(1);
                           fonok.addBeosztott(3);
                           beosztott.addID(3);
                           System.out.println(„Fõnök ID: „+fonok.readID());
                           System.out.println(„Fõnök beosztottja: „+fonok.readBeosztott());
                           System.out.println(„Beosztott ID: „+beosztott.readID());
                   }
            }

            Ez így mûködik. Ami még egy picit homályos, az a típuskezelés. Ugyebár meg lehet adni típusként az interfészt is és az osztályt is, tehát írhattam volna, hogy
            Fonok fonok;
            Dolgozo beosztott;

            Ugye jól gondolom, hogy nincs különbség? Vagy a háttérben azért van?

            Még kicsit emésztem a dolgot, de jó érzés, hogy már világosodik a lényeg. Azt hiszem, már nem lesz nagy gond…

            Köszi mégegyszer, nagyon sokat segítettél!

            #2014498
            ds
            Felhasználó

              Hálás köszönet a segítségért, azt hiszem, már értem. Kicsit még idegen a dolog, csináltam 1 példaprogramot a fentiek alapján saját fejbõl, küzdöttem vele, míg átláttam, de azt hiszem, már világos:

              Ez így mûködik. Ami még egy picit homályos, az a típuskezelés. Ugyebár meg lehet adni típusként az interfészt is és az osztályt is, tehát írhattam volna, hogy
              Fonok fonok;
              Dolgozo beosztott;

              Ugye jól gondolom, hogy nincs különbség? Vagy a háttérben azért van?

              Még kicsit emésztem a dolgot, de jó érzés, hogy már világosodik a lényeg. Azt hiszem, már nem lesz nagy gond…

              Köszi mégegyszer, nagyon sokat segítettél!
              [align=right][snapback]132351[/snapback][/align]

              van különbség, bár ebben a kis példában nincsen 🙂
              ahogy kelemengabor mondta az interfacet tervezésre használjuk inkább
              ha fonok Fonok lenne a példádban akkor csak Fonok (vagy abból származtatott) objektumra tartalmazhatna referenciát, míg ha Fonokok akkor más osztályokra is akik szintén implementálják a Fonokok interfacet (pl lehetne class MásikVállalatFönöke implements Fonokok, vagy lehetne class BeosztottamIsVanMegFõnökömIs implements Fonokok, Beosztottak)

              #2014499
              Derrick
              Felhasználó

                van különbség, bár ebben a kis példában nincsen 🙂
                ahogy kelemengabor mondta az interfacet tervezésre használjuk inkább
                ha fonok Fonok lenne a példádban akkor csak Fonok (vagy abból származtatott) objektumra tartalmazhatna referenciát, míg ha Fonokok akkor más osztályokra is akik szintén implementálják a Fonokok interfacet (pl lehetne class MásikVállalatFönöke implements Fonokok, vagy lehetne class BeosztottamIsVanMegFõnökömIs implements Fonokok, Beosztottak)
                [align=right][snapback]132400[/snapback][/align]

                Aha! Ez érdekes! Mélyen el kell töprengenem, hogy ez mire jó, meg mire használatos. 🙂 Biztosan van benne értelem, különben nem találták volna ki.

                A fenti példát – az

                #2014500
                ds
                Felhasználó

                  Aha! Ez érdekes! Mélyen el kell töprengenem, hogy ez mire jó, meg mire használatos. 🙂 Biztosan van benne értelem, különben nem találták volna ki.

                  A fenti példát – az

                  #2014501
                  kampfer
                  Felhasználó

                    Sziasztok!

                    Egy Javas kérdésem van….

                    Suse Linux 8.0-n fennt van a jdk…sdk minden elméletileg ami kellen. Szeretneék egy általam írt java forrást fordítani konzolon úgy hogy ssh klienssel belépek a a webszerverre és konzolon javac paranccsal fordítom .Sajnos alap helyzetben nem ismeri fel ezta parancsot mivel meg kellen adni a path környezeti változóba hopgy hol keresse.

                    Erre lennék kíváncsi hogy ezt hol tudom megadni a suse alatt ……és azt is hogy pontosan hogyan tegyem..

                    Az is érdekel ha valami eccerûbb eset lenne java forrás fordítására webszerveren ssh (putty ) kilensen keresztül.

                    Válaszokat elõre is köszönöm: Kelemenl

                    #2014502
                    kl223
                    Felhasználó

                      Az interfész-absztrakt osztály témához: talán az picit segíti a megértést, hogy egy interfész pontosan olyan, mint egy teljesen absztrakt osztály. Azért kellett bevezetni, mert a java nem támogatja a többszörös öröklõdést, és sokszor az az egyetlen õsosztály már kötelezõen le van foglalva más miatt.

                      Ennek ellenére én azt mondom, hogy a saját muinkád megkönnyítése érdekében, a nagyon egyszerû esetektõl eltekintve inkább absztrakt osztályt használj, mivel rugalmasabb, mint egy interfész.
                      Nemrég énis így szívtam meg: írtam egy programot, amibe lehetett külsõ modulokat betenni, és egy ilyen modul egy olyan osztály volt, ami egy bizonyos interfészt megvalósított.
                      A gond akkor jelentkezett, amikor szükség lett volna néhány biztonsági óvintézkedésre: ehhez nem-absztrakt metódusok kellettek volna a modulba. (ezekkel lehetett volna azonosítani a modult) de ugye interfészben kizárólag „absztrakt” metódusok lehetnek..
                      Eredmény: 2napos szopás, hogy mindent átírjak.

                      kampfer: nem egészen értelek: hogy jön ide ssh? Nem lenne egyszerûbb, ha helyi gépen lefordítanád, majd a lefordított progit pakolnád fel a webszerverre?
                      Mind1. Nemtom, suse alatt hol van, de pl. slack alatt a /usr/lib/java/bin alatt vannak a binárisok. Továbbá nem árt beállítani a CLASSPATH környezeti változót.

                      bye!
                      kl223

                      #2014503
                      ds
                      Felhasználó

                        „Az interfész-absztrakt osztály témához: talán az picit segíti a megértést, hogy egy interfész pontosan olyan, mint egy teljesen absztrakt osztály. Azért kellett bevezetni, mert a java nem támogatja a többszörös öröklõdést, és sokszor az az egyetlen õsosztály már kötelezõen le van foglalva más miatt.”

                        Csakhogy ez nem oldja meg a problémát (egyébként nem hiszem, hogy ez gond lenne, legalábbis nekem még nem jelentett soha akadályt) ugyanis az osztály hoz(hat) magával implementációt az interface pedig nem (ahogy te is írtad).

                        „Nemrég énis így szívtam meg: írtam egy programot, amibe lehetett külsõ modulokat betenni, és egy ilyen modul egy olyan osztály volt, ami egy bizonyos interfészt megvalósított.”

                        Hát ezt pontosan úgy kell csinálni, hogy egy interface-t kell „publikálni” a fejlesztõknek, az interface „jelzi” hogy milyen metódusokat _kell_ megvalósítania a külsõ modulnak, és te is tudod, hogy miket várhatsz el. (egyébként többek között ezért találták ki az interface-t, olyan mint egy szerzõdés).

                        „A gond akkor jelentkezett, amikor szükség lett volna néhány biztonsági óvintézkedésre: ehhez nem-absztrakt metódusok kellettek volna a modulba. (ezekkel lehetett volna azonosítani a modult) de ugye interfészben kizárólag „absztrakt” metódusok lehetnek..
                        Eredmény: 2napos szopás, hogy mindent átírjak.”

                      10 bejegyzés megtekintése - 1-10 / 55
                      • Be kell jelentkezni a hozzászóláshoz.