Programmiertechnik Klassen

Werbung
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
Herunterladen