Programmiertechnik Klassen Prof. Dr. Oliver Haase Oliver Haase Hochschule Konstanz 1
Motivation Aufgabe: Programm zur Adressverwaltung (20 Adressen) Adresse besteht aus: Name Adresse (Straße und Wohnort) Postleitzahl Email Kommentar Oliver Haase Hochschule Konstanz 2
Motivation 1. Ansatz: String[] name = new String[20]; String[] strasse = new String[20]; String[] wohnort = new String[20]; int[] plz = new int[20]; String[] email = new String[20]; String[] kommentar = new String[20]; Oliver Haase Hochschule Konstanz 3
Motivation Eintragen einer neuen Adresse: name[2] = "Klausi Klausenbacher"; strasse[2] = "am Hutzenweg 23"; wohnort[2] = "Musterbach"; plz[2] = 12345; email[2] = "klausen@bacher.de"; kommentar[2] = "Schwippschwager 2. Grades"; Aber: es wäre schön, wenn man alle Daten, die zu einer Adresse gehören, zusammenfassen könnte zu einem Datentyp, anstatt sie auf 6 verschiedene Felder zu verteilen. Klassen! Oliver Haase Hochschule Konstanz 4
Was ist eine Klasse? selbstdefinierter Datentyp geeignet, neue Strukturen zu modellieren Kernkonzept objektorientierter (OO) Programmierung Sammlung von Variablen (Attributen) und Methoden Variablen (und Methoden) einer Klasse heißen Komponenten der Klasse. Konkrete Instanz einer Klasse heißt Objekt. Oliver Haase Hochschule Konstanz 5
Äußere und innere Klassen Klassen können auf zwei Arten definiert werden: äußere Klasse: Die Klasse wird in einer eigenen Datei definiert. Die Datei mit der Definition der Klasse MyClass hat den Namen MyClass.java ( diese Variante wird im folgenden verwendet). innere Klasse: Die Klasse wird innerhalb einer anderen Klasse definiert. Oliver Haase Hochschule Konstanz 6
Klassenbeispiel - Adresse Adresse name: strasse: postleitzahl: wohnort: String email: kommentar: String String int String String graphische Darstellung einer Klasse Klassendiagramm. (Beachte: der untere, leere Teil wird später Methodenbeschreibungen enthalten.) Oliver Haase Hochschule Konstanz 7
Klassendefinition in Java Syntaxregel public class <KlassenName> { // äußere Klasse <VariablenDeklaration> <VariablenDeklaration> } Für jetzt steht der Ausdruck <VariablenDeklaration> für die Deklaration einer öffentlichen Variablen: Syntaxregel public <Typ> <VariablenName>; Oliver Haase Hochschule Konstanz 8
Adressenbeispiel in Java public class Adresse { public String name; public String strasse; public int postleitzahl; public String wohnort; public String email; public String kommentar; } Oliver Haase Hochschule Konstanz 9
Instantiierung (Objekterzeugung) Syntaxregel <InstanzName> = new <KlassenName>(); Beispiel: Adresse myaddress; myaddress = new Adresse(); oder zusammengefasst: Adresse myaddress = new Adresse(); myaddress name strasse postleitzahl wohnort email kommentar Oliver Haase Hochschule Konstanz 10
Komponentenzugriff Syntaxregel <InstanzName>.<KomponentenName>; Beispiel: adresse.wohnort = "Musterbach"; oder auch: System.out.println(adresse.strasse); Oliver Haase Hochschule Konstanz 11
Beispiel Adressbuch public class Adressbuch_v1 { public static void main(string[] args) { // benoetigte Variablen java.util.scanner scanner = new Java.util.Scanner(System.in); Adresse adr = new Adresse(); boolean fertig=false; // Schleifenbeginn while (!fertig) { // Menue System.out.print("1 = Adresseingabe\n" + "2 = Adressausgabe\n" + "3 = Programm beenden\n" + "Ihre Wahl:"); int auswahl = scanner.nextint(); Oliver Haase Hochschule Konstanz 12
Beispiel Adressbuch // Fallunterscheidung switch(auswahl) { case 1: // Adresse eingeben System.out.print("Name:"); adr.name = scanner.next(); System.out.print("Strasse:"); adr.strasse = scanner.next(); System.out.print("PLZ:"); adr.postleitzahl = scanner.nextint(); System.out.print("Wohnort:"); adr.wohnort = scanner.next(); System.out.print("Email:"); adr.email = scanner.next(); System.out.print("Kommentar:"); adr.kommentar = scanner.next(); break; Oliver Haase Hochschule Konstanz 13
Beispiel Adressbuch case 2: // Adresse ausgeben System.out.println("----------------------"); System.out.println(adr.name); System.out.println(adr.strasse); System.out.println(adr.postleitzahl+" "+adr.wohnort); System.out.println("E-Mail: "+adr.email); System.out.println("KOMMENTAR: "+adr.kommentar); System.out.println("----------------------"); break; case 3: // Programm beenden fertig = true; break; default: // Falsche Zahl eingegeben System.out.println("Eingabefehler!"); } } // Schleifenende } // Ende des Hauptprogramms } // Ende des Programms Oliver Haase Hochschule Konstanz 14
Klassen als Referenzdatentypen Beispiel: Adresse adresse1 = new Adresse(); Adresse adresse2; adresse1.name = "Karla Musterfrau"; adresse2 = adresse1; adresse2.name = "John Doe"; System.out.println("Name von Adresse 1: " + adresse1.name); Welche Bildschirmausgabe erwarten Sie? Oliver Haase Hochschule Konstanz 15
Klassen als Referenzdatentypen Adresse adresse1 = new Adresse(); Adresse adresse2; adresse1.name = "Karla Musterfrau"; adresse1 adresse2 name strasse hausnummer postleitzahl wohnort email kommentar Karla Musterfrau Oliver Haase Hochschule Konstanz 16
Klassen als Referenzdatentypen Adresse adresse1 = new Adresse(); Adresse adresse2; adresse1.name = "Karla Musterfrau"; adresse2 = adresse1; adresse2.name = "John Doe"; adresse1 adresse2 name strasse hausnummer postleitzahl wohnort email kommentar Karla John Doe Musterfrau Oliver Haase Hochschule Konstanz 17
Felder von Klassen Aufgabe: Erweitere Adressprogramm von 1 auf mehrere (20) Adressen. Ansatz: Verwende Feld von Adressen. Adresse[] adressen = new Adresse[20]; Der Komponententyp eines Feldes kann auch eine Klasse sein! adressen adressen[0] adressen[1] adressen[2] Beachte: Da die Klasse Adresse ein Referenzdatentyp ist, werden bei der Felderzeugung erst die Referenzen, und nicht die eigentlichen Adress- Objekte erzeugt! adressen[18] adressen[19] Oliver Haase Hochschule Konstanz 18
Felder von Klassen Erzeugung der 20 Adress-Objekte: for (int i = 0; i < adressen.length; i++) { adressen[i] = new Adresse(); } adressen adressen[0] adressen[1] adressen[2] adressen[18] adressen[19] name strasse name postleitzahl strasse name hausnummer strasse wohnort hausnummer postleitzahl name email postleitzahl wohnort strasse name kommentar hausnummer wohnort email strassekommentar hausnummer postleitzahl email postleitzahl wohnort kommentar wohnort email kommentar email kommentar Oliver Haase Hochschule Konstanz 19
erweitertes Adressbuch public class AdressBuch_v2 { public static void main(string[] args) { // Benoetigte Variablen java.util.scanner scanner = new Java.util.Scanner(System.in); boolean fertig = false; Adresse adressen[] = new Adresse[20]; for ( int i = 0; i < adressen.length; i++ ) { adressen[i] = new Adresse(); } Adresse adr = adressen[0]; Oliver Haase Hochschule Konstanz 20
Beispiel Adressbuch // Schleifenbeginn while (!fertig) { // Menue System.out.print("1 = Adresseingabe\n" + "2 = Adressausgabe\n" + "3 = Adressindex wechseln\n" + "4 = Programm beenden\n" + "Ihre Wahl:"); int auswahl = scanner.nextint(); Oliver Haase Hochschule Konstanz 21
Beispiel Adressbuch switch(auswahl) { case 1: // Adresse eingeben System.out.print("Name:"); adr.name = scanner.next(); System.out.print("Strasse:"); adr.strasse = scanner.next(); System.out.print("PLZ:"); adr.postleitzahl = scanner.nextint(); System.out.print("Wohnort:"); adr.wohnort = scanner.next(); System.out.print("Email:"); adr.email = scanner.next(); System.out.print("Kommentar:"); adr.kommentar = scanner.next(); break; Oliver Haase Hochschule Konstanz 22
Beispiel Adressbuch case 2: // Adresse ausgeben System.out.println("---------------------"); System.out.println(adr.name); System.out.println(adr.strasse); System.out.println(adr.postleitzahl+" "+adr.wohnort); System.out.println("E-Mail: "+adr.email); System.out.println("KOMMENTAR: "+adr.kommentar); System.out.println("---------------------"); break; case 3: // Adressindex wechseln int index = GraphicIO.readInteger("Neuer Adressindex:"); adr = adressen[index]; break; case 4: // Programm beenden fertig = true; break; default: // Falsche Zahl eingegeben System.out.println("Eingabefehler!"); } } // Schleifenende } // Ende des Hauptprogramms } // Ende des Programms Oliver Haase Hochschule Konstanz 23
Kopieren Aufgabe: Kopiere Feld von Adressen, adressen, in ein zweites Feld von Adressen, mehradressen: Adresse[] mehradressen = new Adresse[20]; Lösung: (zuerst selbst probieren ): Oliver Haase Hochschule Konstanz 24
Kopieren Aufgabe: Kopiere Feld von Adressen, adressen, in ein zweites Feld von Adressen, mehradressen: Adresse[] mehradressen = new Adresse[20]; Lösung: (zuerst selbst probieren ): Adresse[] mehradressen = new Adresse[adressen.length]; for ( int i = 0; i < mehradressen.length; i++ ) { mehradressen[i] = new Adresse(); mehradressen[i].name = adressen[i].name; mehradressen[i].strasse = adressen[i].strasse; mehradressen[i].postleitzahl = adressen[i].postleitzahl; mehradressen[i].wohnort = adressen[i].wohnort; mehradressen[i].email = adressen[i].email; mehradressen[i].kommentar = adressen[i].kommentar; } Oliver Haase Hochschule Konstanz 25
Vergleich von Objektreferenzen Welche Ausgabe erzeugt folgendes Programm und warum? Adresse adresse1 = new Adresse(); // initialisierung von adresse1 Adresse adresse2 = new Adresse(); adresse2.name = adresse1.name; adresse2.strasse = adresse1.strasse; adresse2.postleitzahl = adresse1.postleitzahl; adresse2.wohnort = adresse1.wohnort; adresse2.email = adresse1.email; adresse2.kommentar = adresse1.kommentar; if ( adresse1 == adresse2 ) { System.out.println("Gleichheit"); } else { System.out.println("Ungleichheit"); } Oliver Haase Hochschule Konstanz 26