170 likes | 289 Views
Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2005. szeptember. Java programozási nyelv 4 . rész – Osztályok II. Tartalomjegyzék. Konstruktorok A múlt órai példa Az Auto3 konstruktorai Inicializációs blokkok Auto4 példa Destruktor jellegű metódusok
E N D
Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2005. szeptember Java programozási nyelv4. rész – Osztályok II.
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
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 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
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; }
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 ); }
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.
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
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 {}
Ö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.
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.
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; } }
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.
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
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
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 program kimenetei Ha kocsi = egyAuto: Utikoltseg Benzinkoltseg-Auto3 Egyebkoltseg-Auto3 Utikoltseg: 1375 Ft Ha kocsi = egyTaxi: Utikoltseg Benzinkoltseg-Auto3 Egyebkoltseg-Taxi Utikoltseg: 2375 Ft