Klassen und Objekte

Werbung
Klassen und Objekte
Wiederholungsvorlesung
Programmiermethodik und Compilerbau,
2003
Klassen und Objekte(1)
•
•
Eine Klasse definiert einen neuen, höheren Datentyp
Eine Klasse besteht aus
– Variablen (Daten...)
– Methoden (Manipulation dieser Daten)
•
Definition einer Klasse in Java:
Schlüsselwort class
class Person {
String name;
int Alter;
Variablen
Methode
public void ausgabe() { ... }
}
Programmiermethodik und Compilerbau,
2003
Klassen und Objekte(2)
• Ein Objekt ist eine Instanz einer Klasse
?
Attribute einer Person:
Name, Alter
Objekt ist Instanz
einer Klasse
Xaver, 23 Jahre
Eine Klasse
Ein Objekt
Programmiermethodik und Compilerbau,
2003
Klassen und Objekte(3)
• Damit: Eine Klasse ist sozusagen ein „Bauplan“ für
ein konkretes Objekt
• Um in Java ein Objekt einer Klasse zu erzeugen,
dient das Schlüsselwort new:
class Person { ... }
// ... Beliebige Programmstelle...
Person xaver = new Person();
Programmiermethodik und Compilerbau,
2003
Erzeugung von Objekten
• Erzeugung eines Objekts:
Person xaver = new Person();
Klassentyp
Referenz auf
ein Person-Objekt
Mit new ein Objekt
erzeugen
• Zugriff auf die Eigenschaften eines Objekts:
xaver.name = “Xaver“;
xaver.alter = 23;
Programmiermethodik und Compilerbau,
2003
Methoden
• Methoden: Teilprogramme, die die Daten eines
Objektes bearbeiten:
• class Person {
int alter;
String name;
Methode, gibt die jeweilige
Person aus
public void ausgabe() {
System.out.println(name+ “ ist “+
alter+“ Jahre alt.“)
}
}
Innerhalb einer Klasse kann auf die
Attribute einfach zugegriffen werden
Programmiermethodik und Compilerbau,
2003
Methodenaufruf
• Aufruf einer Methode
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
p1.name = “Xaver“; p1.alter = 23;
p2.name = “Yvonne“; p2.alter = 21;
p1.ausgabe();
p2.ausgabe();
Xaver ist 23 Jahre alt.
Yvonne ist 21 Jahre alt.
}
Programmiermethodik und Compilerbau,
2003
Konstruktion von Objekten
• Zur Initialisierung von Objekten gibt es spezielle
Methoden:
Methode ohne
Rückgabewert, Name
gleich der Klasse:
class Person {
String name;
Person(String n) {
name = n;
}
Ein Konstruktor (denn er
"konstruiert" das Objekt)
}
Kontruktoraufruf bei
...
Erzeugung des Objektes
Person p3 = new Person("Xaver");
Programmiermethodik und Compilerbau,
2003
Konstruktion von Objekten
• Mehrere Konstruktoren erlaubt
• Gegenseitiges Aufrufen möglich
• Default-Konstruktor: Jede Klasse besitzt automatisch
einen Konstruktor ohne Parameter
class Person {
String name;
Konstruktor ruft mit
Schlüsselwort "this"
weiteren Konstruktor auf
Person() { this("Namenlos"); }
Person(String name) {
this.name = name;
}
}
Programmiermethodik und Compilerbau,
2003
Selbstreferenz this
• this bezeichnet immer das aktuelle Objekt
• Verwendungsbeispiele:
– this zur Auflösung von Namenskonflikten
– this zum Aufrufen eines weiteren Konstruktors
"Rufe den Konstruktor
dieser Klasse auf, die
einen String als
class Person {
String name;
Parameter hat"
Person() { this("Namenlos"); }
Person(String name) {
this.name = name;
Namenskonflikt: Attribut
}
}
der Klasse und
übergebener Parameter
Programmiermethodik und Compilerbau,
2003
public und private
Public: Zugriff auf eine Variable / Methode ist von
außerhalb erlaubt
Private: Zugriff auf eine Variable / Methode ist nur
innerhalb der Klasse erlaubt
Damit kann der Zugriff auf die Eigenschaften eines
Objektes eingeschränkt werden
Programmiermethodik und Compilerbau,
2003
public und private
• Schlechtes Beispiel:
public class Rechteck {
public int hoehe, breite, flaeche;
}
...
Rechteck r = new Rechteck();
r.hoehe = 10;
r.breite = 5;
r.flaeche = 42;
Freier Zugriff auf alle
Felder des Objekts führt
hier zu einem
inkonsistenten Objekt!
Programmiermethodik und Compilerbau,
2003
public und private
• Besser: "Verstecken" der Eigenschaften, dafür
Methoden für den Zugriff, um Zustand konsistent zu
halten:
public class Rechteck {
private int hoehe, breite, flaeche;
public void setHoehe(int hoehe) {
this.hoehe = hoehe;
flaeche = breite*hoehe;
Bei Änderung der Höhe
}
Fläche neu berechnen
public int getHoehe() { return hoehe; }
}
Programmiermethodik und Compilerbau,
2003
public und private
• Public/Private bei Methoden:
– private: Methode kann nur innerhalb der eigenen Klasse
aufgerufen werden
– public: Methode ist auch außerhalb der eigenen Klasse
sichtbar
• Public bei Klassen: Klasse ist nach außen sichtbar
(z.b. bei mehreren Klassendefinitionen in einer Datei)
• "Geheimnisprinzip"
Programmiermethodik und Compilerbau,
2003
Referenzen (Verweise)
• In Java sind Variablen eines Klassentyps immer
Referenzen auf das eigentliche Objekt:
// Was ergibt dieses Programm?
public class Test {
int wert=0;
public static void main(String[] args) {
Test t1 = new Test();
Test t2 = t1;
t1.wert = 5;
System.out.println(t2.wert);
}
}
Programmiermethodik und Compilerbau,
2003
Referenzen (Verweise)
• Situation des vorherigen Programms zeichnerisch:
t1
Test
wert: 5
t2
• t1.wert und t2.wert bezeichnen dieselbe Variable!
Programmiermethodik und Compilerbau,
2003
Klassenmethoden(1)
Problem: Wenn Code immer mit einem Objekt verknüpft
ist, wo kommt denn dann das erste Objekt her?
Antwort: Es gibt nicht nur Objektmethoden, sondern
auch Klassenmethoden und Klassenvariablen.
Klassenmethoden können ausgeführt werden, ohne
daß ein Objekt der jeweiligen Klasse existiert.
Klassenvariablen existieren genau einmal in der
jeweiligen Klasse.
Programmiermethodik und Compilerbau,
2003
Klassenmethoden(2)
Definition einer Klassenmethode:
static void mache_etwas() { ... }
Definition einer Klassenvariable:
static int personenzahl = 0;
Da Klassenmethoden unabhängig von Objekten
aufgerufen werden können, dürfen sie natürlich nicht
auf Objektvariablen zugreifen.
Programmiermethodik und Compilerbau,
2003
Klassenmethoden(3)
• Aufruf von Klassenmethoden
class Hilfsroutinen {
public static int min(int a, int b) {
if (a>b) return b; else return a;
}
}
public class MeineKlasse {
public static void main(String[] args) {
int a = Hilfsroutinen.min(4,7);
System.out.println(a);
}
}
Aufruf einer static-Methode:
Klassenname.methodenname(...);
Programmiermethodik und Compilerbau,
2003
Klassenvariablen
Beispiel: Zählen von Objektinstanzen
Klasse
public class Person {
static int personenzahl=0;
public static void main(String[] args) {
Person p1 = new Person("Xaver");
Person p2 = new Person("Yvonne");
System.out.println(personenzahl);
}
public String name;
Objekt
Person(String name) {
this.name = name; personenzahl++;
}
}
Programmiermethodik und Compilerbau,
2003
personenzahl == 1
personenzahl == 2
Ein Zeichenstift(1)
Gegebene Funktionen zum Zeichnen auf einer Fläche:
// erzeugt eine Ausgabefläche
Bildschirm.initialisieren();
// zeichnet eine Linie von (x1,y1) nach (x2,y2)
Bildschirm.zeichneLinie(x1,y1,x2,y2);
Programmiermethodik und Compilerbau,
2003
Ein Zeichenstift(2)
(0,0) X
Y
Attribute eines Stiftes:
Position, Richtung
Methoden:
fahre(int distanz);
drehe(int grad)
(600,400)
Programmiermethodik und Compilerbau,
2003
Herunterladen