Programmiertechnik
Klassen
Prof. Dr. Oliver Haase
Motivation
Aufgabe: Programm zur Adressverwaltung (20 Adressen)
Adresse besteht aus:
Name
Adresse (Straße und Wohnort)
Postleitzahl
Kommentar
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];
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.
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.
Ä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.
Klassenbeispiel - Adresse
graphische Darstellung einer Klasse Klassendiagramm. (Beachte: der untere, leere Teil wird später Methodenbeschreibungen enthalten.)
Adresse
name: String strasse: String postleitzahl: int wohnort:
String
email: String
kommentar: String
Klassendefinition in Java
public class <KlassenName> { // äußere Klasse <VariablenDeklaration>
…
<VariablenDeklaration>
}
Syntaxregel
Für jetzt steht der Ausdruck <VariablenDeklaration> für die Deklaration einer öffentlichen Variablen:
public <Typ> <VariablenName>;
Syntaxregel
Adressenbeispiel in Java
public class Adresse { public String name;
public String strasse;
public int postleitzahl;
public String wohnort;
public String email;
public String kommentar;
}
Instantiierung (Objekterzeugung)
<InstanzName> = new <KlassenName>();
Syntaxregel
Adresse myAddress;
myAddress
myAddress = new Adresse();
name strasse postleitzahl
Beispiel:
Adresse myAddress = new Adresse();
oder zusammengefasst:
Komponentenzugriff
Beispiel:
<InstanzName>.<KomponentenName>;
Syntaxregel
adresse.wohnort = "Musterbach";
oder auch:
System.out.println(adresse.strasse);
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" +
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:");
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
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?
Klassen als Referenzdatentypen
adresse1
namestrasse hausnummer
Adresse adresse1 = new Adresse();
adresse2
Adresse adresse2;
adresse1.name = "Karla Musterfrau";
Karla Musterfrau
Klassen als Referenzdatentypen
adresse1
namestrasse hausnummer postleitzahl wohnort email
Adresse adresse1 = new Adresse();
adresse2
Adresse adresse2;
adresse1.name = "Karla Musterfrau";
adresse2 = adresse1;
Karla Musterfrau
adresse2.name = "John Doe";
John Doe
Felder von Klassen
Aufgabe: Erweitere Adressprogramm von 1 auf mehrere (20) Adressen.
Ansatz: Verwende Feld von Adressen.
Adresse[] adressen = new Adresse[20];
adressen
adressen[0]
adressen[1]
adressen[2]
Der Komponententyp eines Feldes kann auch eine Klasse sein!
Beachte: Da die Klasse Adresse ein
Referenzdatentyp ist, werden bei der
Felderzeugung erst die Referenzen,
und nicht die eigentlichen Adress-
Objekte erzeugt!
name strasse hausnummer
name strasse hausnummer postleitzahl
name strasse hausnummer postleitzahl wohnort email kommentar
name strasse hausnummer postleitzahl wohnort email kommentar
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 postleitzahl wohnort email kommentar
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];
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();
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();
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!");
}
Kopieren
Aufgabe: Kopiere Feld von Adressen, adressen , in ein zweites Feld von Adressen, mehrAdressen :
Adresse[] mehrAdressen = new Adresse[20];
Lösung: (zuerst selbst probieren ):
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;
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");