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