280 likes | 383 Views
4. gyakorlat. Osztályok Garbage collection. Osztályok. Osztály írása. általában minden osztálynak vannak adattagjai és/vagy metódusai adattagok megadása: [láthatóság] [static] [final] [transient] [volatile] típus változóNév metódusok megadása:
E N D
4. gyakorlat Osztályok Garbage collection
Osztály írása • általában minden osztálynak vannak adattagjai és/vagy metódusai • adattagok megadása: • [láthatóság] [static] [final] [transient] [volatile] típusváltozóNév • metódusok megadása: • [láthatóság] [static] [abstract] [final] [native] [synchronized] visszatérésiTípusmetódusNév ([paraméterek]) [throws kivételLista]
Példa osztály írására osztálynév: mindig nagy kezdőbetűvel! public class Alma{ private int tomeg; private String szin; public void leesik(){ System.out.println(„Potty!”); } } • ezt így nem tudom futtatni, mert nincs benne main függvény! az osztály attribútumai az osztály metódusa
Példa osztály írására public class Program{ public static void main(String[] args){ Alma a = new Alma(); a.leesik(); } } • 1 fájlba általában 1 osztályt írunk (public class-ból pedig szigorúan csak 1 lehet!) meghívódik a konstruktor meghívódik az „a” objektum leesik metódusa
Még egy példa publicclass Pont { // adattagok private int x; private int y; publicdoubletavolsag(Pont p) { doubletav; // távolságot számoló kód… returntav; } }
Láthatóság • az adattagok és a metódusok láthatóságát korlátozni kell • az OO egyik fontos eleme az implementáció elrejtése: a használó használhatja anélkül, hogy pontosan ismerné, mi van benne • hogy ki mit érhet el, azt a láthatóság beállításával szabhatjuk meg • ha nem adunk meg láthatóságot, az alapértelmezett a packageprivate/”friendly” • ez csomagon belül public, egyébként private • nincsen kulcsszava!
Láthatóság • a láthatóság lehet még: • public: mindenkinek mindent megenged • private: csak az az osztály használhatja, amiben létrehozták • az adattagok általában private láthatóságúak • protected: az adott osztály és annak gyerekosztályai használhatják • a main függvény mindig public (különben a futtató környezet sem férne hozzá)
Konstruktor • különleges metódus • garantálja az inicializálást az objektum létrejöttekor • neve meg kell hogy egyezzen az osztály nevével • visszatérési típusa nem lehet • új objektum létrehozásakor hívódik meg • általában az adattagok inicializálásáért felelős kódot helyezzük a törzsébe • általában public láthatóságú
Default konstruktor • ha a konstruktornak nincsen paramétere, akkor default konstruktornak nevezzük (ellenkező esetben paraméteres konstruktornak) • alapértelmezett beállításokkal rendelkező objektum létrehozására használjuk • ha semmilyen konstruktort nem készítünk, akkor a fordító készít egy default-ot • ha viszont akár paraméteres, akár pataméter nélküli konstruktort készítünk, akkor nem jön létre default
Példa konstruktorra • Default: public Pont() { x = 0; y = 0; } • Paraméteres: public Pont(int xKoord, int yKoord) { x = xKoord; y = yKoord; }
Overloading • operáció kiterjesztése/overloading: ugyanaz a neve, de más a paraméterlista • pl. a konstruktorok esetén • de nemcsak konstruktorokat lehet kiterjeszteni, pl.: public void kortRajzol(){…}; public void kortRajzol(int sugar){…}; public void kortRajzol(int sugar, int x, int y){…};
Static kulcsszó • Adattag esetén: ugyanazon a helyen tárolódik az összes példány ugyanaz lesz az adattag értéke bármely objektumpéldány esetén • Pl.: Alma osztály adattagja legyen:private static int tomeg; minden Alma típusú objektum tömege ugyanannyi lesz • a static adattag objektumpéldány nélkül is létezik
Static kulcsszó • Metódus esetén: nem kell objektumpéldányt létrehozni ahhoz, hogy meg tudjuk hívni • Pl.: public static void main(), Integer.parseInt() • nem lehet felüldefiniálni! • Statikus környezetből csak statikus adattagok érhetők el
Final kulcsszó • adattag esetén: nem változtathatja meg az értékét (adnunk kell neki kezdőértéket!) • Pl.: private static final int tomeg = 10; • metódusok esetén: gyerekosztályban nem lehet felüldefiniálni • Pl.: public final leesik(){…} • minden private metódus impliciten final
Final kulcsszó • osztály esetén: nem lehet gyerekosztálya • Pl.: final class Alma{…} • minden metódusa impliciten final • nem primitív típusra használva nem az objektum lesz konstans, hanem a referencia
Konstans • valódi konstans létrehozása: static és final kulcsszavakkal • kezdőértékük nem változtatható meg • nevüket csupa nagy betűvel kell írni, szóhatáron aláhúzásjellel elválasztva • Pl.: publicstaticfinal int TOMEG = 10; • elérése: publicclass Ember { publicstaticfinalbooleanFERFI=true; } … //elérés az osztályon kívülről: Ember.FERFI
Getter és setter metódusok • az adattagok későbbi (konstruálás utáni) beállítására (setter) illetve lekérdezésére (getter) szolgálnak • elnevezésre vonatkozó szabályok: • getter: getAdattagNeve • setter: setAdattagNeve
Példa getter/setter metódusokra • az Alma osztály tömeg adattagjához tartozó getter és setter: public int getTomeg(){ return tomeg; } public void setTomeg(int ujTomeg){ tomeg = ujTomeg; }
Példa getter/setter metódusokra • A Kutya osztály fajtiszta adattagjához tartozó getter és setter (az adattag logikai típusú): public boolean isFajtiszta(){ return fajtiszta; } public void setFajtiszta(boolean fajtiszta){ this.fajtiszta = fajtiszta; }
This kulcsszó • hivatkozás az aktuális objektumra • mikor használjuk? • ha egy metódus formális paraméterének neve megegyezik egy attribútum nevével • Pl.: public Pont(int x, int y) { this.x = x; this.y = y; }
Garbagecollection • Objektumok élete Javában: • heap-en keletkeznek (ellentétben a primitív típusokkal) • létrehozás (new kulcsszó) • Felszabadítás: automatikus, a garbage collector (szemétgyűjtő) végzi • null kulcsszó: azt jelöli, hogy az adott referencia nincs beállítva semmilyen objektumra
Példa Pont p1 = new Pont(6, 15); Pont p2 = new Pont(); ... p1 = null; … P2 = null;
Objektumorientáltság, OO paradigma • egységbezárás és információ elrejtése (absztrakt adattípus) • adatok és a rajtuk végzett műveletek egységbezárása osztályok írása • öröklődés • polimorfizmus (többalakúság)
Példaprogram • Ember.java (pub) • Alma.java (honlapom) • PrivatEmber.java (pub, 5. hétnél) • PEMain.java (pub, 5. hétnél)
Gyakorló feladatok • pub: feladat.txt (4. gyakorlat könyvtára)
Szorgalmi feladat • szerda éjfélig küldhető el 2 pluszpontért nekem e-mailben • feladat: • Írj olyan osztályt, ami egy szobát reprezentál, a szobáról legyen eltárolva a területe és a belmagassága. • Írj paraméteres konstruktort, ami a mezőket inicializálja. • Írj getter és setter metódusokat az adattagokhoz. • Írj az órai minta alapján „info” metódust a Szoba osztályhoz. • Írj újabb osztályt, ami futtatható, és a parancssori paramétereknek megfelelően létrehoz egy objektumot a Szoba osztályból.
Szorgalmi feladat • Pl.: java Szoba 15 2 15 m2 területű, 2 m belmagasságú szobát hozunk létre • Emellett a futtatható osztályban hozz létre egy „lakas” nevű tömböt is, ami 10 szobát tartalmaz • a 10 szoba területe egy véletlen szám 5 és 15 között, a belmagasságuk pedig 50-50% eséllyel 2 ill. 3 méter • A létrehozott Szoba objektumok jellemzőit az „info” metódus segítségével írasd ki a konzolra.