Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer Programmiertechnik Klassen Motivation ● ● Aufgabe: Programm zur Adressverwaltung (20 Adressen) Adresse besteht aus: ● ● ● ● ● Name Adresse (Straße und Wohnort) Postleitzahl Email Kommentar Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 2/26 Motivation ● 1. Ansatz: String[] String[] String[] int[] String[] String[] name strasse wohnort plz email kommentar Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH = = = = = = new new new new new new String[20]; String[20]; String[20]; int[20]; String[20]; String[20]; 3/26 Motivation ● Eintragen einer neuen Adresse: name[2] strasse[2] wohnort[2] plz[2] email[2] kommentar[2] ● = = = = = = "Max Musterfrau"; "Testgasse 42"; "Probenhausen"; 12345; "[email protected]"; "Standard-Testperson"; 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! Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 4/26 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. Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 5/26 Ä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. Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 6/26 Beispiel: Adress-Klasse Adresse Adresse name: name: strasse: strasse: postleitzahl: postleitzahl: wohnort:String wohnort:String email: email: kommentar: kommentar: ● String String String String int int String String String String graphische Darstellung einer Klasse → Klassendiagramm. (Beachte: der untere, leere Teil wird später Methodenbeschreibungen enthalten.) Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 7/26 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>; Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 8/26 Adressenbeispiel in Java public class Adresse { public String name; public String strasse; public int postleitzahl; public String wohnort; public String email; public String kommentar; } Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 9/26 Instantiierung (Objekterzeugung) Syntaxregel <InstanzName> = new <KlassenName>(); Beispiel: oder zusammengefasst: Adresse myAddress; Adresse myAddress = new Adresse(); ● myAddress = new Adresse(); myAddress Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH name strasse postleitzahl wohnort email kommentar 10/26 Komponentenzugriff Syntaxregel <InstanzName>.<KomponentenName>; Beispiel: adresse.wohnort = "Musterbach"; oder auch: System.out.println(adresse.strasse); Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 11/26 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(); Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 12/26 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; Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 13/26 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 Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 14/26 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? Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 15/26 Klassen als Referenzdatentypen Adresse adresse1 = new Adresse(); Adresse adresse2; adresse1.name = "Karla Musterfrau"; adresse1 adresse2 Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH name strasse hausnummer postleitzahl wohnort email kommentar Karla Musterfrau 16/26 Klassen als Referenzdatentypen Adresse adresse1 = new Adresse(); Adresse adresse2; adresse1.name = "Karla Musterfrau"; adresse2 = adresse1; adresse2.name = "John Doe"; adresse1 adresse2 Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH name strasse hausnummer postleitzahl wohnort email kommentar Karla John Doe Musterfrau 17/26 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: Beachte:Da Dadie dieKlasse KlasseAdresse Adresseein ein Referenzdatentyp Referenzdatentypist, ist,werden werdenbei beider der Felderzeugung Felderzeugungerst erstdie dieReferenzen, Referenzen,und und nicht nichtdie dieeigentlichen eigentlichenAdress-Objekte Adress-Objekte erzeugt! erzeugt! adressen[18] adressen[19] Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 18/26 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] Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH name strasse name strasse name postleitzahl hausnummer strasse wohnort postleitzahl hausnummer name email wohnort postleitzahl strasse kommentar email wohnort hausnummer kommentar email postleitzahl kommentar wohnort email kommentar 19/26 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]; Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 20/26 Erweitertes 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(); Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 21/26 Erweitertes 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; Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 22/26 Erweitertes 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 System.out.print("Neuer Adressindex:"); int index = scanner.nextInt(); adr = adressen[index]; break; case 4: // Programm beenden fertig = true; break; default: // Falsche Zahl eingegeben System.out.println("Eingabefehler!"); } } // Schleifenende // HTWG Ende des Hauptprogramms Prof. Dr. Oliver}Haase, Konstanz Oliver Hochschule Konstanz Karl MartinHaase Kern, Seitenbau GmbH } // Ende des Programms Achim Bitzer, Seitenbau GmbH 23/26 Kopieren von Klassen ● Aufgabe: Kopiere Feld von Adressen, adressen, in ein zweites Feld von Adressen, mehrAdressen: Adresse[] mehrAdressen = new Adresse[20]; Lösung: (zuerst selbst probieren ): Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 24/26 Kopieren von Klassen ● 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; } Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 25/26 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"); } Prof. Dr. Oliver Haase, HTWG Konstanz Karl Martin Kern, Seitenbau GmbH Achim Bitzer, Seitenbau GmbH 26/26