Adresse - an der HTWG Konstanz

Werbung
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
Zugehörige Unterlagen
Herunterladen