Parameterübergabemechanismen für den Methodenaufruf

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

der Universität Oldenburg
Einführung in die Programmierung Zusammenfassung
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Progwerkstatt JAVA Klasse, Objekte, Konstruktoren, Methoden
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
FH-Hof Indirekte Adressierung Richard Göbel. FH-Hof Einfache Speicherung von Daten Eine "einfache" Deklaration definiert direkt eine Speicherplatz für.
Java: Grundlagen der Objektorientierung
Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen...
Polymorphie (Vielgestaltigkeit)
Polymorphie (Vielgestaltigkeit)
Objekte und Arbeitsspeicher
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 3 Klassen, Objekte, Arrays und Kontrollstrukturen Sommersemester 2003 Lars Bernard.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Imperative Programmierung Funktionen und Parameter
Einführung in die Programmierung mit Java
Java-Kurs - 7. Übung Besprechung der Hausaufgabe Referenzvariablen
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
PKJ 2005/1 Stefan Dissmann Zusammenfassung der Vorwoche Variable stehen für (einen) Wert, der sich im Programmablauf ändern kann. Variablen besitzen einen.
Zusammenfassung Vorwoche
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
Listen Prof. Dr. Christian Böhm in Zusammenarbeit mit Gefei Zhang
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
DVG Klassen und Objekte
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
Einführung in die Programmierung Klassendefinition und Objekte
© 2002 Dr. Cavelius - Ley - Pohlig - Taulien Programmierung im Netz und Internet: Einführung in die Programmiersprache Java Teil I 1 Klassen Objekte von.
UML Begleitdokumentation des Projekts
Sitzung 3: Klassen, Objekte, Arrays und Kontrollstrukturen
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Einführung in die Programmierung
IT2 – WS 2005/20061Oct 10, 2005 Externes Verhalten – Quelltext (source code) Durch Aufrufe der Konstruktoren und Methoden kann das externe Verhalten (=die.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
EPROG Tutorium Einheit 4 Klassen und Objekte. Wiederholung Schleifen do... while while for break/continue Strings String char Methoden für Strings Arrays.
1. Verhalten der Objekte: Operationen Werden in den Klassen definiert Werden (i.d.R.) auf einem Objekt aufgerufen Wird das Empfängerobjekt genannt Weitere.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Programmierung Wintersemester 2011/12 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Objektorientiertes Konstruieren
Variablenkonzept Klassisch, in Java Basistyp
Grundlegende Sortieralgorithmen
CuP - Java Vierte Vorlesung Entspricht ungefähr Kapitel 2.1 des Skriptums Montag, 14. Oktober 2002.
Programmiervorkurs WS 2014/15 Instanzmethoden
Paul, Morten, Yannick Blue J. Entwicklungsumgebung  versteht Java Programmcode  Für die Entwicklung eigener Software  Durch die Programmierung.
Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  Verwendung von.
Robuste Programme durch Ausnahmebehandlung
Vererbung Prof. Dr. Christian Böhm in Zusammenarbeit mit Gefei Zhang
Einführung in die Programmierung mit Java
Java-Kurs - 5. Übung Besprechung der Übungsaufgabe Klassen und Objekte
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Thomas H. Kolbe Einführung in die Programmierung mit Java 7. Vorlesung WS 2002/2003.
Java Programme nur ein bisschen objektorientiert.
Tutorium Software-Engineering SS14 Florian Manghofer.
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
Grundkurs Informatik 11-13
Michael Barth, Fabian Birzele und Gefei Zhang
Implementieren von Klassen
 Präsentation transkript:

Parameterübergabemechanismen für den Methodenaufruf Methode, griech. der Weg zu etwas, planmäßiges Verfahren - Brockhaus Parameterübergabemechanismen für den Methodenaufruf Prof. Dr. Christian Böhm in Zusammenarbeit mit Gefei Zhang http://www.dbs.ifi.lmu.de/Lehre/NFInfoSW

Ziele Wiederholung der wichtigsten Begriffe bei Klassen Verstehen des Parameterübergabebegriffs von Java Verstehen der Unterschiede zwischen Call-by-Value und Call-by-Reference

Klasse Point Attribut public class Point (engl. field) { private int x,y; public Point(int x0, int y0) { this.x = x0; this.y = y0; } public void move(int dx, int dy) { this.x = this.x + dx; this.y = this.y + dy;   public int getX() { return this.x; public int getY() { return this.y; Methode Konstruktor (dient zur Erzeugung von Objekten der Klasse Point)

Klasse Point public class Point { private int x,y; public Point(int x0, int y0) { this.x = x0; this.y = y0; } public void move(int dx, int dy) { this.x = this.x + dx; this.y = this.y + dy;   public int getX() { return this.x; public int getY() { return this.y; vordefinierte lokale Variable this bezeichnet das gerade betrachtete Objekt Instanz-variable

UML: Geschichtliche Entwicklung UML ist die “de facto” Standard-Modellierungssprache im Software Engineering UML wurde entwickelt von Grady Booch, Jim Rumbaugh (OMT), Ivar Jacobson (OOSE), ... UML enthält unterschiedliche Diagrammtypen zur Beschreibung der statischen Struktur und des dynamischen Verhaltens von Softwaresystemen. Wichtige Diagrammtypen sind Klassendiagramme Sequenzdiagramme Aktivitätsdiagramme Zustandsübergangsdiagramme (State Machines)

UML im Software-Entwicklungsprozess

Software-Entwicklungsprozess Software-Entwicklung ist ein iterativer Prozess, der folgende Phasen durchläuft: Projektdefinition Analyse Entwurf Implementierung Betrieb und Wartung In dieser Einführungsvorlesung beschäftigen wir uns hauptsächlich mit Implementierung und Entwurf (kleiner) Programme Weiterführende Vorlesungen: Objekt-orientierte Software-Entwicklung Methoden des Software Engineering

Modellierung in UML Point UML Klassendiagramme dienen zur Modellierung von Klassen und ihrer Beziehungen untereinander (siehe später) Für Klassen werden angegeben der Klassenname, die Attribute und Methoden. Da Konstruktoren Standardnamen besitzen, werden sie meist NICHT explizit angegeben. Beispiel: Point Point -int x -int y +void move (int dx, int dy) +int getX () +int getY () „-“ für private „+“ für public

Verwendung von Konstruktoren Ein neues Objekt der Klasse Point mit den Anfangswerten a, b wird erzeugt durch den Ausdruck new Point(a, b); Beispiel: Point p = new Point(5, 7); legt im Keller die lokale Variable p an und erzeugt auf der Halde ein neues Point-Objekt mit den Koordinaten 5, 7 . :Point x = 5 y = 7 i p 3 

Methodendeklaration Eine Methodendeklaration hat die Form: formaler public type methodName(params) {body} formaler Parameter Ergebnistyp Rumpf der Methode Kopf der Methode } Beispiel: public void move(int dx, int dy) { this.x = this.x + dx; this.y = this.y + dy; }

Methodenaufruf: Verwendung von Methoden Ein Methodenaufruf hat die Form o.m(a1, a2); Beispiel: p.move(10, 10); Es gibt verschiedene Techniken zur Ausführung eines Methodenaufrufs: Wertübergabe (Call by Value) Adressübergabe (Call by Reference) Java verwendet Call by Value. aktuelle Parameter

Call-by-Value-Parameterübergabe formale Parameter aktuelle Parameter Call-by-Value Sei gegeben Methodendeklaration: void m (D x1, int x2) {Rumpf} Aufruf: o.m(a1, a2); Schritt: Berechne die Werte o1, v1, v2 der aktuellen Parameter o, a1, a2 und weise diese Werte dem impliziten Parameter this und den formalen Parametern x1, x2 zu, die als lokale Variablen des Rumpfs verwendet werden. Schritt: Werte den Rumpf von m aus. Schritt: Bei Beendigung der Auswertung des Rumpfs werden die lokalen Variablen this, x1, x2 gelöscht (durch Zurücksetzung des „Top-Zeigers“ des Laufzeitkellerspeichers).

Call-by-Value-Parameterübergabe Beispiel: int i = 2; Point p = new Point(1,1); // (1) p.move(i, 2+2); // (2)

Call-by-Value-Parameterübergabe: Beispiel Zum Zeitpunkt (1) habe der Speicher die Form Adresse von p auf der Halde @345 :Point x = 1 y = 1 i p 2  Beim Aufruf werden drei lokale Variablen angelegt, die Werte von p (= @345 ), i (= 2) und 2+2 (= 4 im Bsp.) berechnet und die Initialisierungen this = @345; dx = 2; dy = 4; mit diesen Werten ausgeführt: :Point x = 1 y = 1 i p this dx dy 2  4 Verstehen der Grunddatentypen von Java item Verstehen von Typkonversion in Java item Lernen lokale Variablen und Konstanten zu initialisieren item Verstehen der Speicherorganisation von lokalen Variablen item Lernen Fallunterscheidungen zu bilden und iterative Programme zu schreiben item Lernen Kontrollflußdiagramme als Entwurfsnotation einzusetzen item Wiederholen der Regeln des Hoare-Kalkül für while--Programme

Call-by-Value-Parameterübergabe: Beispiel Dann wird der Rumpf this.x = this.x + dx; this.y = this.y + dy; ausgeführt: :Point x = 3 y = 5 i p this dx dy 2  4 Zum Zeitpunkt (2) sind die lokalen Variablen this, dx und dy des Blocks wieder gelöscht: :Point x = 3 y = 5 i p 2 

Call-by-Value mit Objektparameter Beispiel: Erweitere die Klasse Point (zu einer Klasse PointClr mit Test PointClrMain) um die Methode moveNClear, die das aktuelle Objekt um die Koordinaten von q verschiebt und dann q auf den Ursprung setzt. public void moveNClear (Point q) { int dx = q.getX(); int dy = q.getY(); this.move(dx, dy); q.move(-dx, -dy); }

Call-by-Value mit Objektparameter Aufruf p1.moveNClear(q1); mit :Point x = 1 y = 2 :Point x = 3 y = 3 p1 q1  Schritt 1: Übergabe der aktuellen Parameter an this, q :Point x = 1 y = 2 :Point x = 3 y = 3 p1 q1 this q 

Call-by-Value mit Objektparameter Aufruf p1.moveNClear(q1)mit :Point x = 1 y = 2 :Point x = 3 y = 3 p1 q1  Schritt 1: Übergabe der aktuellen Parameter an this, q :Point x = 1 y = 2 p1 q1 this q  :Point x = 3 y = 3 dx dy 3 3

Call-by-Value mit Objektparameter Schritt 2: Ausführung des Rumpfs a) Berechnung von int dx = q.getX(); int dy = q.getY(); ergibt x = 3 y = 3 :Point x = 1 y = 2  q1 p1 q this  dx dy 3 3

Call-by-Value mit Objektparameter Schritt 2: Ausführung des Rumpfs b) Aufruf von this.move(dx, dy); legt im Keller neue lokale Variablen für die formalen Parameter von move an, die am Ende der Ausführung von this.move(dx, dy); wieder gelöscht werden. x = 3 y = 3 :Point x = 1 y = 2  q1 p1 Impliziter Parameter von p1.moveNClear(q1); = aktueller Parameter von this.move(dx, dy); q this  Impliziter Parameter von this.move (dx,dy); dx dy this 3 3 3 3

Call-by-Value mit Objektparameter Schritt 2: Ausführung des Rumpfs c) Berechnung von this.move(dx, dy); q.move(-dx, -dy); ergibt x = 0 y = 0 :Point x = 4 y = 5  q1 p1 q this  dx dy 3 3

Call-by-Value mit Objektparameter Schritt 3: Nach Beendigung der Ausführung des Rumpfs: Löschen der lokalen Variablen this, q . x = 0 y = 0 :Point x = 4 y = 5  q1 p1

Call-by-Value-Parameterübergabe Folgerung Da bei Call-by-Value die Werte der aktuellen Parameter an lokale Variablen (des Rumpfs) übergeben werden, die aktuellen Parameter aber selbst unangetastet bleiben, ändern sich die Werte der aktuellen Parameter nicht. Es können aber die Werte der Instanzvariablen eines aktuellen Parameters (vom Objekttyp) verändert werden.

Call-by-Value und Call-by-Reference In anderen Programmiersprachen (wie C++, Ada, C,...) gibt es neben Call-by-Value auch den Parameterübergabemechanismus Call-by-Reference (Adressübergabe). Gegeben sei eine Methodendeklaration type m(T &x) {body} // nicht in Java! und ein Aufruf o.m(p); nicht in Java Referenz auf einen Wert von T

nicht in Java Call-by-Reference Schritt 1: Übergabe des Werts von o an this und der Adresse von p an x Schritt 2: Ausführung von body. Änderungen von x werden unter der Adresse von p gespeichert, d.h. direkt am aktuellen Parameter ausgeführt. Schritt 3: Am Ende werden this und x gelöscht.  Änderung des Werts von p möglich nicht in Java

nicht in Java Call-by-Reference Beispiel: choose Call-by-Reference: higherPoint wird als Referenz (auf einen Zeiger auf Point) übergeben. Call-by-Value für this und q. Beispiel: choose „Wähle Punkt mit der größeren y-Koordinate“ public void choose(Point q, Point &higherPoint) { if (this.getY() >= q.getY()) higherPoint = this; else higherPoint = q; //(2) } public static void main(String[] args) { Point p1 = new Point(1,1); Point q1 = new Point(2,2); Point r; // (1) p1.choose(q1, r); // (3) ... Bei der Ausführung werden Änderungen von higherPoint unter der Adresse des aktuellen Parameters gespeichert. nicht in Java

Call-by-Reference :Point x = 1 y = 1 :Point p1 x = 2 y = 2 q1 r Im Zeitpunkt (1) gilt folgender Speicherzustand: :Point x = 1 y = 1 :Point x = 2 y = 2 p1 q1 r  null Verstehen der Grunddatentypen von Java item Verstehen von Typkonversion in Java item Lernen lokale Variablen und Konstanten zu initialisieren item Verstehen der Speicherorganisation von lokalen Variablen item Lernen Fallunterscheidungen zu bilden und iterative Programme zu schreiben item Lernen Kontrollflußdiagramme als Entwurfsnotation einzusetzen item Wiederholen der Regeln des Hoare-Kalkül für while--Programme

nicht in Java Call-by-Reference :Point x = 1 y = 1 :Point p1 x = 2 Bei der Parameterübergabe wird für den Call-by-Reference-Parameter higherPoint die Adresse des aktuellen Parameters r übergeben: x = 1 y = 1 :Point Call-by-Value: Übergabe der Werte von p1, q1 an this und q x = 2 y = 2 :Point p1  q1  r null nicht in Java Verstehen der Grunddatentypen von Java item Verstehen von Typkonversion in Java item Lernen lokale Variablen und Konstanten zu initialisieren item Verstehen der Speicherorganisation von lokalen Variablen item Lernen Fallunterscheidungen zu bilden und iterative Programme zu schreiben item Lernen Kontrollflußdiagramme als Entwurfsnotation einzusetzen item Wiederholen der Regeln des Hoare-Kalkül für while--Programme this  q  Call-by-Reference: Übergabe der Adresse von r an higherPoint  higherPoint

nicht in Java Call-by-Reference :Point x = 1 y = 1 :Point p1 x = 2 Während der Ausführung des Rumpfs (Zeitpunkt 2) wird bei der Zuweisung an higherPoint die Änderung an der Adresse des aktuellen Parameters r durchgeführt: : nicht in Java x = 1 y = 1 :Point Ausführung von *higherPoint=q; ändert den Wert von r x = 2 y = 2 :Point p1  q1  r  Verstehen der Grunddatentypen von Java item Verstehen von Typkonversion in Java item Lernen lokale Variablen und Konstanten zu initialisieren item Verstehen der Speicherorganisation von lokalen Variablen item Lernen Fallunterscheidungen zu bilden und iterative Programme zu schreiben item Lernen Kontrollflußdiagramme als Entwurfsnotation einzusetzen item Wiederholen der Regeln des Hoare-Kalkül für while--Programme this  q  Call-by-Reference: Übergabe der Adresse von r an higherPoint  higherPoint

nicht in Java Call-by-Reference :Point x = 1 y = 1 :Point p1 x = 2 Im Zeitpunkt (3) werden die lokalen Variablen gelöscht und man erhält man wegen Call-by-Reference eine Änderung des aktuellen Parameters: r ist nicht mehr null, sondern zeigt auf ein anderes Objekt. :Point x = 1 y = 1 nicht in Java :Point x = 2 y = 2 p1 q1 r  r zeigt auf den Punkt mit der größeren y-Koordinate!

Call-by-Value (Java) Beispiel: Das (fast) gleiche Programm in Java mit Call-by-Value für higherPoint public void choose(Point q, Point higherPoint) { if (this.getY() >= q.getY()) higherPoint = this; else higherPoint = q; //(2) } public static void main(String[] args) //siehe PointChoose0Main { Point p1 = new Point(1,1); Point q1 = new Point(2,2); Point r = new Point(); // (1) p1.choose(q1, r); // (3) ... Call-by-Value Initialisierung von r mit Standardkonstruktor

Call-by-Value (Java) :Point Zu Beginn der Ausführung des Rumpfs von p1.choose(q1, r): :Point x = 1 y = 1 p1 q1 r this q higherPoint  :Point x = 2 y = 2 :Point x = 0 y = 0

Call-by-Value (Java) :Point x = 1 y = 1 :Point x = 2 :Point y = 2 Zeitpunkt (2): Fallunterscheidung bewirkt eine Änderung der lokalen Variablen higherPoint. :Point x = 1 y = 1 p1 q1 r this q higherPoint  :Point x = 2 y = 2 :Point x = 0 y = 0

Call-by-Value (Java) :Point x = 1 y = 1 :Point x = 2 :Point y = 2 Zum Zeitpunkt (3) haben sich also bei Call-by-Value die aktuellen Parameter nicht geändert: :Point x = 1 y = 1 p1 q1 r  :Point x = 2 y = 2 :Point x = 0 y = 0

Call-by-Value (Java) Um den gleichen Effekt wie bei Call-by-Reference zu erzielen, führt man in Java ein Ergebnis ein (siehe PointChoose1 und PointChoose1Main): public Point chooseJava(Point q) { if (this.getY() >= q.getY()) return this; else return q; //(2) }   public static void main(String[] args) Point p1 = new Point(1,1); Point q1 = new Point(2,2); // (1) Point r = p1.chooseJava(q1); // (3) Zum Zeitpunkt (3) ergibt sich jetzt der gewünschte Speicherzustand, bei dem r auf das gleiche Objekt zeigt, wie q1.

Zusammenfassung Eine Methode berechnet ihr Resultat abhängig vom Zustand des aktuellen Objekts und der aktuellen expliziten Parameter. Der Parameterübergabemechanismus von Java ist Call-by-Value. Dabei werden die Werte der aktuellen Parameter an die formalen Parameter übergeben. Die Werte der aktuellen Parameter werden durch Call-by-Value nicht verändert; es können aber die Attributwerte der aktuellen Parameter verändert werden. Bei Call-by-Reference (wie in C, C++, Modula möglich) können die Werte der aktuellen Parameter verändert werden, da ihre Adressen (die L-Werte) übergeben werden. Java hat kein Call-by-Reference; es lassen sich aber durch Call-by-Value bei Objekten ähnliche Effekte und Speicherplatzersparnis erzielen.