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