Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
Objektum orientált programozás I. eddig: imperatív programozás függvények, műveletek adatokon OO alapja: objektum = adat + kód objektum jellemzői: állapot: tagváltozók értékei viselkedés: metódusok
Objektum orientált programozás II. osztály: minta a generáláshoz tagváltozók és metódusok leírása absztrakt: nem generálható, de a minta felhasználható (öröklődés) egyazon osztály objektumai: saját adat (állapot) közös metódusok (viselkedés) egyszeres öröklődés interface: többszörös öröklődés bonyodalmai elkerülve
Objektumok I. minden objektumnak meghatározott típusa van minden változó objektum-hivatkozás (referencia)! (kivéve primitív típusok) objektum létrehozásának fázisai: Point origin_one = new Point(23, 94); Rectangle rect_one = new Rectangle(origin_one, 100, 200); Rectangle rect_two = new Rectangle(50, 100); int terulet = rect_one.area(); int szelesseg = rect_one.width; Példányosítás: „new” operátorDeklarálás Inicializálás
Objektumok II. objektumok metódusait, változóit az objektumon keresztül érhetjük el: „.” operátor nem célszerű változókhoz közvetlen hozzáférést engedélyezni Point origin_one = new Point(23, 94); Rectangle rect_one = new Rectangle(origin_one, 100, 200); Rectangle rect_two = new Rectangle(50, 100); int terulet = rect_one.area(); int szelesseg = rect_one.width; tagváltozó elérése metódus hívása
Objektumok III. public class Point { public int x; // 0 public int y; // 0 public Point(int x, int y) { this.x = x; this.y = y; } class teszt { public static void main(String[] args) { Point eredeti = new Point(23, 94); Point masik = eredeti; masik.x=1000; System.out.println(eredeti.x); // 1000 } if (x instanceof Point) System.out.println("x egy pont!"); minden változó referencia:
Osztályok I. egy fájlban egy (public) class lehet! tagváltozók metódusok Konstruktor speciális metódus, létrehozza a példányt nincs visszatérési értéke cél: adat inicializálás default konstruktor: a szülőé this, super kulcsszó Destruktor ritkán használjuk finalize() explicit felszabadítás: =null, gc()
Konstruktorok public class Rectangle { public int width = 0; public int height = 0; public Point origin; Rectangle() { origin = new Point(0, 0); } public Rectangle(Point p) { origin = p; } public Rectangle(int w, int h) { this(new Point(0, 0), w, h); } public Rectangle(Point p, int w, int h) { origin = p; width = w; height = h; }
System.gc() Az objektumok felszabadításával a program futása után nem kell foglalkoznunk. A szemét gyűjtő megteszi ezt helyettünk finalize metódus (a szemétgyűjtő meghívja ezt mielőtt megszüntetné) Gyakori hibák (lehetnek): System.gc() hívás (Minden generációt ellenőriz) finalize metódus szükségtelen alkalmazása: ez esetben a szemét gyűjtőnek regisztrálni kell a metódust úgy létrehozáskor mint megsemmisítéskor Objektum referencia NULL értékre állítás
Osztályok létrehozása: Osztály deklaráció public – alapértelmezés szerint csak az azonos csomagban lévő osztályok használhatják, így mindenki abstract – az osztály nem példányosítható final – az osztályból nem származtatható másik class osztálynév – az osztály neve extends ősosztály – az osztály őse (mindenképpen kell egy ős) implements interface – a megvalósított egy, vagy több interfész Osztály törzs a változókat és a metódusokat tagoknak nevezzük Konstrutor (null konstruktor) private – más osztály nem példányosíthatja az osztályunkat default – csomagon belüli osztályok példányosíthatják protected – csak alosztályok és az egy csomagban lévő osztályok példányosíthatják public – bármely osztály példányosíthatja Osztályok II.
Tag változók tag változók: hozzáférési szintek: private – csak az osztály default – osztály, csomag protected – osztály, csomag, alosztály public – mindenki static – ez osztály változó (pl. példány számlálás) final – nem változtatható (csak a konstruktorban adhatunk értéket)
Metódusok Módosító (mutator) setXXX Hozzáférő (accessor) getXXX Argumentum nélküli
Metódusok public Object push(Object item) throws … { items.addElement(item); return(item); } törzs deklaráció Hozzáférési szint Visszatérési érték Paraméterek Kivétel kezelés
Metódusok I. Hozzáférési szintek: private – osztály default – osztály, csomag protected – osztály, csomag, alosztály public – mindenki static – osztályhoz kötött, így akkor is el lehet érni amikor nincs példányosítva, de csak static tagok érhetőek el! public class teszt { public static int x; public static void pelda() { System.out.println(x); } class teszt1 { public static void main(String[] args) { System.out.println(teszt.x); }
Metódusok II. abstract – nincs implementálva, csak absztrakt osztály tagja lehet (csak a koncepciót vázoljuk, a megvalósítás az alosztályok feladata lesz) final – nem írható felül (biztonsági okok (string - final), tervezés) native – más nyelven írt függvény (a JNI segítségével kapcsolható implementáció) synchronised – párhuzamosan futó szálak metódusokat használhatnak, hogy hozzáférjenek a változókhoz. Ezzel oldhatjuk meg a zárolást.
Metódusok III. throws exceptions – segítségével tudunk kivételeket kezelni az argumentumokat érték szerint adja át, a visszatérési értéket is. polimorfizmus overloading: több metódusnak lehet egy neve, ekkor az argumentumok alapján dől el melyik hívódik meg operator overloading nincs overriding: az alosztályokban lévő azonos nevű metódusok felülírják az ős metódusait
Öröklődés I. az alap objektum az Object belőle származik minden objektum közvetlenül vagy közvetve az alosztály örökli az ős metódusait, változóit (az összes elődét) melyek public vagy protected láthatóságúak örököl mindent aminél nincs specifikálva a láthatóság (default) és egy csomagban vannak mivel a konstruktor-ok nem tagok azok nem öröklődnek
Öröklődés II. superclass – ősosztály az egyforma nevű változóknál, metódusoknál az alosztályé érvényes final metódust nem lehet felülírni abstract metódust kötelező felülírni (vagy az alosztálynak absztraktnak kell lennie) super.valtozonev – az ős változója super.metodusnev() – az ős metódusa super() – ős konstruktor
Object minden osztály belőle származik közvetve vagy közvetlenül felülírható metódusai: clone (klónozás) equals / hashCode (összehasonlítás, int) finalize (memória felszabadítás, super.finalize()) toString végleges metódusai: getClass notify notifyAll wait