14
Abstract osztályok és interface-ek 7-dik gyakorlat

Abstract osztályok és interface-ek - SZTE · PDF filetípust (nem minden nyelven biztonságos). Java-ban ez biztonságos, ClassCastException kivétel dobódik, ha nem jól downcast-olunk

Embed Size (px)

Citation preview

Page 1: Abstract osztályok és interface-ek - SZTE · PDF filetípust (nem minden nyelven biztonságos). Java-ban ez biztonságos, ClassCastException kivétel dobódik, ha nem jól downcast-olunk

Abstract osztályok és

interface-ek

7-dik gyakorlat

Page 2: Abstract osztályok és interface-ek - SZTE · PDF filetípust (nem minden nyelven biztonságos). Java-ban ez biztonságos, ClassCastException kivétel dobódik, ha nem jól downcast-olunk

Abstract metódusok és osztályok

Az OO fejlesztés során olyan osztályokat is kialakíthatunk,

melyeket csak továbbfejlesztésre, származtatásra lehet használni,

vele objektumpéldány nem készíthető, azonban objektum-

referencia igen.

Az osztály fejlécében az abstract kulcsszóval hozunk létre

abstract osztályt.

Page 3: Abstract osztályok és interface-ek - SZTE · PDF filetípust (nem minden nyelven biztonságos). Java-ban ez biztonságos, ClassCastException kivétel dobódik, ha nem jól downcast-olunk

Az abstract osztályok további jellegzetessége, hogy bizonyos műveletek,

amelyek szükségesek az osztály működéséhez, általában nincsenek kidolgozva

– a függvény dekralációt pontosvessző zárja és nincs törzsük.

Az ilyen metódusoknál is alkalmazni kell az abstract kulcsszót.

Ilyenkor az abstract metódusok implementációját a származtatott osztályban

kell megtenni.

Amennyiben ezt nem tesszük meg, akkor a származtatott osztálynak is

abstract-nak kell lennie!

Ha egy osztályban van abstract metódus, akkor azt az osztály fejrésznél is

jelezni kell.

Abstract osztálynak nem kötelező minden függvényének, hogy abstract

legyen.

Abstract metódus nem lehet private és final!

Abstract metódusok és osztályok

Page 4: Abstract osztályok és interface-ek - SZTE · PDF filetípust (nem minden nyelven biztonságos). Java-ban ez biztonságos, ClassCastException kivétel dobódik, ha nem jól downcast-olunk

abstract class AOsztaly{

protected int a = 12;

public abstract void kiir();

}

class BOsztaly extends AOsztaly{

protected int b;

public BOsztaly(){ b = 13; }

public void kiir(){

System.out.println( a + ” ” + b );

}

}

Abstract metódusok és osztályok

class COsztaly extends BOsztaly{

protected int c;

public COsztaly(){ c = 23; }

public void kiir(){

System.out.println(a + ” ” + b + ” ” + c );

}

}

Page 5: Abstract osztályok és interface-ek - SZTE · PDF filetípust (nem minden nyelven biztonságos). Java-ban ez biztonságos, ClassCastException kivétel dobódik, ha nem jól downcast-olunk

AOsztaly-ra hivatkozó referenciával példányosíthatunk BOsztaly

és COsztaly objektumot.

AOsztaly aoszt = new BOsztaly();

aoszt.kiir(); // a BOsztaly kiir metódusa fog meghívódni az

AOsztaly referencián keresztül.

Mivel minden osztály impliciten az Object osztályból száramzik,

megtehetjük ezt is:

Object o = new COsztaly();

( ( COsztaly ) o ).kiir(); //de itt típus-átalakítást kell végrehajtani.

Abstract metódusok és osztályok

Page 6: Abstract osztályok és interface-ek - SZTE · PDF filetípust (nem minden nyelven biztonságos). Java-ban ez biztonságos, ClassCastException kivétel dobódik, ha nem jól downcast-olunk

Upcast (ősre konvertálás): Elveszítjük a konkrét típust, de a konverzió biztonságos.

Downcast (leszármazottra konvertálás): visszanyerjük a konkrét típust (nem minden nyelven biztonságos). Java-ban ez biztonságos, ClassCastException kivétel dobódik, ha nem jól downcast-olunk.

instanceof kulcsszóval tudjuk megvizsgálni, hogy az adott referencia objektuma milyen típusú.

Object o = new COsztaly(); if ( o instanceof COsztaly ){ ((COsztaly)o).kiir(); //Downcast }

Abstract metódusok és osztályok – Futás

közbeni típusazonosítás

Page 7: Abstract osztályok és interface-ek - SZTE · PDF filetípust (nem minden nyelven biztonságos). Java-ban ez biztonságos, ClassCastException kivétel dobódik, ha nem jól downcast-olunk

Interface-ek

A Java nyelvben nincs többszörös öröklődés.

A Java fejlesztői még is lehetőséget adtak a „többszörös öröklődésre”. ( Nem

konkrét többszörös öröklődés, mint C++ nyelven. )

Interface = teljesen abstract osztály.

interface kulcsszóval hozunk létre interface-t.

Interface-ben csak konstans és public abstract metódus szerepelhet. Viszont

nem kötelező interface esetén az abstract kulcszó.

Fordításkor .class állomány jön létre.

Az interface, csak formát ad meg implementáció nélkül.

Protokollt biztosít az egyes osztályok között.

Page 8: Abstract osztályok és interface-ek - SZTE · PDF filetípust (nem minden nyelven biztonságos). Java-ban ez biztonságos, ClassCastException kivétel dobódik, ha nem jól downcast-olunk

[public] interface InterfaceName{

[public] final int konstans = érték; //kötelező inicializálni

[public] int metódus1();

[public] int metódus2();

}

Interface-ek

Page 9: Abstract osztályok és interface-ek - SZTE · PDF filetípust (nem minden nyelven biztonságos). Java-ban ez biztonságos, ClassCastException kivétel dobódik, ha nem jól downcast-olunk

Interface-ek

Osztályba való implementáláshoz az implements kulcsszót kell

használni.

class Osztaly extends OsOsztaly implements Interface1,

Interface2 …{}

Több interface használatánál vesszővel válasszuk el az interface

neveket.

Az interface-t használó osztálynak minden interface-beli

függvényt implementálni kell, különben abstract-nak kell hogy

legyen.

Page 10: Abstract osztályok és interface-ek - SZTE · PDF filetípust (nem minden nyelven biztonságos). Java-ban ez biztonságos, ClassCastException kivétel dobódik, ha nem jól downcast-olunk

Interface-ek

Miért jó az interface?

Protokollt biztosít különböző osztályok között.

Pl: Egy függvény olyan objektum példányt vár paraméterül,

amelynek az osztálya implementál egy adott interface-t. Ilyenkor

a függvénynek bármely olyan objektumot átadhatunk, amelynek

az osztálya implementálja az adott interface-t.

Page 11: Abstract osztályok és interface-ek - SZTE · PDF filetípust (nem minden nyelven biztonságos). Java-ban ez biztonságos, ClassCastException kivétel dobódik, ha nem jól downcast-olunk

Interface-ek

public interface Kiiro{ public void kiir(); }

class Egyik implements Kiiro{ public void kiir(){ System.out.println( ”Egyik” ); } }

class Masik implements Kiiro{ public void kiir(){ System.out.println( ”Masik” ); } }

class Harmadik{

public static void print( Kiiro ki ){

ki.kiir();

}

}

class Futtato{

public static void main( String[] args ){

Egyik egyik = new Egyik();

Masik masik = new Masik();

Harmadik.print( egyik );

Harmadik.print( masik );

}

}

Page 12: Abstract osztályok és interface-ek - SZTE · PDF filetípust (nem minden nyelven biztonságos). Java-ban ez biztonságos, ClassCastException kivétel dobódik, ha nem jól downcast-olunk

Gyorstalpaló kötelezőprogramhoz- Console-ról

való beolvasás.

Console-ról való beolvasáshoz a BufferedReader osztályt

használjuk. A BufferedReader konstruktorának meg kell adni egy

Reader típusú objektumot, mi most az InputStreamReader-t

adjuk meg, ennek pedig a konstruktorában meg kell mondani,

hogy honnan olvasson! Tehát:

BufferedReader reader = new BufferedReader( new

InputStreamReader( System.in ) );

Page 13: Abstract osztályok és interface-ek - SZTE · PDF filetípust (nem minden nyelven biztonságos). Java-ban ez biztonságos, ClassCastException kivétel dobódik, ha nem jól downcast-olunk

Beolvasás:

Egy karaktert: char a = (char)reader.read(); // int-et ad vissza, át

kell alakítani char-rá.

Egész sor (String):

String s = reader.readLine();

Le is kell zárni:

reader.close();

Gyorstalpaló kötelezőprogramhoz- Console-ról

való beolvasás.

Page 14: Abstract osztályok és interface-ek - SZTE · PDF filetípust (nem minden nyelven biztonságos). Java-ban ez biztonságos, ClassCastException kivétel dobódik, ha nem jól downcast-olunk

A beolvasáshoz szükség lenne a kivételkezelésre, de ezt meg is tudjuk kerülni. Hátránya: hiba esetén nem várt mellékhatás, esetleg elszáll a program.

Ahhoz, hogy kikerüljük a kivételek kezelését, jelezni kell a függvény fejnél, hogy milyen kivételt dobhat. A beolvasás IO kivételt dobhat, tehát:

public void Beolvas() throws IOException{}

throws kulcsszóval tudjuk jelezni, hogy milyen kivétel is fordulhat elő.

Minden olyan függvényben, mely használ egy ilyen függvényt, ami kivételt dobhat, vagy le kell kezelni a kivételt, vagy ott is jelezni kell, hogy milyen kivétel várható

Gyorstalpaló kötelezőprogramhoz- Console-ról

való beolvasás.