homedukeOOP mit Java: Klassen, Objekte, Referenzen und Konstruktoren Prof. Dr. Uwe Schmidt FH Wedel

Klassen, Objekte, Referenzen und Konstruktoren

weiter

weiter

Klassen

Klassen
Bauplan für strukturierte Datentypen und darauf definierten Operationen.
weiter
Bestandteile
von Klassen: Variablen und Methoden
weiter
Variablen
Datenkomponenten in einer Klasse
weiter
Methoden
Operationen auf diesen Datenkomponenten
weiter
Beispiel
class X {
  int d;
 
  public
  int getD() {
    return d;
  }
 
  public
  void setD(int d1) {
    d = d1;
  }
}
weiter
merke
In Java gilt: Klassen sind etwas Statisches.
Die Eingenschaften einer Klasse sind vollständig zur Übersetzungszeit bekannt.
merke
Aus Sicht der Methoden sind die Variablen in einer Klasse globale Variablen.

weiter

Objekte

Objekt
ein Exemplar, eine Instanz einer Klasse
weiter
Erzeugung
mit dem new-Operator
 
... new X() ...
weiter
Referenz
Verweis, Zeiger auf ein Objekt
weiter
new
liefert einen Verweis, eine Referenz auf ein Objekt
weiter
merke
Ein Objekt wird eindeutig durch eine Referenz identifiziert.
weiter
merke
Referenzen können ausschließlich mit dem new-Operator erzeugt werden.
weiter
Variablen
mit einem Referenztyp (class, interface, array) enthalten immer eine Referenz auf ein Objekt
 
X x1 = new X();
X x2;
...
x2 = new X();
weiter
merke
Die Variablen eines Objektes bilden den Zustand des Objekts.
merke
Die Variablen eines Objektes können von den Methoden des Objekts gelesen und verändert werden.
weiter
Initialisierung
von Referenzvariablen mit der ungültigen Referenz null
 
X x1;
X x1 = null;  // gleichwertig
weiter
Dereferenzieren
mit .-Notation
 
X x1;
 
... x1.d ...
... x1.getD() ...
weiter
Überprüfung
immer auf ungültiges Dereferenzieren
 
X x1 = null;
 
x1.setD(42);  // --> Ausnahme wird ausgelöst
 
weiter
Vergleiche
auf Referenzen
 
X x1x2;
 
... (x1 == x2) ...
merke
Die Referenzen werden verglichen, nicht die Zustände der Objekte
weiter
Zuweisungen
mit Variablen mit einem Referenz-Typ kopieren immer nur die Referenz auf ein Objekt.
 
X x1,x2;
 
x1 = new X();
x2 = x1;
x2.setD(42);
... x1.getD() ... // --> 42
weiter
merke
Nur Zeiger werden kopiert, keine Inhalte
weiter
Speicherfreigabe
von Objekten implizit, automatisch, wenn keine Referenz mehr existiert.
 
x1 = null;
x2 = null;  // Freigabe wird möglich
            // keine "Speicherlecks"
weiter
Object
eine vordefinierte Klasse.
Alle Klassen sind Unterklassen der Klasse Object
Alle Klassen enthalten mindestens die Methoden aus der Klasse Object
weiter
merke
Objekte sind etwas Dynamisches.
Objekte existieren erst zur Laufzeit.

weiter

Vordefinierte Klassen für einfache Datentypen

Klassen
Typ Klasse
intInteger
byteByte
shortShort
longLong
floatFloat
doubleDouble
charCharacter
weiter
Methoden
zur Konversion von Werten
 
public static String toString(int i)
public static int parseInt(String s)
 
public byte   byteValue()
public short  shortValue()
public long   longValue()
public float  floatValue()
public double doubleValue()
weiter
Konstanten
public static final int MIN_VALUE
public static final int MAX_VALUE

weiter

Die String Klasse

vordefiniert im Paket java.lang
weiter
Eigenschaften
kein char Array
nicht 0-terminiert
kein explizites Längenfeld
eigenständiger abstrakter Datentyp
weiter
Erzeugen
String s = "eine Zeichenreihe";
 
String s = new String("eine Zeichenreihe");
weiter
Verkettung
Operator + zum Konkatenieren von Zeichenreihen
 
"zusammengesetzt aus" +
"2 Teilen"
weiter
Konvertierung
in der Klasse String gibt es für alle einfachen Datentypen Methoden valueOf zur Konvertierung in Zeichenreihen.
 
Impliziter Aufruf:
 
int    i = 2,
       j = 3;
 
String s = i + " + " + j + " = " + (i + j);
 
String t = "2 + 3 = 5";
weiter
fix
Strings können nicht verändert werden
weiter
ab Java 1.5, können verändert werden
können verändert werden
Operationen werden synchronisiert (thread-save)
gleiche Schnittstelle wie StringBuilder

weiter

Objektvariablen und Klassenvariablen

Objektvariablen
jedes Objekt besitzt sein eigenes Exemplar der in der Klasse deklarierten Variablen
 
class X {
  int i;
}
 
X x1 = new X();
X x2 = new X();
 
x1.i = 5; // x2.i == 0
 
x2.i = 6; // x1.i == 5
weiter
Klassenvariablen
(static-Variablen)
alle Objekte arbeiten mit dem gleichen Exemplar der in der Klasse deklarierten Variablen
 
class X {
  static
  int s;
}
 
X x1 = new X();
X x2 = new X();
 
x1.s = 5; // x2.s == 5
x2.s = 6; // x1.s == 6
          // X.s  == 6
weiter
merke
Konstantendefinitionen durch Klassenvariablen mit final Attribut, auch in Schnittstellen erlaubt
 
class X {
  final static int    THE_ANSWER = 42;
  final static String THE_QUESTION = "???";
}
weiter
Klassenmethoden
(static-Methoden)
Methoden, die nicht auf den Daten eines Objekts arbeiten, sondern höchstens auf den Klassenvariablen
 
class X {
  static
  int i;
 
  int j;
 
  static
  void f() {
    ... i ... // legal
    ... j ... // nicht zugreifbar
  }
}
weiter
merke
einfache Funktionen, sin, cos, ..., werden als Klassenfunktionen der Klasse Math implementiert.
 
Klassen als Namensraum verwendet


weiter

Konstruktoren

Erzeugung
von Objekten mit Konstruktor-Funktionen
weiter
Namenskonvention
Konstruktorname = Klassenname
weiter
Aufgabe
Initialisierung von Datenfeldern bei der Erzeugung von Objekten
weiter
Beispiel
class X {
  private
  int i;
 
  public X() {
    i = 24;
  }
}
weiter
gut
NIE uninitialisierte Variablen
problemspezifische Initialisierung wird erzwungen
weiter
default-
Konstruktor
Ist kein Konstruktor in einer Klasse angegeben, so wird ein default-Konstruktor vom Java-Compiler generiert.
In diesem werden alle Datenkomponenten mit den default-Werten initialisiert.
weiter
Beispiel
class X {
  private
  int i;
}
 
ist gleichwertig zu
 
class X {
  private
  int i;
 
  public X() {
    i = 0;
  }
}
weiter
Konstruktoren mit Parameter
erlauben eine flexible Initialisierung
weiter
Beispiel
class X {
  private
  int i;
 
  public X(int i) {
    this.i = i;
  }
}
 
Aufruf
 
... new X(13) ...
 
hier fehlerhaft
 
... new X() ...
weiter
Überladen
von Konstruktoren ist möglich
 
Die Konstruktoren müssen sich aber in der Anzahl oder der Art der Parameter unterscheiden
weiter
Beispiel
class X {
  private
  int i;
 
  public X() {
    i = 24;
  }
 
  public X(int i) {
    this.i = i;
  }
}
 
ist o.k.
 
Aufrufe
 
... new X(13) ...
... new X() ...
 
class X {
  private
  int i;
 
  public X() {
    i = 24;
  }
 
  public X() {
    i = 42;
  }
}
 
ist fehlerhaft
Konstruktoren sind im Aufruf nicht unterscheidbar
weiter
Variante
Konstruktoren können andere Konstruktoren aufrufen
Vermeidung von Codeverdopplung
weiter
Beispiel
class X {
  private
  int i;
 
  public X() {
    this(24);
  }
 
  public X(int i) {
    this.i = i;
  }
}
 
ist gleichwertig zu
 
class X {
  private
  int i;
 
  public X() {
    i = 24;
  }
 
  public X(int i) {
    this.i = i;
  }
}
weiter
merke
Klassenvariablen werden üblicherweise nicht mittels Konstruktoren initialisiert,
können aber referenziert werden
weiter
Beispiel
class X {
  static
  int numberOfXObjects = 0;
 
  private
  int i;
 
  public X() {
    ++ numberOfXObjects;
  }
}
 
zum Zählen der erzeugten Objekte für eine Klasse
weiter

Letzte Änderung: 28.04.2014
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel