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[] String[] String[] int[] String[] String[] Oliver Haase name strasse wohnort plz email kommentar = = = = = = new new new new new new String[20]; String[20]; String[20]; int[20]; String[20]; String[20]; Hochschule Konstanz 3 Motivation Eintragen einer neuen Adresse: name[2] strasse[2] wohnort[2] plz[2] email[2] kommentar[2] = = = = = = "Klausi Klausenbacher"; "am Hutzenweg 23"; "Musterbach"; 12345; "[email protected]"; "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: oder zusammengefasst: Adresse myAddress; Adresse myAddress = new Adresse(); myAddress = new Adresse(); myAddress Oliver Haase name strasse postleitzahl wohnort email kommentar 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 Oliver Haase name Karla Musterfrau strasse hausnummer postleitzahl wohnort email kommentar Hochschule Konstanz 16 Klassen als Referenzdatentypen Adresse adresse1 = new Adresse(); Adresse adresse2; adresse1.name = "Karla Musterfrau"; adresse2 = adresse1; adresse2.name = "John Doe"; adresse1 adresse2 Oliver Haase John Doe Musterfrau name Karla strasse hausnummer postleitzahl wohnort email kommentar 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 AdressObjekte 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] Oliver Haase name strasse name postleitzahl strasse name hausnummer strasse wohnort postleitzahl hausnummer email namewohnort postleitzahl kommentar strasse namewohnort email hausnummer strassekommentar postleitzahlemail hausnummer kommentar wohnort postleitzahl email wohnort kommentar email Hochschule Konstanz kommentar 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