Programmieren I. Kapitel 12. Referenzen

Ähnliche Dokumente
FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

Vorlesung Programmieren

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II a[0] a[1] a[2] a[3] a[n 1]

Überblick. Peer Kröger (LMU München) Einführung in die Programmierung WS 14/ / 595

Praxis der Programmierung

Einführung in die Programmierung

Java Referenzdatentypen genauer betrachtet

3.8 Objekttypen und Arrays. Wir werden uns in diesem Kapitel näher mit den Objekttypen in Java beschäftigen.

Programmieren in Java

6 Speicherorganisation

Algorithmen und Datenstrukturen

Kapitel 10. Verweise und Referenzen. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Informatik. Pointer (Dynamisch) Vorlesung. 17. Dezember 2018 SoSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 1

8. Referenzen und Zeiger

Algorithmen und Programmierung II

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Tag 8 Repetitorium Informatik (Java)

Programmierung und Angewandte Mathematik

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Organisatorisches. Folien (u.a.) gibt's auf der Lva-Homepage zum Download

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Einstieg in die Informatik mit Java

Arrays. Einleitung. Deklarieren einer Array Variablen

Variablen. int Flugzeug. float. I write code Hund. String. long. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel

2. Programmierung in C

Variablen und Parameter

Objekttypen. Referenzen, Objekte, Gleichheit, Wrapper, Arrays, mehr-dimensionale Arrays, Bildbearbeitung, krumme Arrays

5.4 Arrays. Oft müssen viele Werte gleichen Typs gespeichert werden. Idee: Lege sie konsekutiv ab! Greife auf einzelne Werte über ihren Index zu!

12 Abstrakte Klassen, finale Klassen und Interfaces

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18

Zeiger. C-Kurs 2012, 2. Vorlesung. Tino Kutschbach 10.

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Variablen in Java. Martin Wirsing. in Zusammenarbeit mit Michael Barth, Philipp Meier und Gefei Zhang. Ziele

Java I Vorlesung 6 Referenz-Datentypen

2.8 Klassen. Nichtgleichartige Elemente können in Klassen zu einem neuen Typ zusammengefasst werden. Beispiel: Die drei Komponenten

Zeiger (engl. Pointer)

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Inhalt. 4.5 Arbeit mit Zeigern (engl. Pointer)

Informatik II Übung 05. Benjamin Hepp 3 April 2017

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

4. Vererbung Die Klasse Object. Die Klasse Object

Java Methoden. Informatik 1 für Nebenfachstudierende Grundmodul. Kai-Steffen Hielscher Folienversion: 1. Februar 2017

C++ Teil 6. Sven Groß. 23. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 15

C++ - Einführung in die Programmiersprache Zeiger, Referenzen und Strukturen. Leibniz Universität IT Services Anja Aue

6 Speicherorganisation

6. Verkettete Strukturen: Listen

Organisatorisches. Folien (u.a.) auf der Lva-Homepage Skriptum über MU Online

Vorkurs Informatik WiSe 15/16

Informatik II - Tutorium 5

Betriebssysteme, Rechnernetze und verteilte Systeme 1. Crashkurs C (2)

Algorithmen und Datenstrukturen 07

Parameterübergabemechanismen für den Methodenaufruf

pue13 January 28, 2017

Crashkurs C++ - Teil 1

Dynamische Speicherverwaltung

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Rechtsbelehrung. Java und OOP Das Buch Christian Silberbauer 144

Einführung in die Programmiersprache C

Informatik II Übung 5

7. Verkettete Strukturen: Listen

Java Virtual Machine (JVM) Bytecode

Repetitorium Programmieren I + II

Welche Informatik-Kenntnisse bringen Sie mit?

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

C++ Teil 5. Sven Groß. 8. Mai IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 8. Mai / 16

Einführung Pointer. C-Kurs 2013, 2. Vorlesung. Nico Andy

C++ Teil 7. Sven Groß. 30. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 13

Einstieg in die Informatik mit Java

C- Kurs 08 Zeiger. Dipl.- Inf. Jörn Hoffmann leipzig.de. Universität Leipzig Ins?tut für Informa?k Technische Informa?

C++ Teil 6. Sven Groß. 27. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 14

Programmieren I. Arrays Heusch 7.2 Ratz Institut für Angewandte Informatik

Agenda. Informatik I WS05/06 Folien von Tobias Dezulian

Funktionen: Rückgabewert

Arrays,Strings&Pointer in C/C++

Umsetzung einer Klassenkarte in einer Programmiersprache

Programmierwerkstatt. Arrays, Pointer und Referenzen

Programmierung mit C Zeiger

Praxis der Programmierung

1. Referenzdatentypen: Felder und Strings. Referenz- vs. einfache Datentypen. Rückblick: Einfache Datentypen (1) 4711 r

1. Referenzdatentypen: Felder und Strings

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Java Kurs für Anfänger Einheit 5 Methoden

Mehrdimensionale Arrays

9 Zeiger (Pointer). Dynamischer Speicher

n 1. Grundzüge der Objektorientierung n 2. Methoden, Unterprogramme und Parameter n 3. Datenabstraktion n 4. Konstruktoren n 5. Vordefinierte Klassen

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Programmieren in Java

Zeiger in C und C++ Zeiger in Java und C/C++

Grundlagen der Objektorientierten Programmierung - Methoden -

Informatik II SS Inhalt. Objektlebensdauer (2/3) Objektlebensdauer (1/3)

Objektorientierung (OO)

Java programmieren mit JavaKara. Eine Zusammenfassung in Beispielen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 9. Arrays. Arrays 1

F Zeiger, Felder und Strukturen in C

Algorithmen und Datenstrukturen

Einstieg in die Informatik mit Java

Durch die Teil-von-Beziehung soll ausgedrückt werden, dass ein Objekt A als (physikalischer) Teil eines Objekts B angesehen wird. Insbesondere kann ei

Transkript:

Programmieren I Kapitel 12. Referenzen

Kapitel 12: Referenzen Ziel: Die Wahrheit über Objekte Lebensdauer Speicherverwaltung Parameterübergabemechanismen in Methoden Gleichheiten, Kopien Arrays Speicherbereinigung

Lebensdauer dynamisches Konzept: Lebensdauer einer Inkarnation Beispiele: Lebensdauer eines Programms: seine Laufzeit vom Start bis Ende eines Objekts: vom Generieren mit new bis zum (automatischen) Löschen einer Methode: vom Aufruf bis zur Rückkehr Beispiel: int fac(int n) { if(n==0) {return 1;} else {return n*fac(n 1);} } fac(3) fac(2) fac(1) fac(0)

Lebensdauer von lokalen Variablen vs. Objekten Point foo() { Point p = new Point(1,1); Point q = new Point(2,2); return q; } Point (1,1) lebt bis zum Methodenende einzige Variable p, in die er gespeichert wird, lebt nur bis zum Methodenende Point (2,2) lebt darüber hinaus die Variable q, in die er gespeichert wird, lebt zwar nur bis zum Methodenende, aber da er als Ergebnis zurückgegeben wird, muss das Objekt auch nach dem Methodenende noch erhalten bleiben / leben

Mehr Wahrheit über den Speicher Der Speicher ist (mindestens) in zwei Teile aufgeteilt: den Stack und den Heap lokale Variablen und Parameter liegen am Stack Objekte liegen auf dem Heap Folge: die Vorstellung, dass durch Point p = new Point(1,1); ein Objekt kreiert und auf dem Speicherplatz p abgelegt wird, ist falsch!

Mehr Wahrheit über den Speicher Richtig ist, dass das Objekt kreiert und irgendwo an einer Speicherstelle ab Adresse x im Heap gespeichert wird. In der lokalen Variablen p steht dagegen nur die Adresse x. Dort steht also nur ein Zeiger, Pointer, Verweis oder in Java Sprache eine Referenz auf das Point(1,1) Objekt Unterschied zischen guten Java Referenzen und bösen C/C++ Pointern: mit letzteren kann man rechnen um sie zu manipulieren, wogegen man in Java nur immer Referenzen auf bereits kreierte Objekte setzen kann. Vorteil: Sicherheit und Typisierung bei Java Referenzen

Beurteilung von Referenzen Positiv: speicher und laufzeitsparend, weil nur die Referenzen und nicht die großen Objekte beim Programmablauf weitergegeben werden keine Kopien, die Speicher kosten und veralten Zugriff auf dasselbe Objekt einfach von mehreren Stellen aus möglich (je nach Anwendung nötig) Negativ: Zugriff auf dasselbe Objekt einfach von mehreren Stellen aus möglich (Sicherheit) ein Indirektionsschritt beim Zugriff nötig

Funktionsweise von Referenzen Point p; int n; p = new Point(); n = 5; Point q = p; int k = n; q.x = 3.2 k = 4; 5 5 4 x: 3.2 y:

Referenzen und Methodenaufrufe void foo(point s, int i) { s.x=3.2; i=5; } /// 4 5 Point p; int k; foo(p,k); 4 call by value: Werte in Funktion hineinkopieren, keine Rückgabe an Aufrufer call by reference: durch Verwendung einer Referenz: Änderungen beim Aufrufer möglich x: 3.2 y:

Referenzen und Methodenaufrufe Java macht immer call by value. Da Objekte aber immer Referenzen sind, scheint Java call by reference für die Objekte zu machen. Würde Java call by reference machen, könnte man auch ein komplett neues Objekt zurückgeben, aber: Änderungen des Wertes von s wirken sich in Java nicht beim Aufrufer aus => Java hat nicht CbR. Nebenbei: auch bei foo(final Point s,...) wäre der Zugriff im Beispiel erlaubt; nur eine (ohnehin nur lokal sichtbare) Änderung von s selber ist damit verboten

Nebenbei: call by reference void foo(point s, int i) { s.x=3.2; i=5; } Point p; int k; foo(p,k); /// 4 5 x: 3.2 call by value: Werte in Funktion hineinkopieren, keine Rückgabe an Aufrufer call by reference: durch Verwendung einer Referenz: Änderungen beim Aufrufer möglich y:

this this ist eine Referenz auf sich selbst, also das eigene Objekt, die eigene Speicheradresse Es ermöglicht das Zurückgeben von z.b. einem neuen Objekt in den einen Fällen oder von dem alten (this) in anderen Fällen. Es ermöglicht Abfragen, ob ein Objekt o == this ist Damit klar: die Gleichheit auf Objekten ist keine semantische Gleichheit (womöglich in Abhängigkeit von den Eigenschaften der gespeicherten Attribute), sondern die reine Objektidendentität (Speicheradressengleichheit).

null null ist eine ausgezeichnete Referenz, die auf kein Objekt verweist. null ist der Defaultwert für automatisch initialisierte Pointer. Wenn null (aus Versehen) dereferenziert wird, liefert das Programm zur Laufzeit eine Fehlermeldung, eine sog. NullPointerException. Manchmal setzt man eine Referenz Variable p absichtlich auf null, um damit klarzumachen, dass diese Referenz p auf das Objekt nicht mehr benötigt wird (siehe Speicherbereinigung).

Gleichheiten/Äquivalenzen Um zwei Objekte als semantisch gleich (besser äquivalent) zu definieren, kann man die vordefinierte Methode equals überschreiben. Typ: public boolean equals(object o) kann genau mit diesem Typ überschrieben werden. Dabei muss im Rumpf natürlich o in den eigentlichen Typen gecastet werden, um die nötigen Attributzugriffe zu ermöglichen. Beachte: Definition als public boolean equals(point p) liefert eine neue, überladene Methode.

Kopien Kopien kann man nicht einfach durch q=p realisieren. Es muss ein neues Objekt kreiert und mit denselben Attributen belegt werden. In Java geschieht das mit der vordefinierten Methode clone(), die ein Objekt liefert, das eine Bitkopie des Originals ist. Dazu muss man aber für die zu klonende Klasse angeben... implements Cloneable... Anwendung: Point r = (Point)(p.clone()); Warnung: clone ist keine deep copy (Objektreferenzen als Attribute nur Referenzkopien!)

Arrays Arrays sind Objekte und Array Variablen damit nur Referenzen. Folge: nach String[] a = { a0, a1, a2, a3 }; String[] b = a; b[0] = b0 ; ist a[0] mit b0 belegt. Jedes mehrdimensionale Array ist ein eindimensionales Array (der äußersten Dimension), dessen Einträge die Referenzen auf die (evtl. mehrdimensionalen) Arrays der zweitäußersten Dimension sind. Folge: flexible Längen und Querverweise

Garbage Collection (Speicherbereinigung) Definition: die Beseitigung nicht mehr benötigter Objekte aus dem Speicher Wenn die letzte Referenz auf ein Objekt gelöscht wird (durch Zuweisung auf ein anderes Objekt oder auf null, oder durch Ende des Gültigkeitsbereichs der lokalen Variablen), kann auf das Objekt nicht mehr zugegriffen werden. Im Gegensatz zu C, C++ oder Pascal macht der Compiler die Buchführung (Korrektheitsgründe!), d.h., die Freigabe des Speichers geschieht in Java automatisch.

Zusammenfassung Lebensdauern von Programmen, Methoden, Objekten, Variablen Speicherverwaltung Heap/Stack, Referenzen Parameterübergabemechanismen call by value, call by reference Gleichheiten, Kopien equals, clone Arrays auch mehrdimensional Garbage Collection