Objektum-elvu programozas (OOP) Java tutorial. Pelda objektumokra. Objektumok. Pelda objektumokra. Pelda objektumokra



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

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

JAVA PROGRAMOZÁS 2.ELŐADÁS

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

Programozási nyelvek Java

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

Osztályok. 4. gyakorlat

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

é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

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?

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

Programozási nyelvek Java

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

Objektumorientált programozás C# nyelven

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

Már megismert fogalmak áttekintése

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

Java V. Osztályszint. lyszintű ű tagok. Példányváltozó. Osztályváltozó. Általános Informatikai Tanszék Utolsó módosítás:

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

JAVA PROGRAMOZÁS 3.ELŐADÁS

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

C# osztálydeníció. Krizsán Zoltán 1. .net C# technológiák tananyag objektum orientált programozás tananyag

Programozási nyelvek Java

Interfészek. PPT 2007/2008 tavasz.

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

OOP #14 (referencia-elv)

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

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

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

Java és web programozás

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

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

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

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

Öröklés és Polimorfizmus

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

Programozás módszertan p.1/46

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

Bevezetés a Python programozási nyelvbe

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

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

Java II. I A Java programozási nyelv alapelemei

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

C++ programozási nyelv

Java és web programozás

A Java és a C++ összehasonlítása

C++ programozási nyelv

Objektumorientált programozás C# nyelven

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

Java és web programozás

Java II. I A Java programozási nyelv alapelemei

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

C++ programozási nyelv Konstruktorok-destruktorok

Elemi Alkalmazások Fejlesztése II.

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

Web-technológia PHP-vel

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

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

Objektumok inicializálása

Bevezetés a programozásba Előadás: A const

III. OOP (objektumok, osztályok)

Programozási nyelvek Java

Java VII. Polimorfizmus a Java nyelvben

Programozás I. Első ZH segédlet

Programozási nyelvek II.: JAVA

Programozási nyelvek Java

Programozás II. 4. Dr. Iványi Péter

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

Objektumorientált programozás C# nyelven

Virtuális függvények (late binding)

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

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?

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

Programozási nyelvek (ADA)

A C# programozási nyelv alapjai

Java VII. Polimorfizmus a Java nyelvben

3. gyakorlat. Objektumorientált programozás

Alprogramok, paraméterátadás

Szoftvertechnológia alapjai Java előadások

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

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

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Java tutorial. Csomagok. A program tagolasa. Alrendszerek kialakıtasa. Csomag. Alrendszerek kialakıtasa

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

Programozási nyelvek II.: JAVA

OOP alapok Egy OOP nyelvet három fontos dolog jellemez. egységbezárás ( encapsulation objektumoknak öröklés ( inheritance

ELTE SAP Excellence Center Oktatóanyag 1

Programozás III. - NGB_IN001_3

Objektumelvű alkalmazások fejlesztése 6. gyakorlat. Öröklődés, polimorfizmus. Öröklődés Kódismétlődés objektum-orientált szerkezetben

Programozási nyelvek II.: JAVA

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Smalltalk 3. Osztályok létrehozása. Készítette: Szabó Éva

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

Programozás II. labor

2019, Funkcionális programozás. 2. el adás. MÁRTON Gyöngyvér

Átírás:

Objektum-elvu programozas (OOP) ö Objektumok, oszta lyok (adatkozpontu ) ö Esemenyvezerelt programoza s í vs. strukturalt programozas í deklaratıv / imperatıv ö AdatabsztrakciÖ (egysegbe za ras, adatelrejtes) ö Polimorfizmus ö O rokl des ö Dinamikus kotes Objektumok ö (Program) entitas: allapot es funkcionalitas ö egyedi, zart (interfesz), konzisztencia ö Attribu tumok, esemenyek ö Attribu tum - va ltozö (adattag) ö Esemenykezel - alprogram (metö dus) Kor x-koord: 0 y-coord: 0 Sugar: 1 egyseg Terűlet: 3.1415926 Nagyıt Kicsinyıt Eltol Pelda objektumokra Alkalmazott Nev: Gipsz Jakab Munkahely: ELTE Fizetes: 200e Ft FizetestEmel FeladatotAd Pelda objektumokra Pelda objektumokra Kor Alkalmazott Kor Alkalmazott Kozeppont: OrigÖ Sugar: 1 egyseg Terűlet: 3.1415926 Nev: Gipsz Jakab Munkahely: ELTE Fizetes: 200e Ft Kozeppont: OrigÖ Sugar: 1 egyseg Terűlet: 3.1415926 Nev: Gipsz Jakab Beosztas: tanarseged Fizetes: 200e Ft Nagyıt Kicsinyıt FizetestEmel FeladatotAd Nagyıt Kicsinyıt FizetestEmel FeladatotAd Eltol Eltol 1

Kapcsolatok objektumok kozott ö Osztaly: hasonlö objektumok gy jtemenye í Struktóralis hasonlo sag (reprezentacio ) í Funkcionalis hasonlö sag (viselkedes) Tıpus: tıpusertekek halmaza Peldanyosıtas (osztaly objektum) RelaciÖ k: is-a, has-a ö AggregaciÖ k, asszocia ciö k Pelda objektumok kapcsolatara Nagyıt Kicsinyıt Eltol Kor Kozeppont: OrigÖ Sugar: 1 egyseg Terűlet: 3.1415926 Pont x-koord: 0 y-koord: 0 Eltol Pelda: osztalyok es kapcsolataik Pelda: osztalyok es kapcsolataik (2) Ember Kor Kozeppont: Pont Sugar: Szam Terűlet: Szam Nagyıt Kicsinyıt Eltol x-koord: Szam y-koord: Szam Eltol Pont Alkalmazott Nev: String Beosztas: String Fizetes: Szam FizetestEmel FeladatotAd Beosztott F nok Nev: String Osztalyok, objektumok a Java nyelvben Osztaly = sema: objektumok reprezenta ciö ja nak megada sa Objektum: egy osztaly egy peldanya minden objektum valamilyen osztalybö l szarmazik peldanyosıtassal Reprezenta ciö : peldany adattagok, peldany metö dusok Osztaly: tıpus 2

Az Alkalmazott osztaly public class Alkalmazott { String nev; String beosztas; int fizetes; void fizetestemel( int mennyivel ){ fizetes += mennyivel; Az Alkalmazott osztaly public class Alkalmazott { String nev; String beosztas; int fizetes; void fizetestemel( int mennyivel ){ fizetes += mennyivel; Alkalmazott.java Alkalmazott.java Az Alkalmazott osztaly public class Alkalmazott { String nev; String beosztas; int fizetes; void fizetestemel( int mennyivel ){ fizetes += mennyivel; int szobaszam; Alkalmazott.java javac Alkalmazott.java java Alkalmazott F program public class Alkalmazott { Alkalmazott.java public class Program { public static void main( String[] args ){ Alkalmazott a; a = new Alkalmazott(); Program.java javac Program.java java Program Feladat ö Keszıtsd el a Pont osztalyt! ö Tulajdonsagok: x es y koordinata ö M velet: eltola s í dx es dy ertekekkel 3

F program public class Alkalmazott { Alkalmazott.java F program public class Alkalmazott { Alkalmazott.java public class Program { public static void main( String[] args ){ Alkalmazott a; a = new Alkalmazott(); Program.java javac Program.java java Program public class Program { public static void main( String[] args ){ Alkalmazott a = new Alkalmazott(); Program.java javac Program.java java Program F program public class Alkalmazott { Alkalmazott.java public class Program { public static void main( String[] args ){ new Alkalmazott(); Program.java javac Program.java java Program Objektumok ta rola sa ö Dinamikus memö riakezeles szűkseges ö Ada, C: mutatö k (pointerek) ö Java: referencia k Alkalmazott a; Az a valtozö ban az objektum memö riabeli cımet ta roljuk. A deklara ciö hatasa ra nem jon letre objektum! Objektum letrehozasa ö Az a valtozö hoz objektum hozzarendelese a = new Alkalmazott(); ö Pelda nyosıta s: valamilyen oszta lybö l a new opera torral (memö riafoglala s a mellekhata s, a kezd cım a kifejezes erteke) new Alkalmazott() ö Az a referencia a new opera torral letrehozott objektumra mutat 4

Feladat ö Keszıts f programot a Pont osztalyhoz. Hozz letre benne egy Pont objektumot. MetÖ dus meghıva sa public class Alkalmazott { MetÖ dus meghıva sa public class Alkalmazott { void fizetestemel( ){ public void fizetestemel( ){ public class Program { public static void main( String[] args ){ Alkalmazott a = new Alkalmazott(); a.fizetestemel(40000); public class Program { public static void main( String[] args ){ Alkalmazott a = new Alkalmazott(); a.fizetestemel(40000); Adattag elerese public class Alkalmazott { int fizetes; Adattag elerese public class Alkalmazott { public int fizetes; public void fizetestemel( ){ public void fizetestemel( ){ public class Program { public static void main( String[] args ){ Alkalmazott a = new Alkalmazott(); a.fizetes = 200000; a.fizetestemel(40000); public class Program { public static void main( String[] args ){ Alkalmazott a = new Alkalmazott(); a.fizetes = 200000; a.fizetestemel(40000); 5

Feladat ö A llıtsd be a letrehozott Pont koordinatait, told el a definialt metö dussal, vegűl ırd ki a keperny re a koordinatak u j erteket. Adattagok definia la sa ö Adattag = peldanyvaltozö ö Adattag megada sa - va ltozö deklara ciö public class Alkalmazott { int fizetes; public void fizetestbeallıt( ){ public void fizetestemel( ){ Adattagok inicializa la sa public class Alkalmazott { int fizetes = 200000; public void fizetestbeallıt( ){ public void fizetestemel( ){ public class Program { public static void main( String[] args ){ Alkalmazott a = new Alkalmazott(); a.fizetestemel(40000); Adattagok automatikus inicializa la sa: pelda public class Alkalmazott { int fizetes; public void fizetestbeallıt( ){ public void fizetestemel( ){ Olyan, mint: int fizetes = 0; public class Program { public static void main( String[] args ){ Alkalmazott a = new Alkalmazott(); a.fizetestemel(40000); Adattagok automatikus inicializalasa: implicit kezd ertek ö Pelda nyva ltozö k eseten tortenik í alprogram loka lis va ltozö jara nincs (fordıtasi hibat okoz, ha el zetes ertekadas nelkűl prö baljuk hasznalni!) í peldanyvaltozö k eseten nehez lenne betartani ezt a szabalyt, ezert inicializal automatikusan ö Pl. szam tıpusok eseten nulla (0 vagy 0.0), boolean eseten false, char eseten \u0000 ö Nem illik kihasznalni! 6

Feladat ö A Pont osztalyban az x es y adattagokat explicit inicializald 0-ra! Adattagok definia la sa: pelda k int fizetes=200000, pö tlekok, levonasok=fizetes/4; LathatÖ sa g va ltoztata sa: public int fizetes = 200000; Nem mö dosıthatö ertek va ltozö k ( konstansok ) final double ADÜ KULCS = 25; Hivatkoza s pelda nyva ltozö kra public class Alkalmazott { OsztalydefinıciÖ n belűl public int fizetes; public void fizetestemel( int mennyivel ){ fizetes += mennyivel; Ásajat adattagra public boolean tobbetkeresmint(alkalmazott masik){ return fizetes > masik.fizetes; public class Program { public static void main( String[] args ){ Alkalmazott a = new Alkalmazott(); a.fizetes = 200000; mas objektum adattagjara Mas osztalyban Min sıtett nev MetÖ dusok ö MetÖ dus: alprogram, amely egy objektumhoz van kapcsolva ö Az Áels parameter az objektum ö Pelda ul Java ban a.tobbetkeresmint(b) Ada ban tobbetkeresmint(a,b) ö U zenetkűldeses szintaxis ö Mellekhata sos fűggveny í eljaras: void visszateresi ertek MetÖ dusok definıciö ja ö Fejb l (specifika ciö bö l) es torzsb l a ll public void fizetestemel( int mennyivel ){ fizetes += mennyivel; ö Fej: mö dosıtö k, a visszateresi ertek tıpusa, azonosıtö nev, parameterlista, ellen rzott kivetelek ö Parameterlista: (int x, int y, char c) ö Szignatu ra: azonosıtö, parameterek tıpusa public void fizetestemel( int mennyivel ){ fizetes += mennyivel; 7

Pelda k metö dusdefinıciö kra int lnko( int a, int b ){ while( a!=b ) if( a>b ) a-=b; else b-=a; return a; public void fizetestduplaz(){ fizetes *= 2; Alaptıpusokra ertek szerinti parameteratadas U res parameterlista Kilepes metö dusbö l ö Ha nem void a visszateresi ertek tıpusa, akkor kell return utasıtas, amivel megadjuk a visszateresi erteket ö Ha nincs visszateresi ertek (void), akkor is lehet return utasıtas, amivel kilephetűnk void f(){ while(){ if() return; Kilepes metö dusbö l ö Ha nem void a visszateresi ertek tıpusa, akkor kell return utasıtas, amivel megadjuk a visszateresi erteket ö Ha nincs visszateresi ertek (void), akkor is lehet return utasıtas, amivel kilephetűnk void f(){ while(){ if() break; VezerlesmegszakıtÖ utasıta sok ő continue - kilep a ciklusmagbö l ő break - kilep a ciklusbö l ő return - kilep a metö dusbö l A visszateresi ertek megadasa ö A fordıtö ellen rzi, hogy fűggveny eseten mindenfelekepp lesz visszateresi ertek, azaz a vezerles mindig eljut egy return utasıtashoz ö HasonlÖ an a metö dusok loka lis va ltozö i kapcsan vegzett ellen rzeshez (inicializaltsag) ö Fordıtasi idej dontes 8

Feladat ö Keszıtsd el a Kor osztalyt! ö Tulajdonsagok: kozeppont (Pont) es sugar (double) ö M veletek: eltol es nagyıt í eltol: dx es dy ertekekkel a kozeppontot kell eltolni í nagyıt: a sugarat szorozni faktor-ral Kozvetlen adathozzaferes megtiltasa public class Alkalmazott { int fizetes; public void fizetestbeallıt( int osszeg ){ fizetes = osszeg; public void fizetestemel( ){ public class Program { public static void main( String[] args ){ Alkalmazott a = new Alkalmazott(); a.fizetestbeallıt(200000); a.fizetestemel(40000); Tıpusinvarians meg rzese public class Alkalmazott { double fizetes, evesfizetes; public void fizetestbeallıt(int uj){ fizetes = uj; evesfizetes = 12*fizetes; Feladat ö A Kor osztalyban vezess be egy u j attribu tumot, a terűletet tartsuk benne nyilvan. Ird meg a sugaratbeallıt m veletet! ö Hasznald a Math.PI erteket ö A m veletek legyenek publikusak, az attribu tumok ne! ö Keszıts lekerdez m veleteket a sugarhoz es a terűlethez, melyek publikusak. (Az adattagok nem publikusak!) A lekerdez m veletek neve megegyezhet a lekerdezett attribu tum nevevel. Tıpusinvarians meg rzese public class Kor { double sugar, terőlet; public void sugaratbeallıt(double r){ sugar = r; terőlet = sugar*sugar*math.pi; 9

Referenciak raallıtasa egy objektumra ö Referencia es objektum egyűttes letrehozasa Alkalmazott a = new Alkalmazott(); Feladat ö PrÖ bald ki a Pont osztaly egy objektumaval! ö Referencia raallıtasa meglev objektumra Alkalmazott b = a; A ket referencia ugyanarra az objektumra mutat. b.fizetestemel(10000); U res referencia ö Ha egy valtozö erteke null, akkor nem mutat objektumra. Alkalmazott c = null; ö A null referencia minden osztalyhoz haszna lhatö. ö Pelda nyva ltozö k automatikus inicializalasahoz ezt hasznalja a Java ő c.fizetestemel(10000); futasi idej hiba: NullPointerException Nem va ltoztathatö referencia final Alkalmazott a = new Alkalmazott(); a.fizetestbeallıt(100000); a = new Alkalmazott(); A referencia konstans, nem lehet masik objektumra allıtani, de a mutatott objektum megva ltozhat. O sszetett tıpusok ö O sszetett erteket csak objektummal lehet letrehozni: az egyetlen tıpuskonstrukciö ö Minden osszetett ertek dinamikus ö Minden osszetett ertekre referencian keresztűl lehet hozzaferni ö Pl. a tombok is (specialis predefinit) oszta lyok 10

Objektum parameterkent public boolean tobbetkeresmint(alkalmazott masik){ return fizetes > masik.fizetes; public void keressenannyitmint(alkalmazott masik){ masik.fizetestbeallıt(fizetes); F programban: a.keressenannyitmint(b); ö Az objektumreferencia ertek szerint adö dik a t: referencia szerinti parameteratadas ö Olyan, mint a C-ben a cım szerinti Mellekhata s ö A metö dusoknak lehet mellekhatasa í az objektumon, amihez tartozik í globalis objektumokon (System.out) í parameterkent atadott objektumokon public class Program { public static void fizetestemel ( Alkalmazott a, int mennyivel ){ a.fizetestemel(mennyivel); Feladat ö A Pont es a Kor osztalyokhoz keszıtsd el a tavolsag() metö dust, mely megadja az objektum tavolsagat egy, a parameterekent atadott Pont objektumtö l. ö A Kor osztalyban definialj peldanymetö dust, mely a parameterekent atadott pont objektumot a kor objektum kozeppontjaba allıtja: public void kozeppontba( Pont p ) Az objektum elettartama ö Nincs olyan utasıtas, amivel objektumot explicit mö don meg lehet szűntetni ö A nyelv biztonsa gossa ga t noveli ö Szemetgy jtes: ha mar nem hivatkoznak egy objektumra, akkor azt meg lehet szűntetni. Alkalmazott a = new Alkalmazott(); a = null; ö Nem biztos, hogy megsz nik a program vege el tt Szemetgy jtes ö Modern nyelvekben gyakori ö Biztonsagossag í tobbszoros hivatkozas eseten: ha az egyik hivatkozason keresztűl megszűntetjűk az objektumot, egy masikon keresztűl meg tovabbra is hasznalni prö baljuk ö Hatekonysag: id es tar ö Ciklikus hivatkoza s ö Szemetgy jt algoritmusok 11

Oszta lyszint va ltozö k es metö dusok ö A tyu k es a tojas: programot csak objektumhoz tudunk keszıteni (metö dust), objektumot pedig csak a program futasa kozben tudunk letrehozni. class hello { public static void main( String[] args ){ System.out.println("hello"); Oszta lyszint va ltozö k es metö dusok 2 ö Az objektumoknak vannak attribu tumai es m veletei, amiket az osztalydefinıciö ban adunk meg: pelda nyva ltozö k es (peldany)metö dusok. public class Alkalmazott { int fizetes = 0; public void fizetestemel( int mennyivel ){ Oszta lyszint va ltozö k es metö dusok 3 ö Az osztalyoknak is lehetnek: osztalyszint valtozö k es osztalyszint metö dusok. Ezeket is az osztalydefinıciö ban adjuk meg, de a static mö dosıtö szö val: static int nyugdıjkorhatar = 60; public static void nyugdıjkorhatartemel( int mennyivel ){ nyugdıjkorhatar += mennyivel; int eletkor; Oszta lyszint va ltozö k es metö dusok 4 ö A peldanyvaltozö k minden objektumhoz (az osztaly minden peldanyahoz) letrejonnek, az osztalyszint valtozö k az osztalyhoz jonnek letre; azaz csak egy van, es minden objektum osztozik rajta. ö A peldanymetö dusok egy objektumhoz tartoznak: az els (kvazi implicit) parameter az objektum; osztalyszint metö dusok az osztaly m veletei, az "els parameter" az osztaly. ö Az osztalyok is picit olyanok, mint az objektumok. (Azzal, hogy vannak attribu tumaik es esemenykezel ik.) Oszta lyszint va ltozö k es metö dusok 5 ö Az oszta lyszint va ltozö k: í kifejezhetik, hogy ugyanaz az attribu tumertek van minden objektumhoz (nyugdıjkorhatar) í az osztaly allapotat rogzıthetik (kavepenz) static int kavepenz = 0; public int kaverabefizet(){ fizetes -= 100; kavepenz += 100; static public kavetvesz(){ 12

Oszta lyszint va ltozö k es metö dusok 6 ö A static dolgokhoz nem kell objektum; a f program is ilyen volt. ö A proceduralis programozas imitalasa: í osztaly - modul í osztalyszint metö dus - alprogram ö "Globalis ertekek", pelda: System.out, Math.PI. F program m kodese ö Egy Java program egy osztaly "vegrehajtasanak" felel meg: ha van statikus main nev metö dusa. ö A java-nak megadott nev osztalyt inicializalja a virtualis gep (pl. az osztalyvaltozö it inicializalja), es megprö balja elkezdeni a main-jet. Ha nincs main: futasi idej hiba. ö Vegeteres: ha a main vegeter, vagy meghıvjuk a System.exit(int)-et. (Kilepesi allapot, nulla szokott a normalis allapot lenni.) ö A main feje: amit eddig csinaltunk. (Elvileg az args nev helyett lehet mas is, de az a megszokott.) A String[]-be kerűlnek a virtualis gepnek atadott extra parameterek. C- ben ugyanez: argc, argv. Pelda public class Argumentumok { public static void main( String[] args ){ if (args.length > 0) { for (int i=0; i < args.length; i++) System.out.println(args[i]); else { System.out.println("nincsenek argumentumok"); static va ltozö k inicializa la sa ö Ugyanu gy, mint a peldanyvaltozö knal: az el fordulas sorrendjeben. static int i = 1; static int j = 1; ö peldanyvaltozö k: minden peldany letrehozasakor ö osztalyvaltozö k: egyszer, az osztaly inicializaciö jakor ö osztaly inicializaciö ja: az els ra vonatkozö hivatkozas kiertekelesekor (pl. peldanyosıtas, metö dus meghıvasa, valtozö hozza feres) static va ltozö k inicializa la sa 2 ö inicializatorban lehet mar deklaralt osztalyszint valtozö, de nem lehet pelda nyva ltozö ; pelda nyva ltozö inicializatoraban viszont lehet osztalyszint va ltozö static int k = i+j-1; boolean tulkoros = eletkor > nyugdıjkorhatar; ö automatikus inicializaciö van: implicit kezd ertek 13

Hivatkoza s oszta lyszint valtozö ra ö Objektumon es osztalyon keresztűl egyarant. Alkalmazott a = new Alkalmazott(); a.nyugdıjkorhatar Alkalmazott.nyugdıjKorhatar Hivatkoza s oszta lyszint va ltozö ra 2 ö min sıtes nelkűl: az aktualis objektum osztalyanak osztalyszint valtozö jara ö objektumos min sıtessel ö osztalyos min sıtessel; objektumok, peldanyok hianyaban is m kodik public class Szamozott { static int kovetkez = 1; public final int SORSZAM = kovetkez ++; ö A pelda nyva ltozö k inicializatora minden peldanyosıtaskor kiertekel dik. (Ez a mellekhatasos kifejezeseknel fontos!) es osztalymetö dusra ö Csak az osztalyvaltozö khoz ferhet hozza, a pelda nyva ltozö khoz nem. (Nincs aktua lis peldany, mert akkor is vegrehajthatö, ha nincs peldany.) a.nyugdıjkorhatartemel(5); Alkalmazott.nyugdıjKorhatartEmel(5); Feladat ö A Kor osztalyhoz ırj illeszkedik() m veletet, mely eldonti, hogy a parameterkent megadott Pont objektum illeszkedik-e a korvonalra - egy adott t reshataron belűl. A t reshatar erteke a Kor osztaly jellemz je. ö A Pont osztalyhoz keszıts m veletet, amely a parameterkent atadott ket Pont objektum altal meghatarozott szakasz felez pontjat adja vissza. A this pszeudovaltozö ö Az osztalydefinıciö n belűl a peldanymetö dusokban this nevvel hivatkozhatunk az aktualis objektumra. ö A static metö dusokban a this persze nem hasznalhatö. ö Ez egy predefinit nev. ö Noha a this.valami-hez altalaban nem kell a min sıtes, id nkent azert szűkseg lehet ra. Es olyan is van, amikor maga a this kell (pl. atadni parameterkent). boolean kevesebbetkeresmint( Alkalmazott masik ){ return masik.tobbetkeresmint(this); public void fizetestbeallıt( int fizetes ){ this.fizetes = fizetes; 14

Feladat ö A Kor osztaly sugaratbeallıt metö dusanak formalis parametere legyen ugyanu gy elnevezve, mint a sugar attribu tum. Nevűtkozesek ö PeldanyvaltozÖ es formalis parameter neve megegyezhet. Pelda: el bb ELFEDES ö MetÖ dusnev es valtozö nev megegyezhet, mert a () megkűlonbozteti ket a hivatkozaskor. int fizetes; public int fizetes(){ return fizetes; Nevek tu lterhelese ö ugyanazt a nevet hasznalhatom tobb metö dushoz, ha kűlonboz a szignatu ra í szignatu ra: nev plussz parameterek tıpusanak sorozata í "metö dusnev tu lterhelese" í meghıvaskor az aktualis parameterek szama es (statikus) tıpusa alapjan dont a fordıtö (nem szamıt a visszateresi ertek, mert anelkűl is meg lehet egy metö dust hıvni) í valaminek illeszkednie kell, kűlonben fordıtasi hiba Pelda void fizetestemel( int novekmeny ){ fizetes += novekmeny; void fizetestemel(){ fizetes += 5000; void fizetestemel( Alkalmazott masik ){ if (kevesebbetkeresmint(masik)) fizetes = masik.fizetes; Pelda void fizetestemel( int novekmeny ){ fizetes += novekmeny void fizetestemel(){ fizetestemel(5000); void fizetestemel( Alkalmazott masik ){ if (kevesebbetkeresmint(masik)) fizetes = masik.fizetes; a.fizetestemel(10000); a.fizetestemel(); a.fizetestemel(b); a.fizetestemel(10000); a.fizetestemel(); a.fizetestemel(b); 15

Feladat ö Keszıts kozeppontos tűkrozest vegz m veleteket a Pont es a Kor osztalyokban. ö A m veleteket meg lehessen hıvni Pont objektummal is es ket koordinataval (cx,cy) is! ö ValÖ sıtsd meg a kozeppontos tűkrozes m veleteket u gy, hogy egymast hıvjak! O rokl des ö Oszta ly kiegeszıtese u j tagokkal (pelda nyvaltozö kkal, metö dusokkal). ö Szűl osztaly, gyermekosztaly. Tranzitıv lezart: s, leszarmazott. ö orokles: a szűl tagjaival is rendelkezik public class Fonk extends Alkalmazott { int beosztottakszama = 0; public void ujbeosztott( Alkalmazott beosztott ){ Oszta lyhierarchia ö az orokl desi relaciö t grafkent megadva osztalyhierarchianak is nevezik ö egyszeres orokl des eseten ez egy (iranyıtott) erd ö Java-ban van egy "univerzalis sosztaly", az Object, minden osztaly ennek a leszarmazottja í ha nem adunk meg extends-et, akkor implicit extends Object van í Object: predefinit, a java.lang-ban van definialva í olyan metö dusokat definial, amelyekkel minden objektumnak rendelkeznie kell í minden, ami nem primitıv tıpusu (int, char, stb.), az Object leszarmazottja ö tehat az osztalyhierarchia egy iranyıtott fa Hozza feresi kategö ria k ö InformaciÖ -elrejtes: nem jö, ha "mindenki mindent lat". í a program komponensei jö l meghatarozott, sz k interfeszen keresztűl kapcsolö dnak ossze í egy komponensen belűl er s koheziö, komponensek kozott korlatozott, sz kıtett interfesz í a program novekedese nem okoz exponencialis, csak linearis komplexitas-novekedest í nyelvi tamogatas ajanlott az informaciö elrejtesehez, hogy ne a programozö nak kelljen mindenre figyelni Hozza feresi kategö ria k 2 ö Komponensek a Java programokban: els sorban osztalyok es csomagok szintjen. í Amivel mi most foglalkozunk: minden egy (nevtelen) csomagban, pl. minden hasznalt osztaly egy konyvtarban lefordıtva. í Osztalyok szintjen: adattagok es metö dusok. ö Pelda: í Kor osztaly (sugar es terűlet) í Alkalmazott osztaly (fizetes es evesfizetes) í Csak egyszerre lehet babralni, hogy a tıpusinvarians megmaradjon: metö duson keresztűl lehessen csak csinalni. 16

MÖ dosıtö szavak: public, private, protected ö minden tag pontosan egy hozzaferesi kategö riaban lehet, ezert ezen mö dosıtö szavak kozűl max. egyet lehet hasznalni egy taghoz ö Felnyilvanos tagok: ha nem ırunk semmit. í azonos csomagban definialt osztalyok (objektumai). ö Nyilvanos tagok: public í kűlonboz csomagokban definialt osztalyok is elerik í ıras/olvasas szabalyozasa: nincs "read-only" í megoldas: lekerdez fűggvennyel (akar ugyanazzal a nevvel is lehet) ö Privat tagok: private í csak az osztalydefinıciö n belűl erhet el í az osztaly minden objektuma í jö lenne egy meg szigoru bb is, de ilyen nincs ö Vedett tagok: protected í a felnyilvanos kategö ria kiterjesztese: azonos csomag, plussz a leszarmazottak í Az orokolt tagok mindig ott vannak, de nem mindig erhet ek el (kozvetlenűl) a gyerekb l, csak ha a szűl ezt megengedi a hozzaferesi mö dosıtokkal. ö Pl. egy private valtozö hoz/metö dushoz nem fer hozza, csak esetleg kozvetett u ton, mas (orokolt) metö dusokon keresztűl. Feladat ö Keszıtsd el a SzınesPont osztalyt a Pont osztaly leszarmazottjakent. j tulajdonsag: szın. j m veletek: szın beallıtasa es lekerdezese. A szın attribu tum legyen priva t. Inicializa ciö A tıpusinvaria ns megteremtese pelda nyosıta skor. ö pelda nyva ltozö k inicializaciö ja ö nehezkes a peldanyosıtast "felparameterezni" (de nem lehetetlen, lasd a Szamozott peldat) ö inicializalas egy extra metö dussal, pl. init ö mas megoldas lenne a Factory, amikor az osztaly egy osztalyszint metö dusat lehetne haszna lni pelda nyosıta sra Factory metö dus public class Alkalmazott { static public Alkalmazott peldanyosıt( ){ Alkalmazott a = new Alkalmazott(); return a; ö meg mindig veszelyes, jobb nyelvi szinten osszekapcsolni a peldanyosıtast es az inicializa la st 17

Konstruktorok ö programkö d, ami a pelda nyosıta skor "automatikusan" vegrehajtö dik ö hasonlıt a metö dusokra, de nem pont ugyanolyan (nem tag, mert pl. nem orokl dik) ö a konstruktor neve = az osztaly nevevel ö parametereket vehet a t ö tobb (kűlonboz szignatu raju ) konstruktor is lehet egy osztalyban ö csak pelda nyosıta skor hajtö dhat vegre (new mellett) ö a visszateresi tıpust nem kell megadni, mert az adott class Alkalmazott { public Alkalmazott( String nev, int fizetes ){ this.nev = nev; this.fizetes = fizetes; this.evesfizetes = 12*fizetes; public Alkalmazott( String nev ){ this.nev = nev; this.fizetes = 40000; this.evesfizetes = 12*fizetes; ö MÖ dosıtö k kozűl csak a hozzaferesi kategö riat adö k hasznalhatö k (vannak egyebkent masok is, pl. a final). ö A torzs olyan, mint egy void visszateresi ertek metö duse, a parameter nelkűli return-t hasznalhatjuk. ö Szokas: ugyanazokat a neveket hasznalhatjuk konstruktor formalis parameternek, mint a pelda nyva ltozö knak (this haszna lata). ö Meghıvhat egy masik konstruktort is, this nevvel: az els utasıtas lehet csak! public Alkalmazott( String nev ){ this(nev,40000); ö A konstruktorok el tt a rendszer lefoglalja a tarat. ö ha a programozö nem ır konstruktort, akkor letrejon egy implicit, ami public, parameter nelkűli es űres torzs public F nok(){ ö A hozzaferesi kategö riak vonatkoznak a konstruktorokra is. ö Haszna lat: new uta n parameterek megadasa. í Aktualis argumentumok a konstruktornak: ezek dontik el, hogy melyik konstruktor hıvö dik meg. í Ha nem ırtunk konstruktort, akkor nem adunk at parametert es az implicit konstruktor hıvö dik meg. ö A konstruktor nem orokolhet, de meghıvhatö (a this-hez hasonlö an) a szűl osztalybeli konstruktor a legels sorban: super nevvel. public class F nok extends Alkalmazott { public F nok( String nev, int fizetes ){ super(nev,fizetes); beosztottakszama = 0; public F nok( String nev ){ this(nev,100000); 18

ö Ha egy konstruktor nem hıv meg masik konstruktort, akkor implicit mö don egy parameter nelkűli super() hıvas kerűl bele; ha nincs parameter nelkűli konstruktora a szűl nek, akkor fordıtasi hiba. ö Az implicit konstruktor űres, tehat abba is bekerűl implicit super. public class SzınesPont extends Pont { int szın = 0; implicit generalö dik: public SzınesPont() { super(); public class Negyzet { int oldal; public Negyzet( int oldal ){ this.oldal = oldal; ö A super megel zi az osztalydefinıciö ban szerepl pelda nyva ltozö inicializa la sokat, a tobbi resze a konstruktornak viszont csak utanuk jon. ö Egy protected konstruktort csak super-kent lehet meghıvni a csomagon kıvűl, new-val csak csomagon belűl lehet. public class SzınesNegyzet extends Negyzet { int szın = 0; Feladat ö A Pont es Kor osztalyokhoz keszıts konstruktorokat. A Pont osztalyhoz csak egyet, aminek a koordinatakat lehet atadni. A Kor oszta lyhoz ha rmat: í aminek a sugar mellett egy Pont objektumot, í illetve a kozeppont koordinatait lehet atadni, í valamint egy parameter nelkűli konstruktort ö Melyik Kor konstruktor hıvhat meg egy masikat? Mit jelentenek a kűlonboz lehet segek? ö Miert nem fordul a SzınesPont osztaly? Javıtsd Inicializa lö blokkok ö Utasıtasblokk a tagok (peldany- es osztalyszint valtozö k es metö dusok) es konstruktorok kozott, az osztalydefinıciö n belűl. class Szamozott { ö Osztalyinicializator es peldanyinicializator (az utö bbi csak a Java 1.1 Ö ta). Az osztalyszint inicializator a static kulcsszö val kezd dik. static int kovetkez = 0; public final int SORSZAM = kovetkez ++; int fact; { fact = 1; for (int j=2; j<=sorszam; j++) fact *= j; class A { static int i = 10, ifact; static { ifact = 1; for (int j=2; j<=i; j++) ifact *= j; 19

ö osztalyszint inicializator: az osztaly inicializaciö jakor fut le, az osztalyszint konstruktorokat helyettesıti (hiszen olyanok nincsenek) ö peldanyinicializator: peldanyosıtaskor fut le, a konstruktorokat egeszıti ki; pl. oda ırhatjuk azt, amit minden konstruktorban vegre kell hajtani (nevtelen osztalyoknal is jö, mert ott nem lehet konstruktor) ö tobb inicializalö blokk is lehet egy osztalyban ö vegrehajtas (mind osztaly-, mind peldanyszinten): a valtozö k inicializalasaval osszefesűlve, definialasi sorrendben; nem hivatkozhatnak kes bb definialt valtozö kra ö nem lehet benne return utasıtas ö a peldanyinicializator az osztaly konstruktora el tt fut le, de az sosztalyok konstruktora utan ö nem szoktuk a "tagok" koze sorolni Destruktorok ö marpedig nincsenek, hiszen szemetgy jtes van ö megis, tudomast szerezhetűnk az objektum megsemmisıteser l, ami fontos bizonyos applikaciö knal ö finalize metö dust kell ırni (az Object-ben van definialva). Adott forma protected void finalize() throws Throwable { ö pontosan nem definialt, hogy mikor hıvö dik meg: ami biztos, hogy a tarterűlet u jrafelhasznalasa el tt "Destruktorok" osztalyokhoz ö osztalyszinten is van ilyen: static void classfinalize() throws Throwable { ö ha mar nem rendelkezik peldanyokkal, es mas mö don sem hivatkoznak ra, akkor az osztaly torolhet O rokl des megint ö az orokl des reven kö d-u jrafelhasznalas jon letre, ami í a kö d redundanciajat csokkenti í nem csak a programozast konnyıti meg, hanem az olvashatö sagot es a karbantarthatö sagot is noveli ö az orokl des nem csak kö dmegosztast jelent, hanem altıpus kepzest is í tervezesi szint fogalom ö egy parcialis rendezes Altıpusossa g ö a gyermek rendelkezik a szűl osszes attribu tuma val ö minden esemenyre reagalni tud, amire a szűl ö ezert minden olyan helyzetben, amikor a szűl t hasznalhatjuk, hasznalhatjuk a gyermeket is: í a gyermek tıpusa a sz lö tıpusanak egy altıpusa í (hiszen a tıpus = megszorıtas arra, hogy egy erteket milyen helyzetben szabad hasznalni) 20

Pelda: F nok resze Alkalmazott ö az Alkalmazott m veleteit meghıvhatjuk egy F nokre is F nok f = new F nok("jancsi",20000); f.fizetestemel(20000); int i = (new F nok("juliska")).fizetes(); ö egy Alkalmazott forma lis parameternek a tadhatö egy F nok aktualis Alkalmazott a = new Alkalmazott("Fredi"); if( a.tobbetkeresmint(new F nok("beni")) ) ö egy Alkalmazott tıpusu referencianak ertekűl adhatö egy F nok peldany Alkalmazott a = new F nok("winnetou"); Polimorfizmus, tobbalaku sa g ö ugyanaz a m velet meghıvhatö Alkalmazottal es F nokkel egyarant: tobb tıpussal rendelkezik a m velet ö egy rogzıtett tıpusu (pl. Alkalmazott) valtozö hivatkozhat tobb kűlonboz tıpusu objektumra (Alkalmazott, F nok) ö ez a fajta polimorfizmus az u n. altıpus polimorfizmus (subtype vagy inclusion polimorfizmus). Van masfele is, pl. parametrikus polimorfizmus, ami az Ada generic-re hasonlıt Polimorfizmus: Cardelli-Wegner ö univerza lis í parametrikus í altıpus (inclusion) ö ad-hoc í tıpuskenyszerıtes (coercion) í nevek tu lterhelese (overloading) Pelda parametrikus polimorfizmusra (Ada) generic type T is private; procedure Swap ( a, b: in out T ) is c: T := a; begin a := b; b := c; end Swap; procedure IntegerSwap is new Swap(Integer); procedure BooleanSwap is new Swap(Boolean); a: Integer := 42; b: Integer := 33; IntegerSwap(a,b); Pelda parametrikus polimorfizmusra (funkcionalis nyelvek, pl. Clean) swap :: (a,a) -> (a,a) swap (x,y) = (y,x) swap (42,33) eredmenye (33,42) 21

Va ltozö k tıpusa statikus: a va ltozö deklara ciö ja ban megadott tıpus dinamikus: a valtozö altal hivatkozott objektum tenyleges tıpusa ö a dinamikus mindig a leszarmazottja a statikusnak (vagy maga a statikus) ö a statikus tıpus allandö, de a dinamikus tıpus valtozhat a futas soran Alkalmazott a = new Alkalmazott("Adel"); Fonk b = new Fonk("Balazs"); Alkalmazott c = new Fonk("Cecil"); a = c; a = new Alkalmazott("Andras"); a = b; Object tıpusu va ltozö k ö felelnek meg a tıpus nelkűli mutatö knak í mindenre hivatkozhatnak, ami nem primitıv tıpusó Object o = new Alkalmazott("Olga"); o = new Kor(); nem megy: o.fizetestemel(20000); Alkalmazott a = o; A statikus tıpus szerepe ö Egy objektumreferencia (vagy objektum kifejezes) statikus tıpusa donti el azt, hogy mit szabad csinalni az objektummal í pl. azt, hogy milyen m veletek hıvhatö k meg ra ö Nem szabad peldaul az alabbiakat, mert fordıtasi hiba: Object o = new Alkalmazott("Olga"); o.fizetestemel(20000); Alkalmazott c = new F nok("cecil"); F nok b = c; Kűlonbseg az altıpusossag es a kö dkiterjesztes kozott ö Pelda: í a Negyzet az altıpusa a Teglalapnak í a Teglalap megkaphatö a Negyzetb l u jabb adattagok felvetelevel ö az OO nyelvek tobbsege nem tesz kűlonbseget a kett kozott, mindkett t ugyanazzal a nyelvi eszkozzel (orokl des) tamogatjak ö inkabb az altıpusossag mellett definialjunk orokl dest í tisztabb tervezeshez vezet (esetleg felesleges kö d aran, mint pl. Negyzetben a "b") Java-ban: Er s (strong) tıpusellen rzes ö igyekszik fordıtasi id ben tıpushelyesseget biztosıtani (static typing) ö esetenkent futasi idej ellen rzeseket is csinal (dynamic typing) 22

TıpuskonverziÖ ö automatikus (implicit) ö explicit Automatikus tıpuskonverziö ö altıpusok eseten í szu kebb halmazba tartozo erteket egy búvebb halmazba tartozo ertekkekonvertal 1) objektumok eseten: egy leszarmazott osztalyba tartozö objektumot az sosztalyba tartozö kent kezel int i = (new F nok("juliska")).fizetes(); 2) primitıv tıpusok eseten is definial a nyelv altıpusokat, ıgy: b < c s < i < l < f < d az l < f eseten informaciö vesztes lehet (pontossag) b = 12 is jö, egesz literalt fordıtasi id ben bajtta tud alakıtani a reprezentaciö t meg kell valtoztatni Explicit tıpuskonverziö : tıpuskenyszerıtes ö búvebbúl szu kebbet csinal: adatvesztú, nem biztonsagos ö pl. float-bö l int-et: Math osztaly kerekıt m veletevel ö pl. egeszek sz kıtese eseten a fels bitek vesznek el ö objektumok eseten: ha hiba, akkor ClassCastException megel zes: instanceof operator Object o = new Alkalmazott("Olga"); Alkalmazott a = (Alkalmazott) o; ((Alkalmazott)o).fizetestEmel(20000); Feladat ö Keszıtsd el a SzınesKor osztalyt a Kor osztaly leszarmazottjakent. j m veletei: a szın beallıtasa es lekerdezese. ö Ne vezess be u j adattagot: a szınes korok szınet a kozeppontjuk szıne hatarozza meg, amely nem kozonseges pont, hanem szınes pont. if( o instanceof Alkalmazott ) ((Alkalmazott)o).fizetestEmel(20000); Nevek u jrahasznosıta sa ö Felűldefinialas (redefining) í orokl des menten ö Tu lterheles (overloading) í valtozö vs. metö dus (zarö jelek) í metö dus vs. metö dus (parameterezes) ö Elfedes í peldanyva ltozö vs. metö dus parametere (this) 23

Tu lterhelesre pelda ö Ugyanolyan nevvel tobb m velet. ö A parameterezes donti el, mikor melyikre gondolunk. ö Gondoljunk a konstruktorokra class Alkalmazott { void fizetestemel(){ void fizetestemel( int mennyivel ){ Tu lterhelesre pelda ö Ugyanolyan nevvel tobb m velet. ö A parameterezes donti el, mikor melyikre gondolunk. ö Gondoljunk a konstruktorokra class Alkalmazott { void fizetestemel(){ fizetes += 1000; void fizetestemel( int mennyivel ){ fizetes += mennyivel; Tu lterhelesre pelda ö Ugyanolyan nevvel tobb m velet. ö A parameterezes donti el, mikor melyikre gondolunk. ö Gondoljunk a konstruktorokra class Alkalmazott { void fizetestemel(){ fizetestemel(1000); void fizetestemel( int mennyivel ){ fizetes += mennyivel; class Alkalmazott { Tu lterhelesre pelda public static void main( String args[] ){ Alkalmazott a = new Alkalmazott(); a.fizetestemel(1500); a.fizetestemel(); void fizetestemel(){ fizetestemel(1000); void fizetestemel( int mennyivel ){ fizetes += mennyivel; Felűldefinia la s ö a gyermek osztalyban bizonyos esemenyekre maskepp kell (vagy legalabbis lehet) reagalni, mint a szűl osztalyban: ö a szűl - (vagy s)osztalybeli metö dust felűldefinialjuk a gyermekben class Teglalap { double kerőlet() { return 2*(a+b); class Negyzet extends Teglalap { double kerőlet() { return 4*a; ö orokolt metö dushoz u j definıciö t rendelűnk ö csak peldanymetö dusok eseten 24

Ha mast kell csinalnia Az orokolt metö dus ö hasznalhatö a super.valami() is a felűldefinialt metö dus eleresere class Alkalmazott { int pótlek() { return nyelvvizsgakszama*5000; class F nok extends Alkalmazott { int pótlek() { return nyelvvizsgakszama*5000 + beosztottakszama*1000; class Alkalmazott { int pótlek() { return nyelvvizsgakszama*5000; class F nok extends Alkalmazott { int pótlek() { return super.pótlek() + beosztottakszama*1000; Feladat ö Keszıts tostring m veletet a Pont es a SzınesPont osztalyokhoz, mely az ilyen objektumokrö l adatokat szolgaltat egy String formajaban. (Az adatok az attribu tumok ertekei legyenek.) A metö dus az alabbi specifikaciö val rendelkezzen: public String tostring() Dinamikus kotes (late binding) ö mindig a dinamikus tıpus szerinti m velet hıvö dik meg ö futas kozben valasztö dik ki az a metö dus, ami vegrehajtö dik ö C++ virtual -- Java: teljesen dinamikus Alkalmazott a = new Alkalmazott(); F nok f = new F nok(); int i = a.pótlek(); int j = f.pótlek(); a = f; int k = a.pótlek(); ö meg az orokolt metö dus torzseben is dinamikus kotes van class Alkalmazott { int teljesfizetes() { return fizetes() + pótlek(); Feladat ö A Pont osztalyban definialjunk println metö dust, mely kiırja a pontot a szabvanyos kimenetre. (Ehhez, implicit mö don, az el z feladatban ırt tostring metö dust hasznaljuk.) ö Nezzűk meg, hogyan m kodik az orokolt println metö dus a SzınesPont objektumokon! 25

Felűldefinia la s szaba lyai ö a szignatu ra megegyezik ö a visszateresi tıpus megegyezik ö a hozzaferesi kategö ria: nem sz kıthet private < felnyilvanos < protected < public ö specifikalt kivalthatö kivetelek: nem b vıthet ha a szignatö ra ugyanaz, akkor mar nem lehet tö lterheles, ezert ha a t bbi feltetel nem oke, akkor fordıtasi hiba protected Integer add( Vector v ) throws A, B { public Integer add( Vector v ) throws C { Legyen: class C extends A { Altıpusossag egy megkozelıtese ö "types as sets", tıpusertekhalmazok tartalmazasa ö az altıpusu ertek mindig hasznalhatö, ha a b vebb tıpusu kell ö kontra- es kovariancia, invariancia class X { Integer add( Vector v ) throws A, B { class Y extends X { public Integer add( Vector v ) throws C { X x = new X(); class C extends A { Y y = new Y(); Vector v = new Vector(); A legfontosabb/legelterjedtebb OO nyelvek ö Simula 67 ö Smalltalk ö C++ ö Eiffel ö Java x.add(v) y.add(v) Variancia m velet parameter: invariancia (pl. Java) class Gyerek { class Sıel extends Gyerek { void szobatarsatrendel( Sıel szobatars ){ Sıel szobatars(){ class Sıel Lany extends Sıel { void szobatarsatrendel( Sıel szobatars ){ Sıel szobatars(){ Variancia m velet parameter: kontra-variancia (nem Java!) class Gyerek { class Sıel extends Gyerek { void szobatarsatrendel( Sıel szobatars ){ Sıel szobatars(){ contra-class Sıel Lany extends Sıel { void szobatarsatrendel( Gyerek szobatars ){ Sıel Lany szobatars(){ 26

Variancia m velet parameter: ko-variancia (pl. Eiffel, nem Java!) class Gyerek { class Sıel extends Gyerek { void szobatarsatrendel( Sıel szobatars ){ Sıel szobatars(){ co-class Sıel Lany extends Sıel { void szobatarsatrendel( Sıel Lany szobatars ){ Sıel Lany szobatars(){ A ltalaban megengedhet lenne m velet felűldefinialasa eseten ö kontravariancia (ellentetes valtozas) az alprogram parametereben í a parameter tıpusa b vebb: tobb parametert elfogadö ö a visszateresi ertek tıpusara kovariancia í a visszateresi ertek sz kebb: nem ad olyat vissza, amit az sbeli sem ö ahol egy bennfoglalö tıpusu valamit hasznalok, ott lehet helyette egy altıpusbelit hasznalni; s t, meg tobb kornyezetben hasznalhatom az altıpusbelit, hiszen az specialisabb, tobb informaciö t hordozö Pelda kontravarianciara (NEM JAVA!) Gyerek gy = new Gyerek(); Sıel s1 = new Sıel (), s2 = new Sıel (); Sıel Lany slany = new Sıel Lany(); slany.szobatarsatrendel(gy); s1.szobatarsatrendel(s2); s1.szobatarsatrendel(slany); s1 = slany; s1.szobatarsatrendel(s2); Eiffel-ben (Bertrand Meyer) megengedett m velet felűldefinialasa eseten ö kovariancia (egyűttvaltozas) a felűldefinialt alprogram parametereben í az altıpusbeli m veletben a szűl beli parametertıpusanak egy altıpusa szerepel ö a visszateresi ertek tıpusara is kovariancia Sıel s1 = new Sıel (), s2 = new Sıel (); Sıel Lany slany = new Sıel Lany(); s1.szobatarsatrendel(s2); s1 = slany; s1.szobatarsatrendel(s2); NEM J츐! Meg egy pelda Eiffel-b l ö Egy altıpusbö l elhagyhatö k bazistıpusbö l orokolt m veletek. ö Ez megserti azt a szabalyt, hogy az altıpusu ertek mindig hasznalhatö ott, ahol a bazistıpusu ertek. ö Bizonyos esetekben programozastechnikailag kenyelmes tud lenni. Peldaul: a Madar repűl a Pingvin nem repűl 27

Visszaterve a Java-hoz ö invariancia (nem-valtozas) az alprogram parametereben í az altıpusban a parameter tıpusa ugyanaz, mint a szűl ben ö visszateresi ertekre is invariancia ö viszont kivetelekre (specialis visszateresi ertek) ko-variancia, es lathatö sagra (ami a parameterekre hasonlıt) kontra-variancia ö tu lterheles: a szignatu ra kűlonboz, tehat azt definialja felűl, amivel megegyezik a szignatu ra ö felűldefinialasnal igyekezzűnk meg rizni a jelentest, inkabb csak a kiszamıtas mö dja legyen mas Heterogen adatszerkezetek ö Egy adatszerkezetben tobbfele osztalyu objektumot szeretnenk tarolni. í neha jö, neha nem ö Peldaul a predefinit Vector osztalyban Object-ek vannak. ö Egy tombbe is tehetűnk kűlonboz ket egy k z s ö stıpus alapjan. Test[] t = {new Kocka(42.0),new Gomb(33.0) ; a statikus tıpus ugyanaz, a dinamikus tıpus elterhet Tu lterheles: va laszta s a va ltozatok kozott ö ha a szignatu raban szerepl tıpusok slesza rmazott viszonyban a llnak í fordıtasi id ben tortenik a valasztas í az aktualis parameterek statikus tıpusa dont í altıpusossag lehetseges í "legjobban illeszked " í fordıtasi hiba, ha nincs í tıpuskenyszerıtes í rossz stılus, kerűlend a tobbertelm seg void m(alkalmazott a1, Alkalmazott a2) { void m(alkalmazott a, Fonok f) { void m(fonok f, Alkalmazott a) { Elfedes ö osztalyszint metö dusoknal nincs felűldefinialas + dinamikus kotes ö a statikus metö dusokat elfedni lehet ö nem csak a szignatu ranak kell megegyezni, hanem hasonlö szabalyok mint felűldefinialasnal, kűlonben fordıtasi hiba class A { static void alma(int x){ class B extends A { static void alma(int x){ elfedett elerese: 1 super 1 min sıtes 1 tıpuskenyszerıtes Oszta lymetö dus elfedese Alkalmazott a = new Alkalmazott(); F nok f = new F nok(); a.nyugdıjkorhatar() f.nyugdıjkorhatar() Alkalmazott.nyugdıjKorhatar() ((Alkalmazott)f).nyugdıjKorhatar() class Alkalmazott { static public int nyugdıjkorhatar() { return 65; static public int A_nyugdıjKorhatar() { return nyugdıjkorhatar(); class F nok extends Alkalmazott { static public int nyugdıjkorhatar() { return super.nyugdıjkorhatar() + 5; return Alkalmazott.nyugdıjKorhatar() + 5; 28

statikus kivalasztas 1 (fordıtasi id ben) elfedett elerese 1 orokolt metö duson keresztűl Alkalmazott a = new Alkalmazott(); F nok f = new F nok(); a.nyugdıjkorhatar() f.nyugdıjkorhatar() a = f; a.nyugdıjkorhatar() a.fizetes() a.a_nyugdıjkorhatar() class Alkalmazott { static public int nyugdıjkorhatar() { return 65; static public int A_nyugdıjKorhatar() { return nyugdıjkorhatar(); class F nok extends Alkalmazott { static public int nyugdıjkorhatar() { return super.nyugdıjkorhatar() + 5; return Alkalmazott.nyugdıjKorhatar() + 5; peldanymetö dust nem szabad elfedni class Alkalmazott { static public int nyugdıjkorhatar() { return 65; static public int A_nyugdıjKorhatar() { return nyugdıjkorhatar(); class F nok extends Alkalmazott { static public int nyugdıjkorhatar() { return super.nyugdıjkorhatar() + 5; return Alkalmazott.nyugdıjKorhatar() + 5; static float nyugdıjkorhatar() { NEM JO! static int fizetes(){ NEM JO! Va ltozö k elfedese ö peldany- vagy osztalyszint valtozö k eseten ö statikus kivalasztas ö az elfedett valtozö khoz nem lehet kozvetlenűl hozzaferni, csak í super-es min sıtessel í tıpusos min sıtessel (osztalyvaltozö eseten) í tıpuskenyszerıtessel í orokolt metö duson keresztűl Pelda pelda nyva ltozö elfedesere class a { int x = 0; void pr() { System.out.println(x); class b extends a { int x = 1; void pri(){ System.out.println(super.x); static public void main( String[] args ){ a v = new b(); b w = new b(); System.out.println(v.x + " " + w.x); System.out.println(((a)w).x); v.pr(); w.pr(); w.pri(); A final mö dosıtö szö ö "nem valtoztathatö " í valtozö (peldany, osztalyszint, lokalis, parameter) í metö dus (peldany, osztalyszint ) í osztaly 29

final va ltozö k ö kvazi konstansok í nem valtoztathatö a valtozö erteke, ha mar egyszer beallıtottuk í final double ADOKULCS = 0.25; final va ltozö k ö kvazi konstansok í nem valtoztathatö a valtozö erteke, ha mar egyszer beallıtottuk í final double ADOKULCS = 0.25; ö űres konstansok (a fordıtö eszreveszi a hibat) final static int i = 100; final static int ifact; static { int j = 1; for(int k=1; k<100; k++) j *= k; ifact = j; final va ltozö k ö kvazi konstansok í nem valtoztathatö a valtozö erteke, ha mar egyszer beallıtottuk í final double ADOKULCS = 0.25; ö űres konstansok (a fordıtö eszreveszi a hibat) final static int i = System.in.read(); final static int ifact; static { int j = 1; for(int k=1; k<100; k++) j *= k; ifact = j; final String nev; U res konstans erteke konstruktorokbö l public Alkalmazott( String nev ){ this(nev,100000); public Alkalmazott( String nev, int fizetes ){ this.nev = nev; this.fizetes = fizetes; final valtozö : a referencia nem va ltozhat class A { int v = 10; public static void main( String args[] ){ final A a = new A(); a = new A(); // NEM SZABAD! a.v = 11; 30

final metö dus es osztaly ö "nem valtoztathatö " í nem lehet fel ldefinialni, illetve leszarmaztatni belö le public class Object { public final Class getclass(); public final class System { Pl. ha veszelybe sodorna a rendszer m kodeset Absztrakt osztalyok ö hianyosan definialt osztaly (valami nincs benne keszen) Absztrakt osztalyok ö hianyosan definialt osztaly (valami nincs benne keszen) í bizonyos m veleteknek meg nem adjuk meg az implementaciö jat ö nem lehet bel le peldanyosıtani ö nem lehet bel le peldanyosıtani ö az altıpus relaciö megadasa tervezes szempontjabö l sokszor megkıvanja ö az altıpus relaciö megadasa tervezes szempontjabö l sokszor megkıvanja Absztrakt osztalyok ö hianyosan definialt osztaly (valami nincs benne keszen) í bizonyos m veleteknek meg nem adjuk meg az implementaciö jat í az abstract mö dosıtö szö val jelezzűk ö nem lehet bel le peldanyosıtani Absztrakt osztalyok ö hianyosan definialt osztaly (valami nincs benne keszen) í bizonyos m veleteknek meg nem adjuk meg az implementaciö jat í az abstract mö dosıtö szö val jelezzűk ö nem lehet bel le peldanyosıtani ö az altıpus relaciö megadasa tervezes szempontjabö l sokszor megkıvanja ö az altıpus relaciö megadasa tervezes szempontjabö l sokszor megkıvanja í csak azert kellenek, hogy "igazi" osztalyok kozos viselkedeset csak egyszer kelljen leırni, vagy hogy "igazi" osztalyok kozos ssel rendelkezzenek 31

public abstract class Gyerek { protected Jatek kedvencjatek; // es egyeb attributumok public abstract double mennyireszereti(gyerek masik); public Gyerek legjobbbarat( Gyerek[] osztaly ){ int maxhely = 0; double maxertek = mennyireszereti(osztaly[0]); for( int i = 1; i<osztaly.length; i++ ){ double ertek = mennyireszereti(osztaly[i]); if( ertek > maxertek ) { maxertek = ertek; maxhely = i; return osztaly[maxhely]; Gyerek gyerek = new Gyerek(); public abstract class Gyerek { protected Jatek kedvencjatek; // es egyeb attributumok public abstract double mennyireszereti(gyerek masik); public Gyerek legjobbbarat( Gyerek[] osztaly ){ public class Fiu extends Gyerek { public double mennyireszereti(gyerek masik){ double osszeg = 0.0; if( kedvencjatek.equals(masik.kedvencjatek) ) osszeg += 10.0; return osszeg; public class Lany extends Gyerek { public double mennyireszereti(gyerek masik){ if( masik.kedvencjatek.equals(jatek.doglottmacska) ) return 0.01; if( masik.kedvencjatek.equals(jatek.hajasbaba) ) return 12.0; Feladat ö ValÖ sıtsd meg a Hasab absztrakt osztalyt. Tulajdonsa g: magassa g. Absztrakt m velet: alapterűlet szamıtasa. Masik m velet: terfogat szamıtasa. ö Keszıtsd el a Henger es Kocka osztalyokat, melyek a Hasab konkret leszarmazottjai. public abstract class Hasab { protected double magassag; public abstract double alapterőlet(); public double terfogat(){ return alapterőlet() * magassag; public class Henger extends Hasab { // konstruktorok protected double sugar; public double alapterőlet(){ return sugar*sugar*math.pi; public class Kocka extends Hasab { // konstruktorok public double alapterőlet(){ return magassag*magassag; Hasab h = new Kocka(10.0); Absztrakt osztalyok: osszegezve ö nem pelda nyosıthatö kozvetlenűl, el bb specializalni kell (megvalö sıtani az absztrakt m veleteket) ö a gyerek is lehet absztrakt í akar absztrakt a szűl, akar nem ö absztrakt statikus tıpussal rendelkez valtozö k hivatkozhatnak valamilyen leszarmazott konkret dinamikus tıpusu objektumra í dinamikus kotes hıvaskor ö egy absztrakt metö dus nem lehet private, final vagy static (sem native) 32

Tobbszoros orokl des ö egy osztaly tobb osztalytö l is orokolhet í az osztalyhierarchia egy iranyıtott kormentes graf (de nem feltetlenűl fa vagy erd ) í peldaul: ReszegesEgyetemista, Ketelt Jarm, SzınesNegyzet ö vita a szakirodalomban í nagyon hasznos dolog í problemakat vet fel (allıtö lag) ö Java: kompromisszum (jö? nem jö?) í osztalyokra egyszeres r klúdes, de Tobbszoros orokl des "problema i" ö ugyanolyan attribu tum/metö dus tobbszorosen í class D extends B, C í B.valami C.valami í felűldefinialaskor D.valami ö ismetelt orokl des: ugyanaz tobbszor í class B extends A class C extends A í A.valami Interfeszek ö egy masik referencia tıpus ö az absztrakt osztalyok definıciö jara hasonlıt ö tıpusspecifika ciö -szer seg ö tobbszoros orokl des (altıpus relaciö ) ö nem u j dolog, Objective-C protocol Interfesz: "absztrakt" ö teljesen absztrakt, egyaltalan nincs benne "kö d", csak specifikaciö í pl. nincs metö dustorzs vagy peldanyva ltozö benne public interface Enumeration { public boolean hasmoreelements(); public Object nextelement(); Interfesz: nem peldanyosıthatö ö ugyanu gy, mint az absztrakt osztalyok: nem pelda nyosıthatö kozvetlenűl ö el bb "meg kell valö sıtani" class ListaIterator implements Enumeration { public boolean hasmoreelements(){ public Object nextelement(){ HalmazIterator TombIteraror SorozatIterator stb 33

Interfesz: orokl des ö Interfeszek is kiterjeszthetik egymast: extends ö Akar tobbszoros orokl des is lehet í ha a kö dorokles szintjen gondot is okozhat a tobbszoros orokl des, azert a specifikaciö orokl dese eseten nem ö Az osztalyok megvalö sıthatnak interfeszeket í ugyanazt az interfeszt tobben is í ugyanaz az osztaly tobbet is RelaciÖ k a referencia-tıpusokon ö O rokl des osztalyok kozott í fa (egyszeres orokl des, kozos gyoker) í kö dorokles ö O rokl des interfeszek kozott í kormentes graf (tobbszoros orokl des, nincs kozos gyoker) í specifikaciö oroklese ö MegvalÖ sıtas osztalyok es interfeszek kozott í kapcsolat a ket graf kozott, tovabbra is kormentes í specifikaciö oroklese Interfesz megvalö sıta sa ö Ha az I egy interfesz, J az I egyik se, az A osztaly megvalö sıtja I-t, B leszarmazottja az A-nak, ö akkor B megvalö sıtja J-t. Interfesz: tıpus ö haszna lhatö k va ltozö deklara ciö kban ö hasznalhatö k formalis parameterek specifika ciö ja ban Interfesz: tıpus ö haszna lhatö k va ltozö deklara ciö kban ö hasznalhatö k formalis parameterek specifika ciö ja ban ö egy interfesz tıpusu valtozö : í referencia, ami olyan objektumra mutathat, amely osztalya (kozvetlenűl vagy kozvetve) megvalö sıtja az interfeszt I v = new A(); J w = new B(); 34