View
217
Download
3
Category
Preview:
Citation preview
Abstract osztályok és
interface-ek
7-dik gyakorlat
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.
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
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 );
}
}
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
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
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.
[public] interface InterfaceName{
[public] final int konstans = érték; //kötelező inicializálni
[public] int metódus1();
[public] int metódus2();
}
Interface-ek
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.
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.
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 );
}
}
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 ) );
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.
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.
Recommended