Tag 8 Repetitorium Informatik (Java)

Ähnliche Dokumente
Repetitorium Informatik (Java)

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

AuD-Tafelübung T-B5b

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Einstieg in die Informatik mit Java

Kapitel 6. Vererbung

Probeklausur: Programmierung WS04/05

Kapitel 6. Vererbung

Letztes Mal. static int ggt(int a, int b) { if (a == b) return a; else if (a > b) return ggt(a-b,b); else if (a < b) return ggt(a,b-a);

5.4 Klassen und Objekte

5.5.8 Öffentliche und private Eigenschaften

Algorithmen und Programmierung II

6 Speicherorganisation

Klassen und Objekte. Einführung in Java. Folie 1 von Mai Ivo Kronenberg

Javakurs für Anfänger

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

3 Objektorientierte Konzepte in Java

Javakurs für Anfänger

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

Vorkurs C++ Programmierung

Javakurs zu Informatik I. Henning Heitkötter

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 8. Arrays. Arrays

Tutoraufgabe 1 (Zweierkomplement): Lösung: Programmierung WS16/17 Lösung - Übung 2

Arrays Fortgeschrittene Verwendung

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Java I Vorlesung 6 Referenz-Datentypen

Probeklausur: Programmierung WS04/05

Kapitel 6. Vererbung

Einführung in die Programmierung 1

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

Welche Informatik-Kenntnisse bringen Sie mit?

JAVA - Methoden

Aufbau von Klassen. class punkt {...

Objektorientierte Programmierung

Arrays von Objekten. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Beispiel: Zwischen der Oberklasse und der abgeleiteten Klasse besteht eine ist ein Beziehung. Eine abgeleitete Klasse stellt eine Spezialisierung der

Algorithmen und Datenstrukturen

Einstieg in die Informatik mit Java

Java Einführung Klassendefinitionen

3 Objektorientierte Konzepte in Java

Repetitorium Informatik (Java)

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

EINI WiMa/LW. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 11/12

Einstieg in die Informatik mit Java

Sichtbarkeit & statische Methoden. Einsatz von Sichtbarkeit Einsatz statischer Methoden programmatische Realisierung 2 Beispielaufgaben

Die Programmiersprache C Eine Einführung

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2007/2008

Java Einführung Methoden in Klassen

Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik

Übersicht. Vorstellung des OO-Paradigmas

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Java Kurs für Anfänger Einheit 5 Methoden

Wiederholung Wozu Methoden? Methoden Schreiben Methoden Benutzen Rekursion?! Methoden. Javakurs 2012, 3. Vorlesung

Einführung in die Informatik

5.6 Vererbung. Vererbung

Java Einführung Methoden. Kapitel 6

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Prof. W. Henrich Seite 1

Javakurs 2013 Objektorientierung

Java Cheatsheet. Mehrzeiliger Kommentar (beginnt mit /* und endet mit */)

Vererbung. Vererbung von Methoden und Instanzvariablen. Vererbung als Realisierung einer is-a Beziehung.

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Propädeutikum zur Programmierung

JAVA - Methoden - Rekursion

Vorlesung Informatik II

1.2 Attribute und Methoden Aufbau einer Java-Klasse:

Der Datentyp String. Stringvariable und -vergleiche

Objektorientierte Programmierung mit Java. Grundlagen Übersicht. Programmiersprachen

Programmieren in Java

Klassen mit Instanzmethoden

String s1, s2; Eine Zuweisung geschieht am einfachsten direkt durch Angabe des Strings eingeschlossen in doppelte Hochkommata:

Java Schulung (Java 2 Java Development Kit 5 / 6)

VIII: Vererbung. Unterklassen einer Klasse. Vererbung von Methoden und Instanzvariablen. Überschreiben von Methoden

1 Polymorphie (Vielgestaltigkeit)

Javakurs für Anfänger

Vererbung. Martin Wirsing. Ziele. Vererbung

Nachholklausur (6 ECTS): Lösungsvorschlag Einführung in die Informatik: Programmierung und Software-Entwicklung. Nachname... Vorname...

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Programmierkurs Java

Test zu Grundlagen der Programmierung Leitung: Michael Hahsler. 21. November 2003

Dynamischer Speicher

Übungsblatt 7. Was ist die Ausgabe de facto? Entspricht die Ausgabe Ihren Erwartungen?

Vorlesung Programmieren. Bisher: Klassen und Objekte. Was ist mit ähnlichen Klassen? Vererbung und Polymorphismus

Programmieren I + II Regeln der Code-Formatierung

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

C# im Vergleich zu Java

Java: Vererbung. Teil 3: super()

Programmieren in Java

Objektorientierte Programmierung

Interfaces und Vererbung

JAVA-Datentypen und deren Wertebereich

Arrays von Objekten. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Kapitel 4: Zeiger. Inhalt. Zeiger Zeigerarithmetik

Einführung in die Java- Programmierung

Javakurs für Anfänger

Transkript:

Tag 8 Repetitorium Informatik (Java) Dozent: Michael Baer Lehrstuhl für Informatik 2 (Programmiersysteme) Friedrich-Alexander-Universität Erlangen-Nürnberg Wintersemester 2017/2018

Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 2 / 36

Übersicht Referenzsemantik Referenzen? null-referenzen und NullPointerException Arrays von Objekten Referenzsemantik bei der Parameterübergabe Objektvergleich mittels equals() Sichtbarkeiten Motivation public vs. private Getter- und Setter-Methoden Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 3 / 36

Referenzsemantik

Referenzen bekannt: Objekte müssen vor der Verwendung erzeugt werden Zuweisung der Referenz an eine Objektvariable Variablen und Objekte public static void main ( String [] args ) { int a = 7; // primitiver Typ char b = x ; // primitiver Typ int [] ai = new int [5]; // Array von primitivem Typ Person p = new Person (13, A ); // Objekt Person [] ap = new Person [5]; // Array von Objekten Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 5 / 36

Referenzen: Beispiel (I) Klasse Person public class Person { int alter ; // Alter char ini ; // Initiale public Person ( int alter, char ini ) { this. alter = alter ; this. ini = ini ; Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 6 / 36

Referenzen: Beispiel (II) Beispiel // Alfred Person p1 = new Person (13, A ); // Berta Person p2 = new Person (19, B ); p2. alter = 42; // Chris p2 = new Person (24, C ); p2 = p1; System.out. println (p1. alter ); p2. alter = 17; // p1 <-> p2 System.out. println (p1. alter ); Referenzen p1 p2 Ausgabe Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 7 / 36

Referenzen: Beispiel (II) Beispiel // Alfred Person p1 = new Person (13, A ); // Berta Person p2 = new Person (19, B ); p2. alter = 42; // Chris p2 = new Person (24, C ); p2 = p1; Referenzen p1 alter: 13 ini: A p2 System.out. println (p1. alter ); p2. alter = 17; // p1 <-> p2 System.out. println (p1. alter ); Ausgabe Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 7 / 36

Referenzen: Beispiel (II) Beispiel // Alfred Person p1 = new Person (13, A ); // Berta Person p2 = new Person (19, B ); p2. alter = 42; // Chris p2 = new Person (24, C ); p2 = p1; Referenzen p1 alter: 13 ini: A p2 System.out. println (p1. alter ); p2. alter = 17; // p1 <-> p2 System.out. println (p1. alter ); alter: 19 ini: B Ausgabe Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 7 / 36

Referenzen: Beispiel (II) Beispiel // Alfred Person p1 = new Person (13, A ); // Berta Person p2 = new Person (19, B ); p2. alter = 42; // Chris p2 = new Person (24, C ); p2 = p1; Referenzen p1 alter: 13 ini: A p2 System.out. println (p1. alter ); p2. alter = 17; // p1 <-> p2 System.out. println (p1. alter ); alter: 42 ini: B Ausgabe Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 7 / 36

Referenzen: Beispiel (II) Beispiel // Alfred Person p1 = new Person (13, A ); // Berta Person p2 = new Person (19, B ); p2. alter = 42; // Chris p2 = new Person (24, C ); p2 = p1; System.out. println (p1. alter ); p2. alter = 17; // p1 <-> p2 System.out. println (p1. alter ); Referenzen p1 alter: 13 ini: A p2 alter: 24 ini: C alter: 42 ini: B Ausgabe Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 7 / 36

Referenzen: Beispiel (II) Beispiel // Alfred Person p1 = new Person (13, A ); // Berta Person p2 = new Person (19, B ); p2. alter = 42; // Chris p2 = new Person (24, C ); p2 = p1; System.out. println (p1. alter ); p2. alter = 17; // p1 <-> p2 System.out. println (p1. alter ); Referenzen p1 alter: 13 ini: A p2 alter: 24 ini: C alter: 42 ini: B Ausgabe Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 7 / 36

Referenzen: Beispiel (II) Beispiel // Alfred Person p1 = new Person (13, A ); // Berta Person p2 = new Person (19, B ); p2. alter = 42; // Chris p2 = new Person (24, C ); p2 = p1; System.out. println (p1. alter ); p2. alter = 17; // p1 <-> p2 System.out. println (p1. alter ); Referenzen p1 alter: 13 ini: A p2 alter: 24 ini: C alter: 42 ini: B Ausgabe 13 Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 7 / 36

Referenzen: Beispiel (II) Beispiel // Alfred Person p1 = new Person (13, A ); // Berta Person p2 = new Person (19, B ); p2. alter = 42; // Chris p2 = new Person (24, C ); p2 = p1; System.out. println (p1. alter ); p2. alter = 17; // p1 <-> p2 System.out. println (p1. alter ); Referenzen p1 alter: 17 ini: A p2 alter: 24 ini: C alter: 42 ini: B Ausgabe 13 Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 7 / 36

Referenzen: Beispiel (II) Beispiel // Alfred Person p1 = new Person (13, A ); // Berta Person p2 = new Person (19, B ); p2. alter = 42; // Chris p2 = new Person (24, C ); p2 = p1; System.out. println (p1. alter ); p2. alter = 17; // p1 <-> p2 System.out. println (p1. alter ); Referenzen p1 alter: 17 ini: A p2 alter: 24 ini: C alter: 42 ini: B Ausgabe 13 17 Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 7 / 36

Referenzen: Was ist das? Objekte Instanziierung mit dem Schlüsselwort new Erzeugung eines neuen Objekts im Speicher (genauer: im sog. Heap) Ergebnis: Referenz auf das neue Objekt Position im Speicher Zuweisung der Referenz an eine Referenzvariable Referenzvariablen (Objektvariablen) speichern lediglich Referenzen, nicht die Objekte selbst! speichern die Information, wo das Objekt im Speicher liegt bei einem Zugriff wird die Referenz auf das Objekt verfolgt man unterscheidet zwischen...... Wertevariablen mit primitivem Typ: speichern Wert direkt (z.b. int)... Referenzvariablen: speichern Referenz auf ein Objekt Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 8 / 36

Referenzen: Interne Darstellung Referenzen als Schaubild p1 alter: 13 ini: A p2 alter: 24 ini: C alter: 42 ini: B Referenzen im Speicher Adresse im Speicher Speicher 42: 44 p1 43: 46 p2 Name im Programm 44: 13 p1.alter 45: 65 ( A ) p1.ini 46: 24 p2.alter 47: 67 ( C ) p2.ini 48: 42 49: 66 ( B ) Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 9 / 36

null-referenzen und NullPointerException in manchen Fällen soll eine Referenzvariable auf kein Objekt zeigen Beispiel: ein Mitarbeiter soll optional ein Konto besitzen (s.u.) spezielle Referenz null, die auf kein Objekt zeigt kann Referenzvariable mit beliebigem Typ als Wert zugewiesen werden Initialisierung von Referenzvariablen Vor ihrer Initialisierung ist der Wert einer lokalen Referenzvariable nicht definiert (s.u.). Im Falle einer Klassen-/Instanzvariable wird die Variable implizit mit null initialisiert. NullPointerException Bei dem Versuch eines Zugriffs über eine null-referenz bricht das Programm (ohne weitere Maßnahmen) mit einer sog. NullPointerException ab. Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 10 / 36

null-referenzen: Beispiel Mitarbeiter public class Mitarbeiter { String name ; Konto konto ; public Mitarbeiter ( String name ) { this. name = name ; Referenzen m1 m2 Firma public class Firma { public static void main ( String [] a) { Mitarbeiter m1 = new Mitarbeiter (" Mustermann "); Mitarbeiter m2 = new Mitarbeiter (" Musterfrau "); m2. konto = new Konto (...); m2 = null ; null System.out. println (m2. name ); Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 11 / 36

null-referenzen: Beispiel Mitarbeiter public class Mitarbeiter { String name ; Konto konto ; public Mitarbeiter ( String name ) { this. name = name ; Referenzen m1 m2 name: Mustermann konto: Firma public class Firma { public static void main ( String [] a) { Mitarbeiter m1 = new Mitarbeiter (" Mustermann "); Mitarbeiter m2 = new Mitarbeiter (" Musterfrau "); m2. konto = new Konto (...); m2 = null ; null System.out. println (m2. name ); Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 11 / 36

null-referenzen: Beispiel Mitarbeiter public class Mitarbeiter { String name ; Konto konto ; public Mitarbeiter ( String name ) { this. name = name ; Firma public class Firma { public static void main ( String [] a) { Mitarbeiter m1 = new Mitarbeiter (" Mustermann "); Mitarbeiter m2 = new Mitarbeiter (" Musterfrau "); m2. konto = new Konto (...); m2 = null ; Referenzen m1 m2 name: Mustermann konto: name: Musterfrau konto: null System.out. println (m2. name ); Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 11 / 36

null-referenzen: Beispiel Mitarbeiter public class Mitarbeiter { String name ; Konto konto ; public Mitarbeiter ( String name ) { this. name = name ; Firma public class Firma { public static void main ( String [] a) { Mitarbeiter m1 = new Mitarbeiter (" Mustermann "); Mitarbeiter m2 = new Mitarbeiter (" Musterfrau "); m2. konto = new Konto (...); m2 = null ; Referenzen m1 m2 name: Mustermann konto: name: Musterfrau konto: null... System.out. println (m2. name ); Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 11 / 36

null-referenzen: Beispiel Mitarbeiter public class Mitarbeiter { String name ; Konto konto ; public Mitarbeiter ( String name ) { this. name = name ; Firma public class Firma { public static void main ( String [] a) { Mitarbeiter m1 = new Mitarbeiter (" Mustermann "); Mitarbeiter m2 = new Mitarbeiter (" Musterfrau "); m2. konto = new Konto (...); m2 = null ; Referenzen m1 m2 name: Mustermann konto: name: Musterfrau konto: null... System.out. println (m2. name ); Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 11 / 36

NullPointerException: Beispiel Firma Referenzen public class Firma { public static void main ( String [] args ) { //... Mitarbeiter m2 = new Mitarbeiter (" Musterfrau "); m2. konto = new Konto (...); m2 = null ; System.out. println (m2. name ); m1 m2 name: Musterfrau konto: null... Zur Laufzeit kracht es! benutzer@faui06a: /ordner$ java Firma Exception in thread main java.lang.nullpointerexception at Firma.main(Firma.java:11) Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 12 / 36

Vermeidung von NullPointerExceptions falls unbekannt ist, ob eine Referenzvariable null ist oder nicht: vor dem Zugriff überprüfen, damit das Programm nicht abgebrochen wird! Vergleich der Referenzvariable mit null Beispiel: Überprüfung der Parameter einer Methode in der Methode ist unklar, ob Aufrufer echte Referenzen übergeben hat Beispiel public class //... Konto { public static void ueberweisung ( Konto nach, Konto von, double betrag ) { if ( nach == null von == null ) { System.out. println (" Konten dü rfen nicht null sein "); return ; // Methode im Fehlerfall abbrechen // Jetzt ist es sicher, dass von und nach!= null // double ( betrag ) ist ein primitiver Typ und * kann nicht * null sein nach. kontostand = nach. kontostand + betrag ; von. kontostand = von. kontostand - betrag ; Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 13 / 36

Gute Fehlerbehandlung ist ein Thema für sich. Etwas mehr Details dazu gibt es (beispielsweise) in der AuD-Vorlesung. Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 14 / 36

Arrays von Objekten bekannt: Arrays von primitiven Werten Array-Variable speichert lediglich eine Referenz auf das eigentliche Array jetzt: Arrays von Objekten Verwendung prinzipiell wie bei Arrays mit primitiven Werten aber: die einzelnen Elemente sind Referenzen und nicht die Objekte selbst analog zu einfachen Referenzvariablen bei der Array-Erzeugung werden alle Elemente mit null initialisiert Objekte müssen einzeln erzeugt werden ihre Referenzen müssen einzeln in das Array geschrieben werden Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 15 / 36

Arrays von Objekten: Beispiel Beispiel Konto [] konten = new Konto [4]; for ( int i=0; i< konten. length ; ++i) { konten [i] = new Konto (...); Referenzen konten null Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 16 / 36

Arrays von Objekten: Beispiel Beispiel Konto [] konten = new Konto [4]; for ( int i=0; i< konten. length ; ++i) { konten [i] = new Konto (...); Referenzen konten null Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 16 / 36

Arrays von Objekten: Beispiel Beispiel Konto [] konten = new Konto [4]; for ( int i=0; i< konten. length ; ++i) { konten [i] = new Konto (...); Referenzen konten... null Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 16 / 36

Arrays von Objekten: Beispiel Beispiel Konto [] konten = new Konto [4]; for ( int i=0; i< konten. length ; ++i) { konten [i] = new Konto (...); Referenzen konten...... null Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 16 / 36

Arrays von Objekten: Beispiel Beispiel Konto [] konten = new Konto [4]; for ( int i=0; i< konten. length ; ++i) { konten [i] = new Konto (...); Referenzen konten......... null Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 16 / 36

Arrays von Objekten: Beispiel Beispiel Konto [] konten = new Konto [4]; for ( int i=0; i< konten. length ; ++i) { konten [i] = new Konto (...); Referenzen konten............ null Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 16 / 36

Semantik bei der Parameterübergabe bekannt: bei der Parameterübergabe wird der übergebene Wert kopiert Änderung innerhalb der Methode hat keine Auswirkungen beim Aufrufer ebenfalls bekannt: Semantik bei der Parameterübergabe von Arrays Änderung eines Array-Elements in der Methode ist auch im Aufrufer sichtbar Grund: lediglich die Array-Referenz wird kopiert, nicht das Array selbst auch bei Objekten wird lediglich die Referenz kopiert, nicht das Objekt selbst Änderung von Attributen auch im Aufrufer sichtbar Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 17 / 36

Semantik bei der Parameterübergabe: Beispiel Beispiel public class Person { //... Referenzen lokal public static void main ( String [] ar) { Person lokal = new Person (13, A ); mach ( lokal ); System.out. println ( lokal. alter + " " + lokal. ini ); public static void mach ( Person param ){ param. alter = 42; param = new Person (53, B ); param. alter = 99; Ausgabe Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 18 / 36

Semantik bei der Parameterübergabe: Beispiel Beispiel public class Person { //... public static void main ( String [] ar) { Person lokal = new Person (13, A ); mach ( lokal ); System.out. println ( lokal. alter + " " + lokal. ini ); Referenzen lokal alter: 13 ini: A public static void mach ( Person param ){ param. alter = 42; param = new Person (53, B ); param. alter = 99; Ausgabe Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 18 / 36

Semantik bei der Parameterübergabe: Beispiel Beispiel public class Person { //... public static void main ( String [] ar) { Person lokal = new Person (13, A ); mach ( lokal ); System.out. println ( lokal. alter + " " + lokal. ini ); Referenzen lokal alter: 13 ini: A param public static void mach ( Person param ){ param. alter = 42; param = new Person (53, B ); param. alter = 99; Ausgabe Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 18 / 36

Semantik bei der Parameterübergabe: Beispiel Beispiel public class Person { //... public static void main ( String [] ar) { Person lokal = new Person (13, A ); mach ( lokal ); System.out. println ( lokal. alter + " " + lokal. ini ); Referenzen lokal alter: 42 ini: A param public static void mach ( Person param ){ param. alter = 42; param = new Person (53, B ); param. alter = 99; Ausgabe Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 18 / 36

Semantik bei der Parameterübergabe: Beispiel Beispiel public class Person { //... public static void main ( String [] ar) { Person lokal = new Person (13, A ); mach ( lokal ); System.out. println ( lokal. alter + " " + lokal. ini ); Referenzen lokal alter: 42 ini: A param public static void mach ( Person param ){ param. alter = 42; param = new Person (53, B ); param. alter = 99; alter: 53 ini: B Ausgabe Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 18 / 36

Semantik bei der Parameterübergabe: Beispiel Beispiel public class Person { //... public static void main ( String [] ar) { Person lokal = new Person (13, A ); mach ( lokal ); System.out. println ( lokal. alter + " " + lokal. ini ); Referenzen lokal alter: 42 ini: A param public static void mach ( Person param ){ param. alter = 42; param = new Person (53, B ); param. alter = 99; alter: 99 ini: B Ausgabe Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 18 / 36

Semantik bei der Parameterübergabe: Beispiel Beispiel public class Person { //... public static void main ( String [] ar) { Person lokal = new Person (13, A ); mach ( lokal ); System.out. println ( lokal. alter + " " + lokal. ini ); Referenzen lokal alter: 42 ini: A public static void mach ( Person param ){ param. alter = 42; param = new Person (53, B ); param. alter = 99; alter: 99 ini: B Ausgabe 42 A Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 18 / 36

Objektvergleich mittels equals()

Klasse Rechteck Klasse Rechteck public class Rechteck { int breite ; int hoehe ; int nummer ; public Rechteck ( int breite, int hoehe, int nummer ) { this. breite = breite ; this. hoehe = hoehe ; this. nummer = nummer ; Vergleich Zwei Rechtecke sollen gleich sein, wenn ihre Breite und Höhe übereinstimmen. Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 20 / 36

Objektvergleich bekannt: Vergleich von primitiven Werten mit dem ==-Operator jetzt: inhaltlicher Vergleich von Objekten einer Klasse Vergleich von Objekten Der ==-Operator vergleicht bei Objekten lediglich die Referenzen der Objekte auf Gleichheit, d.h. der Vergleich ist nur dann true, wenn beide Referenzen auf dasselbe Objekt zeigen. Ein inhaltlicher Vergleich der Objekte muss selbst implementiert werden. Die Methode equals() In Java ist für einen inhaltlichen Vergleich die Methode equals() vorgesehen. Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 21 / 36

Beispiel: Vergleich von Strings equals() für Strings Die Klasse String aus der Java-Standardbibliothek stellt eine Methode equals() zur Verfügung, die zwei Zeichenketten auf Gleichheit überprüft. Beispiel public class StringVergleich { public static void main ( String [] args ) { String s1 = args [0]; String s2 = args [1]; System. out. println (" == liefert " + ( s1 == s2 )); System.out. println (" equals () liefert " + (s1. equals (s2 ))); Ausgabe benutzer@faui06a: /ordner$ java StringVergleich Hallo Hallo == liefert false equals() liefert true Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 22 / 36

Eigene Implementierung von equals() Signatur der Methode equals() public boolean equals ( Object other ) { /*... */ Hinweis Gibt true zurück, falls this und other gleich sind, andernfalls false. Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 23 / 36

Vererbung ist ein riesiges Thema und wird in der AuD-Vorlesung noch ausführlich besprochen. Wir versuchen das hier so knapp wie möglich zu halten. Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 24 / 36

Object der Typ Object hat nichts mit Objekt (konkrete Instanz) zu tun eine Referenzvariable vom Typ Object kann ein beliebiges Objekt speichern bei der Zuweisung wird der Typ der Referenz implizit in Object geändert Rechteck r = new Rechteck (2, 3); Object o = r; // o ist eine Referenz auf ein Objekt vom Typ Rechteck Person p = new Person (13, A ); o = p; // o ist jetzt eine Referenz auf ein Objekt vom Typ Person der Typ der Referenz wird geändert, aber: das Objekt bleibt unverändert das Objekt bleibt ein Rechteck, aber: man kann nicht auf Attribute zugreifen Rechteck r = new Rechteck (2, 3); Object o = r; // o ist eine Referenz auf ein Objekt vom Typ Rechteck r. breite = 17; // geht : r ist eine Referenz vom Typ Rechteck o. breite = 17; // GEHT NICHT. o ist eine Referenz vom Typ Object Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 25 / 36

instanceof (I) Typfrage o ist eine Referenzvariable auf ein beliebiges Objekt und kann damit unterschiedlichste Objekte speichern (Rechtecke, Personen,...). Manchmal muss man jedoch wissen, was für ein Objekt gerade eben gespeichert wird. instanceof instanceof ermöglicht den Test, ob das Objekt in einer Referenzvariable von einem bestimmen Typ ist Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 26 / 36

instanceof (II) Beispiel Rechteck r = new Rechteck (2, 3); Person p = new Person (13, A ); Object o = r; // o ist eine Referenz auf ein Objekt vom Typ Rechteck if ( o instanceof Rechteck ) { System. out. println (" o speichert aktuell ein Rechteck "); else if ( o instanceof Person ) { System. out. println (" o speichert aktuell eine Person "); o = p; // o ist jetzt eine Referenz auf ein Objekt vom Typ Person if ( o instanceof Rechteck ) { System. out. println (" o speichert aktuell ein Rechteck "); else if ( o instanceof Person ) { System. out. println (" o speichert aktuell eine Person "); Ausgabe o speichert aktuell ein Rechteck o speichert aktuell eine Person Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 27 / 36

Beispiel: Klasse Rechteck Ziel Objekte der Klasse Rechteck sollen miteinander verglichen werden können. Dabei sollen zwei Rechtecke gleich sein, wenn sowohl Breite als auch Höhe übereinstimmen. Rechteck public class Rechteck { int breite ; int hoehe ; //... public boolean equals ( Object other ) { if (!( other instanceof Rechteck )) { // other ist kein Rechteck return false ; Rechteck anderes = ( Rechteck ) other ; return ( breite == anderes. breite ) && ( hoehe == anderes. hoehe ); Verwendung Rechteck r1 = new Rechteck (13, 3); Rechteck r2 = new Rechteck (13, 3); System.out. println (r1 == r2 ); System.out. println (r1. equals (r2 )); Ausgabe false true Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 28 / 36

Sichtbarkeiten

Sichtbarkeiten bisher: alle Attribute und Methoden einer Klasse von außen zugreifbar Beispiel: in der Klasse Notenverwaltung kann die Note eines Moduls gesetzt werden aber: in vielen Fällen will man den Zugriff beschränken Ziel: unerwünschten und unbeabsichtigten Zugriff verhindern Datenkapselung ist wichtiger Aspekt Objektorientierter Programmierung interne Details verstecken Zugriff von außen nur über definierte Schnittstelle jetzt: Angabe von Sichtbarkeitsmodifikatoren vor Attributen und Methoden explizite Angabe, ob ein Zugfriff von außen möglich sein soll Compiler meldet Fehler bei einem unerlaubten Zugriff Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 30 / 36

Sichtbarkeitsmodifikatoren: public und private Sichtbarkeitsmodifikator wird der Deklaration vorangestellt wir beschränken uns hier auf die folgenden beiden Modifikatoren: public (kennen wir bereits von Methoden) eine öffentliche Methode ist von außen aufrufbar ein öffentliches Attribut ist von außen lesbar und schreibbar öffentliche Attribute und Methoden bilden die Schnittstelle der Klasse private eine private Methode ist nur innerhalb dieser Klasse aufrufbar ein privates Attribut ist nur innerhalb dieser Klasse lesbar und schreibbar ermöglicht Beschränkung des Zugriffs auf Attribute und Methoden Hinweis Jeder Deklaration sollte ein passender Sichtbarkeitsmodifikator vorangestellt werden. Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 31 / 36

Sichtbarkeitsmodifikatoren: Beispiel Ziel Eigentümer und Kontostand eines Kontos dürfen nicht von außen geschrieben werden. Konto public class Konto { private String eigentuemer ; private double kontostand ; Erlaubt ( überall ) Konto konto = new Konto (" Musterfrau ", 1303.12); konto. kontostandausgeben (); public Konto ( String eigentuemer, double kontostand ) { // Zugriff aus selber Klasse erlaubt! this. eigentuemer = eigentuemer ; this. kontostand = kontostand ; public void kontostandausgeben () { // Zugriff aus selber Klasse erlaubt! System.out. println ( this. kontostand ); Verboten (in anderer Klasse) Konto konto = new Konto (" Musterfrau ", 1303.12); konto. kontostand = 4711.00; Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 32 / 36

Getter-Methoden (I) Konto public class Konto { private String eigentuemer ; private double kontostand ; //... Problem Eigentümer und Kontostand eines Kontos sind jetzt zwar nicht mehr von außen schreibbar, aber auch nicht mehr lesbar... öffentliche Getter-Methoden für den Zugriff auf private Attribute Name per Konvention: getattributname() geben den Wert des entsprechenden Attributes zurück erlauben einen lesenden Zugriff auf das entsprechende Attribut Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 33 / 36

Getter-Methoden (II) Konto public class Konto { private String eigentuemer ; private double kontostand ; //... public String geteigentuemer () { return this. eigentuemer ; public double getkontostand () { return this. kontostand ; Bank public class Bank { public static void main ( String [] ar) { Konto konto = new Konto (" Musterfrau ", 1303.12); System.out. println ( " Der Kontostand von " + konto. geteigentuemer () + " betr ägt " + konto. getkontostand ()); Ausgabe Der Kontostand von Musterfrau beträgt 1303.12 Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 34 / 36

Setter-Methoden analog: öffentliche Setter-Methoden für schreibenden Zugriff auf Attribute insbesondere sinnvoll, wenn Wert auf Gültigkeit überprüft werden soll Ziel Der Kontostand eines Kontos darf von außen geschrieben werden, aber es soll sichergestellt werden, dass der Kontostand nie negativ ist. Konto public class Konto { private double kontostand ; //... public void setkontostand ( double kontostand ) { if ( kontostand >= 0) { this. kontostand = kontostand ; else { System. out. println (" Kontostand darf nicht negativ sein "); Informatik-Repetitorium Tag 8 WS 2017/2018 Lehrstuhl für Informatik 2 (Programmiersysteme) 35 / 36

Fragen? Fragen! (hilft auch den anderen)