Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 1

Hasonló dokumentumok
JAVA PROGRAMOZÁS 3.ELŐADÁS

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

JAVA PROGRAMOZÁS 2.ELŐADÁS

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

OOP: Java 8.Gy: Abstract osztályok, interfészek

Java programozási nyelv 5. rész Osztályok III.

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

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

Java IX. telkezelés a Java-ban

Java IX. telkezelés a Java-ban

Programozási nyelvek Java

Java programozási nyelv 4. rész Osztályok II.

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

7. K: JAVA alapok Konzultáció

Programozás I. 5. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Programozási nyelvek Java

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Kivételkezelés, naplózás. Exception handling, logging

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

Interfészek. PPT 2007/2008 tavasz.

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

Java programozási nyelv

Már megismert fogalmak áttekintése

Java Programozás 5. Ea: OOP alapok. Abstract Javaságok

S ha kettészelik is: balfelöl belőle Valamivel mindig - Valamivel mindiq több marad. (Nyugat )

Osztályok. 4. gyakorlat

JAVA PROGRAMOZÁS 4.ELŐADÁS

Kivételek. A program végrehajtása során ritkán bekövetkező események Nem a fő végrehajtási ág ; logikailag alacsonyabbrendű feladat jelzése

Objektumorientált programozás C# nyelven

Programozási nyelvek Java

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Szoftvertechnológia alapjai Java előadások

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Magas szintű programozási nyelvek 2 Előadás jegyzet

Bevezetés a Python programozási nyelvbe

III. OOP (objektumok, osztályok)

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

OOP és UML Áttekintés

Programozás III CSOMAGOK. Az összetartozó osztályok és interfészek egy csomagba (package) kerülnek.

OOP #14 (referencia-elv)

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Programozási nyelvek II.: JAVA

Bevezetés a Java programozási nyelvbe

Programozási nyelvek II.: JAVA

Objektumorientált programozás C# nyelven

Programozás I. Első ZH segédlet

Web-technológia PHP-vel

Mi a különbség az extends és az implements között. Mikor melyiket kell használni? Comperable-t megvalósító oasztályokban össze lehet hasonlitani

Segédanyag: Java alkalmazások gyakorlat

Java III. I I. Osztálydefiníció (Bevezetés)

Bevezetés a Java programozási nyelvbe

Programozás II. labor

OOP: Java 8.Gy: Gyakorlás

Java III. I I. Osztálydefiníció (Bevezetés)

Java programozási nyelv 9. rész Kivételkezelés

Szoftvertechnológia alapjai Java előadások

Öröklés és Polimorfizmus

Globális operátor overloading

Osztálytervezés és implementációs ajánlások

Osztálytervezés és implementációs ajánlások

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Segédanyag: Java alkalmazások gyakorlat

Java programozási nyelv 6. rész Java a gyakorlatban

Java II. I A Java programozási nyelv alapelemei

Segédanyag: Java alkalmazások gyakorlat

Objektumorientált programozás C# nyelven

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Objektumorientált programozás C# nyelven III.

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

BME MOGI Gépészeti informatika 4.

Java Programozás 3. Ea: Java osztályok. OOP alapalapok

Programozási alapismeretek 4.

Programozási technológia

Programozási nyelvek II.: JAVA

Programozási nyelvek II.: JAVA, 11. gyakorlat

Java VII. Polimorfizmus a Java nyelvben

Osztályszintű elérés, kivételkezelés, fájlkezelés

Collections. Összetett adatstruktúrák

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Java Programozás 1. Gy: Java alapok. Ismétlés ++

Objektumorientált programozás C# nyelven III.

Objektumorientált programozás C# nyelven

Informatika terméktervezőknek

Programozási nyelvek Java

Java osztálykönyvtár és használata

Objektumorientált programozás Java-ban

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Sikeres végrehajtás(pass): ez azt jelenti, hogy a teszt rendben lefutott, és az ellenőrzési feltételek mind teljesültek.

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

Java és web programozás

Programozás III KIINDULÁS. Különböző sportoló típusok vannak: futó, magasugró, focista, akik teljesítményét más-más módon határozzuk meg.

Bánsághi Anna

Átírás:

Angster Erzsébet: OO tervezés és programozás, Java II. kötet alapján Készítette: Andor Gergely Ellenőrizte: Dr. Szelezsán János Jóváhagyta: Lengyel Zsuzsánna Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 1

I. Objektumorientált technikák II. Grafikus felhasználói interfész III. Állománykezelés IV. Vegyes technológiák V. Adatszerkezetek, kollekciók Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 2

1. Csomagolás, projektkezelés 2. Öröklődés 3. Interfészek, belső osztályok 4. Kivételkezelés Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 3

1. Csomagolás, projektkezelés 1. Csomagolás 2. Projektkezelés a JBuilderben 3. JAR-állomány készítése 4. Java program futtattása Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 4

Csomagolás Csomag (package) Összetartozó osztályok és interfészek csoportja Logikai és fizikai szintű csoportosítás csomag1 csomag2 csomag11 Interfesz csomag12 csomag121 Osztaly5 Osztaly1 Osztaly3 Osztaly2 Osztaly4 Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 5

Könyvtárstruktúra Projektfájl Projektkönyvtár Forrásútvonal CsomagApp CsomagApp.jpx Célútvonal src classes csomag1 csomag2 csomag1 csomag2 csomag11 csomag12 Osztaly5.java csomag11 csomag12 Osztaly5.class Interfesz.java Osztaly2.java Osztaly4.java csomag121 Interfesz.class Osztaly1.class Osztaly2.class Osztaly4.class csomag121 Osztaly3.java Osztaly3.class Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 6

Csomag azonosítása UML: csomag1::csomag12::csomag121 Java: csomag1.csomag12.csomag121 Csomag megadása package csomag1.csomag12.csomag121; Más csomag importálása import csomag1.csomag12.csomag121.osztaly3; import csomag1.csomag12.csomag121.*; Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 7

Csomag elemeinek láthatósága Osztály vagy interfész láthatósága publikus (public) csomagszintű Osztálytagok (adatok, metódusok) láthatósága publikus (public, +) védett (protected, #) privát (private, -) csomagszintű Az öröklési ágon az osztálytagok láthatósága csak bővíthető! Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 8

Projekt (project) Projektkezelés a JBuilderben Egy adott szoftver fejlesztéséhez használt, logikailag összetartozó állományok és környezeti beállítások gyűjteménye Projektállomány projektelemek (állományok) listája projekt tulajdonságai Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 9

Projektkezelés JBuilderben Projekt (project) összetartozó osztályok és interfészek csoportja logikai és fizikai szintű csoportosítás Projektpanel Tartalompanel Struktúrapanel Üzenetpanel Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 10

Java fordítóprogram Alapútvonalak kimeneti útvonal output path osztályútvonal class path forrásútvonal source path Példák 02Oroklodes\HengerProgram\src\compile1.bat: javac -g -nowarn Henger.java 01Projekt\CsomagApp\make.bat javac -sourcepath src -d classes -classpath. @Files.txt Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 11

JAR (Java ARchive) JAR-állomány készítése Egy Java projekt fájljait tömörítő állomány Manifest (aláírásfájl, manifest.mf) JAR fájl összeállítása parancssorból jar cfm CsomagApp.jar meta-inf\manifest.mf C classes. JAR fájl futtatása java jar CsomagApp.jar Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 12

2. Öröklődés 1. Az öröklődés fogalma 2. Mintafeladat Hengerprogram 3. Az objektumreferencia statikus és dinamikus típusa 4. Az utódosztály adatai és kapcsolatai 5. Metódusok felülírása, dinamikus és statikus kötés 6. this és super referenciák 7. this és super konstruktorok konstruktorok láncolása 8. Polimorfizmus 9. Absztrakt metódus, absztrakt osztály 10. Láthatóság 11. Összefoglalás metódusok nyomkövetése Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 13

Öröklődés Öröklődés(inheritance), kiterjesztés(extension) Egy meglévő osztály kiterjesztése, továbbfejlesztése Ősosztály, utódosztály Egyszeres / többszörös öröklés Az öröklés szabályai Egy osztályból több osztály is származtatható Az osztályhierarchia mélysége tetszőleges Az öröklés tranzitív A Javában minden osztály implicit őse az Object, és csak egyszeres öröklés van. Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 14

Mintafeladat Hengerprogram Feladat Hengerprogram Különböző hengereket szeretnénk nyilvántartani: vannak olyan hengerek, amelyek csupán mértani testek. Ezeknek van sugaruk és magasságuk; vannak rudak (tömör hengerek), melyeknek súlyuk is van; végül vannak csövek: valamekkora falvastagságú tömör, lyukas hengerek. Készítsük el a megadott hengerek osztályait! Inicializáláskor a hengereknek értelemszerűen megadhatók a következő adatok: sugár, magasság, fajsúly és falvastagság. A fajsúlyt nem kötelező megadni, az alapértelmezésben legyen 1! Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 15

Minden henger legyen képes visszaadni alapadatait, térfogatát és esetleges súlyát! A tostring() metódus adja meg az adott henger szöveges reprezentációját! A fent leírt osztályokból példányosítsunk néhányat, és tegyük bele őket egy konténerbe! Végezzük el a következő feladatokat: Írjuk ki a hengerek számát, és listázzuk ki a hengerek adatait! Számítsuk ki a konténerben található összes henger átlag térfogatát! Listázzuk ki a csövek adatait, adjuk meg a csövek számát és összsúlyukat! Számoljuk és a program végén írjuk ki a program futása közben született hengerek számát! Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 16

Osztálydiagram HengerProgram +HengerProgram() +atlagterfogat(): double +lista(vektor: Vector) +run() +main(...) * hengerek {Vector Henger -szuletesszamlalo: int -sugar, magassag: double +Henger(sugar,magassag: double) +getszuletesszamlalo: int +getsugar(): double +getmagassag(): double +terfogat(): double +tostring(): String Rud -falvastagsag: double Cso +Cso(sugar,magassag,fajsuly,falVastagsag: double) +Cso(sugar,magassag,falVastagsag: double) +getfalvastagsag(): double +terfogat(): double +tostring(): String -fajsuly: double +Rud(sugar,magassag,fajsuly: double) +Rud(sugar,magassag: double) +getfajsuly(): double +suly(): double +tostring(): String Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 17

class Henger { //... class Rud extends Henger { //... class Cso extends Rud { //... public class HengerProgram { //... Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 18

Az objektumreferencia statikus és dinamikus típusa Statikus típus: deklarált osztály Dinamikus típus: mutatott objektum valódi osztálya :Object Object Helytelen! :Henger Henger r : Rud :Rud Rud :Cso Cso Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 19

instanceof operátor Object obj = new String("Valami"); if (obj instanceof Object)... if (obj instanceof String)... if (obj instanceof Integer)... if ("Semmi" instanceof String)... // true // true // false // true Automatikus típuskonverzió felfelé (upcasting) String str = "Kakukk"; System.out.println(str.toLowerCase()); // OK Object obj = str; // String Object //System.out.println(obj.toLowerCase()); Fordítási hiba! Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 20

Típuskonverzió lefelé (downcasting) Object obj = "Szoveg"; // String Object String str = (String)obj; // Object String // String str = obj; Fordítási hiba! Object obj = "Kakas"; // String Object Integer iobj = (Integer)obj; // Object Integer (!) System.out.println(iObj.intValue()); // ClassCastException! Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 21

Az utódosztály adatai és kapcsolatai Példányadatok memóriafoglalása h : Henger r : Rud cso : Cso Henger -sugar: double -magassag: double sugar = 1 sugar = 0.5 sugar = 5 magassag = 4 magassag = 4 magassag = 5 Rud fajsuly = 2 fajsuly = 0.5 -fajsuly: double falvastagsag = 2 Cso -falvastagsag: double Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 22

Hivatkozás az adatokra Hivatkozás kívülről: publikus, nem takart példányadatokra, illetve osztályadatokra Hivatkozás osztályból: publikus vagy védett ősadatokra Adatok takarása Adatot nem lehet felülírni! Adat takarása = ugyanolyan nevű másik adat deklarálása Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 23

class C1 { static String s = "C1 "; int a = 1; int b = 10; class C2 extends C1 { int a = 2; class C3 extends C2 { static String s = "C3 "; int b = 30; public void kiir1() { System.out.println(C1.s+C2.s+s); //public void kiir2() { System.out.println(C1.a+C2.a+C3.a); public void kiir3() { System.out.println(super.a+a); public void kiir4() { System.out.println(super.b+b); Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 24

Metódus felülírása, dinamikus és statikus kötés Példánymetódus felülírása (overriding) Egy metódus az utódosztályban felülírható, ha az nem private nem final nem static (példánymetódus) Dinamikus kötés, futás alatti kötés, késői kötés Osztálymetódus Az osztály sajátja, nem írható felül Statikus kötés Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 25

A példánymetódus dinamikus kötése C1 m1() {m2() m2() obj1:c1 m1() m1() obj2:c2 m2() C2 Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 26

Az osztálymetódus statikus kötése C1 m1() {m2() m2() obj1:c1 m1() m1() obj2:c2 m2() C2 Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 27

this és super referenciák A megszólított objektum referenciái Példánydeklarációk takarása esetén használatosak Hivatkozás saját (eltakart) adatra this.adat Hivatkozás ős (eltakart) adatra / metódusra super.adat super.metódus() Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 28

Konstruktorok láncolása Minden osztálynak van saját konstruktora A konstruktor nem öröklődik, és nem lehet felülírni Konstruktorhívási lánc Konstruktorok láncolásának szabályai Osztályon belül másik konstruktor hívása: this(paraméterek) A közvetlen ős konstruktor hívása: super(paraméterek) Minden konstruktorban pontosan egy this() vagy super() hívás legelső utasításként Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 29

class C1 { C1(int a) { Példa class C2 extends C1 { C2(int a, int b) {super(a); C2(int a) {this(a,1); C2() {this(2); class C3 extends C2 { C3(int a, int b) { C3(int a) {this(a,3); Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 30

class C4 extends C3 { int a; //C4() {super(); // hiba: C3-ban nincs C3() //C4() { // hiba: C3-ban nincs C3() //C4() {a=1; super(a); // hiba: super nem első! //C4() {this(); super(5); // hiba: kettő nem lehet! public class KonstruktorProba { public static void main (String args[]) { new C3(1); Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 31

Polimorfizmus :Rud :Henger :Rud :Henger :Cso terfogat() tostring() terfogat() tostring() :HengerProgram terfogat() tostring() Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 32

Absztrakt metódus, absztrakt osztály Absztrakt metódus: üres metódus, mely csak örökítési célt szolgál Absztrakt osztály: absztrakt metódust tartalmazó, nem példányosítható osztály Jelölés UML: dőlt betűvel Java: abstract class <OsztályAzonosító> { abstract <metódusaz>(paraméterek); Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 33

Feladat FaIdomok Egy fajátékokat tartalmazó dobozban két féle idom van: gömb és hasáb, különböző méretekben. Készítsünk olyan programot, amellyel nyilvántarthatjuk különböző idomok adatait! Írjuk ki a következőket: az összes idom adatait a felvitel sorrendjében; az idomok összsúlyát; a gömbök összsúlyát; a legkisebb és a legnagyobb térfogatú idom típusát és adatait! Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 34

Osztálydiagram idomok java::lang::object java::lang::comparable FaIdomok +FaIdomok() +osszsuly(): double +osszgombsuly(): double +run() +main(...) * -idomok {Vector Idom { abstract -fajsuly: double = 0.8 +terfogat(): double +suly(): double +compareto(obj:object): int Gomb -sugar: double +Gomb(sugar:double) +terfogat(): double +tostring(): String Hasab -a,b,magassag: double +Hasab(a,b,magassag:double) +terfogat(): double +tostring(): String Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 35

3. Interfészek, belső osztályok 1. Interfész 2. Belső osztály 3. Névtelen osztály Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 36

Interfész Konstansokat és metódusfejeket definiál Implementáló osztály: a metódusokat implementálja Deklarációja: [public] interface <InterfészAzon> [extends <InterfészAzon,...>] { <konstansok, metódusfejek> Abstract, nem példányosítható Egyetlen lehetséges módosítója: public Konstansok módosítói: public, static, final Metódusfejek módosítói: public, abstract Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 37

Az interfész implementálása Implementáló osztály: speciális utódja az interfésznek Nem abstract osztály összes metódust meg kell írni Abstract osztály az utódban befejezhető az implementálás Egy osztály akárhány interfészt implementálhat! Az interfész egyes metódusait az implementáló osztály örökölheti is Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 38

Az interfész öröklése Az interfészek örökíthetők Az utód interfész örökli az ős interfész deklarációit Az utód interfész implementálásakor implementálnunk kell az ős interfész metódusait is Egy interfész akárhány interfészt örökölhet! Értékadási kompatibilitás Az objektum statikus referenciája lehet interfész típusú Az implementáló osztály objektuma értékül, illetve paraméterül adható az interfész típusú statikus referenciának Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 39

Feladat Sorok feldolgozása, QueueApp A sor szekvenciális, csak sorban feldolgozható konténer; csak a végére lehet új elemet tenni, s csak a legelsőnek betett elemet lehet kivenni belőle. Készítsünk két interfészt: Az IQueue olyan sor, amely képes a következőkre: Betesz egy új objektumot a sor végére; Kiveszi, és rendelkezésre bocsátja a sor legelső objektumát; Megmondja, hogy a sor üres-e. Az ICleverQueue okos sor (clever queue), s az előbbieken túl a következőket is tudja: Kiveszi és megszünteti a sor első n objektumát; Megadja a sorban álló objektumok számát. Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 40

Készítsünk mindkét interfészből egy-egy osztályt! Az ICleverQueue implementációja legyen leszármazottja az IQueue implementációjának. Az interfészeket és az osztályokat tegyük be az extra.util csomagba, hogy később is használhassuk őket! Végül készítsünk egy programot, amely menüvezérelten végzi a következő funkciókat: betesz a sorba egy szöveget; kivesz a sorból egy szöveget (ha van) és ki is írja; kitöröl a sorból három szöveget, ha van benne annyi! Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 41

extra::util «interfész» IQueue +put(object) +get(): Object +isempty(): boolean «interfész» ICleverQueue Osztálydiagram java::lang::object Queue +put(object) +get(): Object +isempty(): boolean CleverQueue Forráskódok Projekt: QueueApp Csomaghierarchia: QueueApp extra util IQueue ICleverQueue Queue CleverQueue QueueApp +remove(int) +size(): int +remove(int) +size(): int +main(...) +processqueue(icleverqueue) Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 42

IQueue.java package extra.util; public interface IQueue { void put(object o); Object get(); boolean isempty(); ICleverQueue.java package extra.util; public interface ICleverQueue extends IQueue { void remove(int n); int size(); Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 43

Queue.java... public class Queue implements IQueue { protected Vector v = new Vector(); public void put(object o) { v.add(o);... CleverQueue.java... public class CleverQueue extends Queue implements ICleverQueue {... Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 44

Konstans az interfészben Feladat Számla Kérjünk be egy forintösszeget, majd írjuk ki az értékét euróban!... interface Euro { int ARFOLYAM = 230; String NEV = "EURO"; public class Szamla implements Euro { public static void main (String args[]) { int ftosszeg = Console.readInt("Összeg (Ft): "); System.out.println((ftOsszeg/ARFOLYAM)+" "+NEV); Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 45

Belső osztály Osztályon belül deklarált másik osztály: class <KulsoOsztályAzon>... {... class <BelsoOsztályAzon>... {... Csak az őt deklaráló külső osztály ismeri Példányosítás: külső osztály példánymetódusából Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 46

Belső osztály (folyt.) Példánya ismeri az őt létrehozó külső objektumot implicit referencia hivatkozás takarásnál: KülsőOsztály.this Nem lehetnek statikus deklarációi Nem kötelező azonosítani (névtelen belső osztály) Fordítóprogram különálló külső osztállyá alakítja: KülsőOsztályAzon$BelsőOsztályAzon.class KülsőOsztályAzon$n.class (n=1,2, ) Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 47

Feladat UdvarApp Egy udvaron különböző négyzetes oszlopok vannak elhelyezve. Tartsuk nyilván az udvar és az oszlopok adatait, majd készítsünk róluk jelentést! Ne engedjünk olyan oszlopot létrehozni, amely az udvaron kívülre esik! Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 48

import java.util.*; class Udvar { // Udvar.class private int szel=100, hossz=50; private Vector oszlopok = new Vector(); public Udvar() { oszlopok.add(new Oszlop(25,30)); oszlopok.add(new Oszlop(40,5)); oszlopok.add(new Oszlop(97,10)); Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 49

class Oszlop { private int x, y; private int szel=5; // Udvar$Oszlop.class public Oszlop(int x, int y) { if (x>=0 && x<=udvar.this.szel-szel && y>=0 && y<=hossz-szel) { this.x = x; this.y = y; else { this.x = 0; this.y = 0; Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 50

public String tostring() { return x+"-"+y; // Oszlop public String tostring() { return Udvar:"+szel+"x"+hossz+ ",Oszlopok:"+oszlopok; // Udvar Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 51

public class UdvarApp { // UdvarApp.class public static void main(string[] args) { Udvar udvar = new Udvar(); System.out.println(udvar); Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 52

Feladat UdvarApp2 Oldjuk meg az előző feladatot belső osztály nélkül!... class Oszlop {... // Oszlop.class public Oszlop(Udvar udvar,int x, int y) { if (x>=0 && x<=udvar.szel-szel && y>=0 && y<=udvar.hossz-szel) { // Oszlop Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 53

class Udvar { public Udvar() { // Udvar.class oszlopok.add(new Oszlop(this,25,30)); oszlopok.add(new Oszlop(this,40,5)); oszlopok.add(new Oszlop(this,97,10)); // Udvar public class UdvarApp2 { // UdvarApp2.class Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 54

Névtelen osztály Nincs neve Máshol nem lehet rá hivatkozni Egyszer példányosítható Az objektum létrehozásával egyidőben deklaráljuk Névtelen osztályú objektum létrehozása Osztály kiterjesztésével Interfész implementálásával Nincs konstruktora Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 55

Névtelen osztály példányosítása class Ember { osztály kiterjesztésével // Ember.class public class NevtelenKiterjesztes { // NevtelenKiterjesztes.class public static void main(string[] args) { Vector emberek = new Vector(); emberek.add(new Ember("Zoli") { public String jellemzo() { return "Kövér"; ); // NevtelenKiterjesztes$1.class Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 56

Névtelen osztály példányosítása interfész implementálásával interface Jellemzett { // Jellemzett.class public String jellemzo(); public class NevtelenImplementacio { // NevtelenImplementacio.class public static void main(string[] args) { Jellemzett jel = new Jellemzett() { public String jellemzo() { return "Szép"; ); // NevtelenImplementacio$1.class Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 57

4. Kivételkezelés 1. Kivételek, hibák 2. Kivételek keletkezése és szándékos kiváltása throw 3. A kivétel továbbadása throws 4. A kivétel elkapása, kezelése 5. Saját kivételek használata Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 58

Rendszerhibák és kivételek Programot leállító események: objektumok, melyek osztályai a Throwable osztály leszármazottai A dobható események két csoportja: Rendszerhiba (Error): a programot leállítja Kivétel (Exception): hibakezelés után a program folytatódhat Nem ellenőrzött kivétel: nem kötelező kezelni (futási hibák, RuntimeException és annak leszármazottai) Ellenőrzött kivétel: kötelező kezelni (többi Exception) Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 59

Object java.lang Throwable java.lang Error java.lang LinkageError java.lang VirtualMachineError java.lang ThreadDeath java.lang AWTError java.lang Exception java.lang RuntimeException java.lang ArrayIndexOutOfBoundsException java.lang ArithmeticException java.lang ClassCastException java.lang IllegalArgumentException java.lang NumberFormatException java.lang... NegativeArraySizeException java.lang NoSuchElementException java.util... NullPointerException java.lang IOException java.io EOFException java.io FileNotFoundException java.io... AWTException java.awt... Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 60

java::lang::throwable -detailmessage: String +Throwable() +Throwable(message: String) +getmessage():string +getlocalizedmessage(): String +printstacktrace() +tostring(): String... A kivételosztályok deklarációi java.lang::exception +Exception() +Exception(m: String) java::lang::runtimeexception +RuntimeException() +RuntimeException(m: String) java::io::ioexception IOException() IOException(m: String)... Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 61

Kivételek keletkezése és szándékos előidézése throw Kivétel kiváltása: kivételobjektum létrehozása és bedobása (throw) a program vérkeringésébe Ki váltja ki? API metódus programozó Szintaktika: throw new <Kivételosztály>(<információs szöveg>); throw new ArithmeticException("Osztás nullával!"); throw new TulNagyException("Túl nagy szám!"); Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 62

Feladat Kivétel útja Keltsünk szándékosan futási hibát az ábrán látható módon! Kövessük a kivétel kiszállásának útját! KivetelUtja.main(...)... m1()... KivetelUtja.m1()... Masik.m2()... Masik.m2()...... A program futása: java.lang.runtimeexception: Rosszalkodas at Masik.m2(KivetelUtja.java:4) at KivetelUtja.m1(KivetelUtja.java:10) at KivetelUtja.main(KivetelUtja.java:13) Exception in thread "main" Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 63

class Masik { static void m2() { throw new RuntimeException("Rosszalkodas"); public class KivetelUtja { static void m1() { Masik.m2(); public static void main(string[] args) { m1(); Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 64

A kivétel továbbadása throws Ellenőrzött kivételekkel a metódushívási lánc minden metódusában foglalkoznunk kell Két lehetőségünk van: - a metódusban kezeljük a kivételt - a kivételt továbbadjuk a hívó metódusnak Kivétel továbbadásának jelzése a metódusfejben: throws <Kivételosztály1, Kivételosztály2,... > throws Exception A kivételosztályok továbbadáskor nem szűkíthetők! Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 65

Feladat Ellenőrzött kivétel továbbadása Idézzünk elő egy main által hívott metódusban egy ellenőrzött, IOException típusú kivételt. import java.io.*; public class EllenorzottDobas { static void metodusa() throws IOException { throw new IOException("Számot kérek!"); public static void main (String args[]) throws IOException { metodusa(); A program futása: java.io.ioexception: Számot kérek! at EllenorzottDobas.metodusA(EllenorzottDobas.java:5) at EllenorzottDobas.main(EllenorzottDobas.java:9) Exception in thread "main" Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 66

A kivétel elkapása, kezelése try-catch-finally szerkezet try { <utasítások> catch (<Kivételosztály1> <obj1>) { <utasítások> catch (<KivételosztályN> <objn>) { <utasítások> finally { <utasítások> // try blokk // catch blokk // catch blokk // finally blokk Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 67

try blokk Kivételek keletkezésének feltételezett helye catch blokk Kivétel kezelése az érkező kivételobjektum alapján Aktuális (érkező) kivételobjektum értékadási kompatibilitás: formális kivételobjektum = aktuális kivételobjektum manipulálható, a blokk végén elpusztul Működése legfeljebb egy catch blokk hajtódik végre sorrend: egyre általánosabb kivételek definiálandók nincs kezelve továbbadódik a hívó metódusnak finally blokk Minden körülmények között végrehajtódik Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 68

A kivétel elkapásának útja main() metodusa() Itt már nem kell throws, mert kezeljük a kivételt metodusb() throws IOException metodusc() throws IOException utasítások metodusa()... utasítások... utasítások try metodusb()... catch (IOException) utasítások metodusc()... utasítások utasítások IOException utasítások catch (Exception) finally Itt kezeljük Itt keletkezik Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 69

Saját kivételek Feladat Saját kivétel alkalmazása Írjunk egy readszam(tol,ig) függvényt, amely bekér egy egész számot valamilyen megadott zárt tartományból (tol lehet nagyobb is, mint ig)! Addig kérjünk számot, ameddig az végre a megadott tartományba esik. Ha a szám kívül esik rajta, akkor a metódus ejtsen egy saját (vagyis nem API-beli) OutOfRangeException kivételt és az abba foglalt információs szöveg közölje a megkövetelt határokat! Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 70

import extra.*; class OutOfRangeException extends RuntimeException { OutOfRangeException(String s) { super(s); public class SajatKivetel { static int readszam(int tol, int ig) { if (tol > ig) { int seged=tol; tol=ig; ig=seged; int szam; Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 71

while (true) { try { szam = Integer.parseInt(Console.readLine("Szám: ")); if (szam < tol szam > ig) throw new OutOfRangeException(tol+"-től "+ig+"-ig!"); return szam; // try catch (NumberFormatException ex) { System.out.println("Illegális karakter!"); catch (OutOfRangeException ex) { System.out.println(ex.getMessage()); // while Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 72

// readszam public static void main (String args[]) { int lottoszam = readszam(1,90); System.out.println("OK"); // main // SajatKivetel Gábor Dénes Főiskola (IAI) Programozási technológia (Java) - I. / 73