vierseitg

Werbung
3. Klassen
Zugriffsrechte
3. Klassen
Zugriffsrechte
Zugriffsrechte
Vom Referenzdatentyp zur Objektorientierung
Wir beginnen mit einer einfachen Klasse:
/** Diese Klasse repräsentiert Studierende */
public class Student {
Student
name:
nummer:
/** Der Name des/der Studierenden */
String name;
String
int
/** Matrikelnummer */
int nummer;
Student
-name:
-nummer:
}
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
3. Klassen
• Data Hiding: Wir wollen unsere Instanzvariablen vor der Außenwelt verstecken.
Bisher kann auch von anderen Klassen aus auf die Instanzvariablen von Student
zugegriffen werden.
• Dies wollen wir verhindern!
Hierzu schränken wir die Zugriffsrechte auf die Variablen ein.
• Zugriffsrecht wird private, d.h. nur innerhalb von Student ist ein Zugriff auf die
Instanzvariablen möglich.
70
Zugriffsrechte
String
int
public class Student {
private String name;
private int nummer;
}
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
3. Klassen
Ist das Grundprinzip der Kapselung erfüllt?
Die Klasse AndereKlasse enthalte folgende Anweisungen:
• Haben wir die interne Struktur der Klasse Student von der Schnittstelle nach
außen getrennt?
• Könnten wir die Instanzvariablen einfach verändern, ohne hiermit Probleme zu verursachen?
Student studi = new Student();
Zugriffsrechte
studi.name = "Karla Karlsson";
studi.nummer = 4711;
Wenn wir versuchen, AndereKlasse zu übersetzen, erhalten wir einen Fehler der
Form:
Nein!
Wie können wir dies ändern?
Variable name in class Student not accessible
from class AndereKlasse.
• Anpassung der Zugriffsrechte für die Instanzvariablen.
• Deklaration von Zugriffsmethoden.
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
72
Das heißt, die Zugriffe werden verweigert.
71
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
73
3. Klassen
Instanzmethoden
Instanzmethoden
3. Klassen
public void setNummer( int n ) {
nummer = n;
}
Wie können wir Daten aus Objekten auslesen oder zuweisen, wenn wir hierzu nicht
berechtigt sind?
☞ Wir erweitern die Klasse um Instanzmethoden.
Darstellung als Klassendiagramm:
• Instanzmethoden sind beim Aufruf stets an ein Objekt gebunden, d.h. wir rufen
eine Instanzmethode auf einem Objekt auf.
• Innerhalb der Instanzmethode haben wir Zugriff auf alle Instanzvariablen.
• Methoden haben ihre eigenen Zugriffsrechte.
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
3. Klassen
74
Instanzmethoden
Student
-name:
-nummer:
+getName()
+getNummer()
+setName(String)
+setNummer(int)
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
String
int
String
int
void
void
76
3. Klassen
Instanzmethoden
Was ist this?
Syntax der Deklaration von öffentlichen Instanzmethoden:
• Das Schlüsselwort this liefert innerhalb
einer Instanzmethode immer eine Referenz auf das Objekt selbst, d.h. auf das
Objekt, auf dem die Methode aufgerufen
wurde.
• Das Schlüsselwort this wird insbesondere dann benötigt, wenn Instanzvariablen durch Namenskonflikte verdeckt werden.
Beispiel: Die Methode setName. Der formale Parameter name verdeckt die Instanzvariable name.
• Mittels this.name können wir die Instanzvariable ansprechen.
• Der Compiler “denkt ein wenig mit”. Liegen keine Namenskonflikte vor, ist die Angabe von this nicht notwendig.
public Rückgabetyp Methodenname ( Parameterliste ) {
Anweisungen
}
Beispiele:
public String getName() {
return name;
}
public int getNummer() {
return nummer;
}
public void setName( String name ) {
this.name = name;
}
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
Instanzmethoden
75
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
"Karla Karlsson"
name
nummer
4711
this
77
3. Klassen
Instanzmethoden
3. Klassen
Instanzmethoden
Beispiel: Ausgabe von Objekten auf der Konsole:
Instanzmethoden als erweiterte Funktionalität
public String toString() {
return name + " (" + nummer + ")";
}
Wir wollen die Menge der gültigen Matrikelnummern einschränken:
Nutzung:
Eine Matrikelnummer sei dann gültig, wenn sie fünf Stellen sowie keine führenden Nullen hat und ungerade ist.
Hierfür definieren wir eine Methode validateNummer:
public boolean validateNummer() {
return (nummer >= 10000 && nummer <= 99999 && nummer % 2 != 0);
}
Student studi = new Student();
studi.setName("Karla Karlsson");
studi.setNummer(12345);
System.out.println(studi.toString());
Prinzipiell reicht sogar die Anweisung:
System.out.println(studi);
Grund: Jedes Objekt verfügt automatisch über eine Methode toString, die für die
Ausgabe genutzt wird. Wir haben hier toString überschrieben.
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
3. Klassen
78
Instanzmethoden
Wir können nun unsere Methode setNummer so ändern, daß nur noch gültige Matrikelnummern akzeptiert werden.
public void setNummer(int n) {
int alteNummer = nummer;
nummer = n;
if (!validateNummer())
nummer = alteNummer;
}
Bemerkungen:
• höhere Funktionalität
• ohne Datenkapselung nicht möglich
• keine Änderung an der Schnittstelle der Klasse Student
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
79
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
80
Herunterladen