Java programozási nyelv 4. rész Osztályok II. Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2005. szeptember A Java programozási nyelv Soós Sándor 1/17
Tartalomjegyzék Konstruktorok A múlt órai példa Az Auto3 konstruktorai Inicializációs blokkok Auto4 példa Destruktor jellegű metódusok Öröklődés, kiterjesztés Konstruktorok és az öröklődés Példa: Taxi osztály Polimorfizmus Példa polimorfizmusra: Auto3, Taxi, TaxiTest A Java programozási nyelv Soós Sándor 2/17
Konstruktorok A konstruktor a példányosításkor automatikusan lefutó programkód. Miben különbözik a metódusoktól? neve megegyezik az osztály nevével nincs visszatérési érték, void sincs! módosítóként csak a hozzáférés módosítók használhatók Több konstruktort is definiálhatunk különböző szignatúrával Ha nem definiálunk konstruktort, akkor a fordító létrehoz egyet, ami public, paraméter nélküli és a törzse üres. A this kulcsszóval hivatkozhatunk az aktuális példányra. Így elérhetjük az elfedett változó neveket, és más konstruktorokat is. A Java programozási nyelv Soós Sándor 3/17
A múlt órai példa public class Auto3 { String rendszam; String tipus; int ajtoszam; int hengerszam; int ev; int suly; int kilometer; float fogyasztas; // folytatás a következő dián A Java programozási nyelv Soós Sándor 4/17
Az Auto3 konstruktorai 1 public Auto3( String rendszam, String tipus, int ajtoszam, int hengerszam, int ev, int suly, int kilometer, float fogyasztas) { this.rendszam = rendszam; this.tipus = tipus; this.ajtoszam = ajtoszam; this.hengerszam = hengerszam; this.ev = ev; this.suly = suly; this.kilometer = kilometer; this.fogyasztas = fogyasztas; } A Java programozási nyelv Soós Sándor 5/17
Az Auto3 konstruktorai 2 public Auto3() { this( "", "", 0, 0, 0, 0, 0, 0.0f ); } public Auto3( String rendszam, String tipus) { this( rendszam, tipus, 0, 0, 0, 0, 0, 0.0f ); } A Java programozási nyelv Soós Sándor 6/17
Inicializációs blokkok Az osztálydefinícióba írt blokkok, {...} között. A változódeklarációk közé írható. Az előfordulás sorrendjében fognak lefutni. Mindig csak azok a változók használhatók, amelyek már létrejöttek. Ezek az utasítások minden konstruktor lefutása előtt végrehajtódnak. Lehetnek osztály (static) és példány inicializáló blokkok. A Java programozási nyelv Soós Sándor 7/17
Auto4 példa public class Auto4 { String rendszam; String tipus = "Citroen Xsara Picasso"; int ajtoszam; int hengerszam; int suly; { if ( tipus.equalsignorecase("citroen xsara picasso") ) { ajtoszam = 5; hengerszam = 4; suly = 1300; } } // az inicializáló blokk vége int ev;... } // az osztály definíció vége A Java programozási nyelv Soós Sándor 8/17
Destruktor jellegű metódusok A garbage collector miatt nekünk nem kell foglalkoznunk az objektumok megsemmisítésével. Olyan műveletek azonban lehetnek, amelyeket végre szeretnénk hajtani mielőtt a garbage collector megsemmisítené az objektumot. Erre szolgál a Finalize, illetve a classfinalize metódus: protected void Finalize() throws Throwable {} static void classfinalize() throws Throwable {} A Java programozási nyelv Soós Sándor 9/17
Öröklődés, kiterjesztés Egy osztályt egy meglévő osztály kiterjesztéseként definiálunk. A Java-ban minden osztály kiterjesztett, ugyanis, ha nem mondunk mást, akkor a java.lang.object osztályból származik az osztály. Az örökítést az extends kulcsszó jelzi. A leszármazott osztály rendelkezik a szülő osztály minden tagjával, de csak azokat látja, amelyekhez a szülő hozzáférést engedélyezett. A private tagokból van példánya, de nem férhet hozzájuk közvetlenül. A Java programozási nyelv Soós Sándor 10/17
Konstruktorok és az öröklődés A konstruktorokat a leszármazott nem örökli. A gyermek konstruktorának első sorában meghívhatjuk az ős bármelyik konstruktorát a super kulcsszóval. Ha ezt nem tesszük meg, a fordító akkor is meghívja a szülő paraméter nélküli konstruktorát. Ez megelőzi a gyerekben deklarált példányváltozók inicializálását és az inicializáló blokkok végrehajtását is. A Java programozási nyelv Soós Sándor 11/17
Példa: Taxi osztály public class Taxi extends Auto3 { String ceg; int kmdij; public Taxi( String rendszam, String tipus, int ajtoszam, int hengerszam, int ev, int suly, int kilometer, float fogyasztas, String ceg, int kmdij) { super( rendszam, tipus, ajtoszam, hengerszam, ev, suly, kilometer, fogyasztas ); this.ceg = ceg; this.kmdij = kmdij; } } A Java programozási nyelv Soós Sándor 12/17
Polimorfizmus Egy gyermek rendelkezik őseinek minden tulajdonságával, ezért minden környezetben használható, ahol az ős használható. Az automatikus típuskonverzió révén egy Auto3 típusú változónak értékül adható egy Taxi típusú. Ezt nevezzük polimorfizmusnak. Egy változónak van statikus és dinamikus típusa: statikus típus: ami a deklarációban szerepel (állandó) dinamikus típus: az objektum pillanatnyi típusa (változhat) A polimorfizmus a metódusok felüldefiniálása révén teljesedik ki. A Java programozási nyelv Soós Sándor 13/17
Példa polimorfizmusra: Auto3 public class Auto3 {... private int Benzinkoltseg( int km ) { System.out.println( "Benzinkoltseg-Auto3" ); return ( (int) (km * fogyasztas / 100 * BENZINAR) ); } protected int Egyebkoltseg( int km ) { System.out.println( "Egyebkoltseg-Auto3" ); return ( 0 ); } public int Utikoltseg( int km ) { System.out.println( "Utikoltseg" ); return ( Benzinkoltseg( km ) + Egyebkoltseg( km ) ); } } // az osztály vége A Java programozási nyelv Soós Sándor 14/17
Példa polimorfizmusra: Taxi public class Taxi extends Auto3 { String ceg; int kmdij; protected int Egyebkoltseg( int km ) { System.out.println( "Egyebkoltseg-Taxi" ); return ( km * kmdij ); } } // az osztály vége A Java programozási nyelv Soós Sándor 15/17
Példa polimorfizmusra: TaxiTest public class TaxiTest { public static void main( String[] args ) { Taxi egytaxi = new Taxi("IZV-186", "Picasso", 5, 4, 2003, 1300, 20000, 5.5f, "Fotaxi", 10); Auto3 egyauto = new Auto3("IZV-186", "Picasso", 5, 4, 2003, 1300, 20000, 5.5f); Auto3 kocsi; int dij; kocsi = egyauto; // vagy ez // kocsi = egytaxi; // vagy ez dij = kocsi.utikoltseg( 100 ); System.out.println( "Utikoltseg: " + dij + " Ft" ); } // a main metódus vége } // az osztály vége A Java programozási nyelv Soós Sándor 16/17
A program kimenetei Ha kocsi = egyauto: Utikoltseg Benzinkoltseg-Auto3 Egyebkoltseg-Auto3 Utikoltseg: 1375 Ft Ha kocsi = egytaxi: Utikoltseg Benzinkoltseg-Auto3 Egyebkoltseg-Taxi Utikoltseg: 2375 Ft A Java programozási nyelv Soós Sándor 17/17