OOP #14 (referencia-elv)

Hasonló dokumentumok
OOP. #6 (VMT és DMT) v :33:00. Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj.

OOP #1 (Bevezetés) v :39:00. Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj.

OOP #7 (init, done) v :45:00. Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj.

Osztályok. 4. gyakorlat

Java és web programozás

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

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

JAVA PROGRAMOZÁS 2.ELŐADÁS

C++ programozási nyelv Konstruktorok-destruktorok

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

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

.NET (Dot-NET) #1 (Bevezetés)

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

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

Java II. I A Java programozási nyelv alapelemei

és az instanceof operátor

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

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

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

Már megismert fogalmak áttekintése

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

C#, OOP. Osztályok tervezése C#-ban

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

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

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

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

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

Interfészek. PPT 2007/2008 tavasz.

Java II. I A Java programozási nyelv alapelemei

C++ programozási nyelv

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

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

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

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

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

Objektumorientált programozás C# nyelven

Kivételkezelés a C++ nyelvben Bevezetés

5. Gyakorlat. struct diak {

Programozási nyelvek Java

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

A C programozási nyelv III. Pointerek és tömbök.

Memóriakezelés, dinamikus memóriakezelés

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

Bevezetés a C++ programozási nyelvbe

A C programozási nyelv III. Pointerek és tömbök.

C# osztályok. Krizsán Zoltán

OOP. Alapelvek Elek Tibor

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?

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Öröklés és Polimorfizmus

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

Objektumorientált programozás C# nyelven

Objektumorientált programozás IX. Osztályok, objektumok

Programozási alapismeretek 4.

Programozási nyelvek Java

Pénzügyi algoritmusok

8. gyakorlat Pointerek, dinamikus memóriakezelés

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

Alkalmazott modul: Programozás 10. fejezet. Strukturált programozás: dinamikus memóriakezelés. Giachetta Roberto

Objektumorientált Programozás VI.

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

Pénzügyi algoritmusok

Alkalmazott modul: Programozás 8. előadás. Strukturált programozás: dinamikus memóriakezelés. Dinamikus memóriakezelés. Dinamikus memóriakezelés

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?

Bevezetés a Python programozási nyelvbe

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

Bánsághi Anna

Szoftvertechnológia alapjai Java előadások

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

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

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.

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

Programozási nyelvek Java

Vizuális és eseményvezérelt programozás , II. félév BMF NIK

Objektumok inicializálása

C++ programozási nyelv Struktúrák a C++ nyelvben

C memóriakezelés. Mutató típusú változót egy típus és a változó neve elé írt csillag karakterrel hozhatjuk létre.

Apple Swift kurzus 3. gyakorlat

Programozás BMEKOKAA146. Dr. Bécsi Tamás 7. előadás

Generikus Típusok, Kollekciók

ELTE SAP Excellence Center Oktatóanyag 1

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

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

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

Programozási nyelvek Java

Alkalmazott Modul III 6. előadás. Objektumorientált programozás: öröklődés és polimorfizmus

VB C++ C# JScript J# Common Language Specification. ADO.NET and XML. Base Class Library. Common Language Runtime. Operating System

Web-technológia PHP-vel

Objektumorientált programozás C# nyelven

3. Osztályok II. Programozás II

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

Felhasználó által definiált adattípus

Programozási Nyelvek: C++

Programozás II gyakorlat. 8. Operátor túlterhelés

Programozási nyelvek a közoktatásban alapfogalmak II. előadás

JAVA PROGRAMOZÁS 3.ELŐADÁS

Eseménykezelés. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor.

Objektumorientált programozás C# nyelven

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

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

Átírás:

OOP #14 (referencia-elv) v1.0 2003.03.19. 21:22:00 Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj. e-mail: aroan@ektf.hu web: http://aries.ektf.hu/~aroan OOP OOP_14-1 -

E jegyzet másolata nem használható fel szabadon, az előadás anyagának kivonata. Ezen teljes jegyzetről, vagy annak bármely részéről bármely másolat készítéséhez a szerző előzetes írásbeli hozzájárulására van szükség. A másolatnak tartalmaznia kell a sokszorosításra vonatkozó korlátozó kitételt is. A jegyzet kizárólag főiskolai oktatási vagy tanulmányi célra használható! A szerző hozzájárulását adja ahhoz, hogy az EKF számítástechnika tanári, és programozó matematikus szakján, a tárgyat az EKF TO által elfogadott módon felvett hallgatók bármelyike, kizárólag saját maga részére, tanulmányaihoz egyetlen egy példány másolatot készítsen a jegyzetből. A jegyzet e változata még tartalmazhat mind gépelési, mind helyességi hibákat. Az állítások nem mindegyike lett tesztelve teljes körűen. Minden észrevételt, amely valamilyen hibára vonatkozik, örömmel fogadok. Hernyák Zoltán aroan@ektf.hu OOP OOP_14-2 -

Referencia-elv Az objektum-példány definiálása önmagában nem jelent memóriafoglalást. A példányhoz tartozó memóriafoglalás a new operátor hívásakor valósul meg. A new nem a példány alaptípusának foglal helyet, hanem a konstruktor típusa dönti el a memóriafoglalást! A new -al kötelező megadni egy konstruktor-t is. A példány e pillanattól kezdve ezen memóriaterületre vonatkozó referenciát (hivatkozást) tartalmaz. Ez nagyon hasonlít egy pointerre. Referencia-elv OOP_14-3 -

A különbség az, hogy az objektumhoz tartozó memóriaterületet az operációs rendszer elmozgathatja, a referencia azonban továbbra is azonosítja a területet. A pointer a memória kezdőcímét tartalmazza, ha az operációs rendszer elmozgatja a foglalt területet, a pointer már rossz helyre mutatna. Ha két példány között értékadás műveletet hajtunk végre, akkor a referencia másolódik csak át: TMasodik m1 = new TElso(); TMasodik m2 = m1; Referencia-elv OOP_14-4 -

Ugyanez történik objektumokkal kapcsolatos paraméterátadásakor is! void Berak(TMasodik m) { m.szam = 20; } TMasodik x = new TMasodik(); x.szam = 10; Berak( x ); Console.WriteLine( x.szam ); // 20!!!! Az objektum típusú paraméterek ezért akkor is ref típusú paraméterek, ha azt nem jelöljük a paraméter-módosítóval. Referencia-elv OOP_14-5 -

Null-referencia A példányok valójában referencia-típusúak (reference type) TMasodik m; Ez egy m nevű referenciát definiál, mely 4 byte-ot foglal el, és induláskor még nem tartalmaz referenciát egyetlen memóriaterületre sem: A nem létező referencia a null konstans. Pl: if (e==null) Console.WriteLine( A példány még nem létezik ); Null-referencia OOP_14-6 -

Referencia és típuskompatibilitás TMasodik m = new TMasodik (); TElso e = m; // rendben, típuskompatibilis e.szam = 10; Console.WriteLine( m.szam ); // 10-et ír ki e használható, de mivel az ő alaptípusa TElso, a fordító úgy tekint rá, mintha ő valódi TElso lenne, ezért e -nek csak olyan mezői és metódusai vannak (szerinte), amelyek a TElso-ben vannak definiálva. e ugyanaz mint az m, de visszabutítva TElso szintre, vagyis e mezőinek az értéke ugyanaz, mint m -nek, de a korai kötések a TElso szerint működnek Referencia és típuskompatibilitás OOP_14-7 -

Az e VMT-je a TMasodik-é, ezért a késői kötések a TMasodik szerint működnek! TElso e; // nem jön létre még a változó TMasodik temp = new TMasodik(); e = temp; Összevonva egy sorba: TElso e = new TMasodik(); //!!!!! jó OOP_14-8 -

Minden olyan változó referencia elven van kezelve, amelynek típusa class. Ez nem minden esetben jó! int a = 10; int b = a; a = 20; // b=20 szintén!?! nem!!! A nyelv építőkő jellegű alaptípusai nem lehetnek referencia-elvűek. Ezen típusok érték típusú (value type) adatok. Értékadáskor csak a bennük tárolt érték másolódik át. Az OOP nyelveken nem lehet olyan típus, amelyik nem OOP típus! Minden olyan változó referencia elven van kezelve, amelynek típusa class. OOP_14-9 -

Ezért a nyelvek kétfajta objektum-típust támogatnak (kétféle módon lehet osztályt definiálni): A class kulcsszóval Y referencia elvű példány A struct kulcsszóval Y érték típusú példány Az enumeration típusú változók is érték típusúak Ezért a nyelvek kétfajta objektum-típust támogatnak (kétféle módon lehet osztályt definiálni): OOP_14-10 -

Ha C#-ban a struct-al definiálunk egy példányt Nem kell a new kulcsszót használni a példányosításhoz Ha nem használjuk a new kulcsszót, akkor a struktúra mezőinek nem lesz kezdőértéke (memóriaszemét) Ilyen osztály mezőire nem használhatunk kezdőértékadást. Ezért a struct-nak általában van konstruktora A paraméter nélküli (default) konstruktort a nyelv automatikusan készíti. Mi csak paraméteres konstruktort készíthetünk! A struct típus korlátozott OOP tulajdonságokkal rendelkezik, pl. nem működik rá az öröklődés semmilyen formában (egy struct nem lehet ős, ő nem lehet gyermek) Ugyanakkor a struct őse is az Object Viszont implementálhat interface-t A példányosítás kevesebb memóriát igényel, mert a példány nem kerül +4 byte-ba a referencia tárolása miatt. Ha C#-ban a struct-al definiálunk egy példányt OOP_14-11 -

A nyelv alaptípusai (int, double, boolean, char, ) mind struct típusúak, hogy a kifejezésekben a szokott módon használható legyenek. Amíg a struktúra mezői nincsenek feltöltve, addig nem használható Ezért az int a; deklaráció után az a változó még nem használható fel. Az int a=0; után már igen! Ez akár az alábbi formában is írható: int a = new int(); OOP_14-12 -

Referencia-elv előnyei: garbage collector működését támogatja nem pointer, ezért a memóriaterület áthelyezhető (windows memóriakezelés mellett ez sűrűn előfordul ) Hátrányai: Nem minden esetben egyértelmű a viselkedés Referencia-elv előnyei: OOP_14-13 -

Pl: class THallgato { public string nev; public int[] jegyek=new int[20]; } class IskolaiOsztaly { private System.Collections.ArrayList tanulok; public THallgato this[int index] { get { return (THallgato)tanulok[index]; } } } Ebben az esetben azt hihetnénk, hogy a csak olvasható propertyben visszaadott THallgato is csak olvasható lesz. De nem! Pl: OOP_14-14 -

int[] vektor = new int[10]; foreach(int a in vektor) // a változó felveszi a megfelelő értéket { // a értéke csak olvasható a = 10; //hibás // // mert ha beleírnánk, az nem a megfelelő } // tömbelem értékének átírását jelentené THallgato[] vektor = new THallgato[10]; foreach(thallgato a in vektor) // az a értéke itt sem írható { // de az a által referált objektum a.nev = ismeretlen ; // mezői átírhatóak, vagy meghívható- } // ak a metódusai OOP_14-15 -

void akarmi(int a) // érték szerinti paraméterátadás { a = 10; } int x = 20; akarmi(x); Console.WriteLine(x); // még mindig 20 void akarmi(thallgato a) // érték szerinti paraméterátadás, de ref! { a.nev = Jancsi ; } THallgato x = new THallgato(); x.nev = Juliska ; akarmi(x); Console.WriteLine(x.nev); // ez már Jancsi void akarmi(int a) // érték szerinti paraméterátadás OOP_14-16 -

A string típus azonban referencia típusú, de az értékadás mindig új string létrehozását jelenti! void akarmi(string a) // érték szerinti paraméterátadás, de ref! { a = Jancsi ; // új string létrehozása!!! } string x = Juliska ; akarmi(x); Console.WriteLine(x.nev); // ez még mindig Juliska string a = Jancsi ; a = a.toupper(); // ennek során valójában új string jön létre, // és a régi megszűnik (garbage collector!) void akarmi(string a) // érték szerinti paraméterátadás, de ref! OOP_14-17 -

a = a+ és Juliska ; // ennek során új string jön létre, amely értéke // a Jancsi és Juliska, és a régi string megszűnik string a = Jancsi ; Console.WriteLine(a+ és Juliska ); A fv hívásakor (röptében) létrejön egy string, amely tartalmazza az összefűzött szöveget, az a továbbra is csak a Jancsi szöveget tartalmazza a fv futása után is (nem változott a referencia). string a = Jancsi ; string b = és ; string c = Juliska ; string x = a + + b + + c; // mindig új string-ek jönnek (4 esetben) a = a+ és Juliska ; // ennek során új string jön létre, amely értéke OOP_14-18 -