Objekt

Aus EINI
Version vom 2. Januar 2016, 23:05 Uhr von Hauer (Diskussion | Beiträge) (Eigenschaften eines Objekts)

Wechseln zu: Navigation, Suche

Ein Objekt ist eine thematische Zusammenfassung von Daten. Auf Datenebene ist ein Objekt nichts weiter als ein zusammenhängender Block Speicher. Anstatt jedoch die Bedeutung des Inhaltes dieses Speicherbereiches manuell zu interpretieren bieten objektorientierte Programmiersprachen dem Programmierer die Möglichkeit diese Daten direkt mit einer Semantik zu versehen.

Den Aufbau des Objektes wird durch seine Klasse bestimmt:

  • Die Attributvariablen repräsentieren die gespeicherten Daten
  • Die Methoden repräsentieren die auf diesen Daten ausführbaren Operationen
  • Die Konstruktoren repräsentieren die Art und Weise wie der Speicherbereich initialisiert wird.

Konzept

Das Konzept der objektorientierten Software ist es, Software so zu organisieren, dass sie dem Denkstil des objektorientierten menschlichen Gehirns entspricht. Man kann sich besser Objekte vorstellen, die etwas tun, als ein haufen an Daten irgendwo im flüchtigen Speicher des Computers.

Beispiel

Ein Quader kann durch folgende Werte repräsentiert werden: Höhe, Breite und Tiefe. Diese drei Werte können in Form dreier double Variablen vermerkt werden. Im Speicher kann ein Quader also durch drei double-Variablen direkt hintereinander im Speicher repräsentiert werden und verbraucht 192 bit an Platz. Zwei Quader, ein länglicher Block und ein Würfel, ließen sich dann folgendermaßen verwalten:

double blockWidth  = 2.0;
double blockHeight = 3.0;
double blockLength = 6.0;

double cubeWidth   = 4.0;
double cubeHeight  = 4.0;
double cubeLength  = 4.0;

Für zwei solcher Datensätze mag es noch ganz übersichtlich erscheinen, aber sobald man mehrere Hundert solcher Objekte verwalten will, wie z.B. in der Computergrafik üblich, so verliert man sehr schnell die Übersicht. Ebenso ist das Problem, dass diese Daten nicht verallgemeinert verwaltbar sind. Man kann nicht irgendeinen dieser Quader wählen und mit seinen Daten arbeiten, sondern muss jeden Quader ganz direkt bearbeiten und seine Daten verwalten. So sind z.B. leicht geschriebene Schleifen über alle so Quader nicht umsetzbar.

Stattdessen geht man den größeren Weg und definiert sich für seine Quader einen eigenen Datentyp:

public class Cuboid {
    private double width;
    private double height;
    private double length;
}

Durch diese Klasse werden bereits alle benötigten Daten zum repräsentieren eines Quaders reserviert. Mit dem Defaultkonstruktor kann man zudem bereits Quader erzeugen:

Cuboid[] cuboids = new Cuboid[10];
for(int i = 0; i < 10 ; i++){
    cuboids[i] = new Cuboid();
}

Man kann jedoch die Daten dieser Quader selbst noch nicht verändern. Dazu schreibt man für gewöhnlich Konstruktoren, die die Daten initialisieren:

public class Cuboid {
    private double width;
    private double height;
    private double length;

    public Cuboid(double width, double height, double length){
        this.width  = width;
        this.height = height;
        this.length = length;
    }
}

Den Defaultkonstruktor kann man nun nicht mehr verwenden, man muss einen öffentlichen Konstruktor aufrufen:

Cuboid[] cuboids = new Cuboid[10];
for(int i = 0; i < 10 ; i++){
    cuboids[i] = new Cuboid(i+1,i+2,i+3);
}

Jedes der so erstellten Objekte besitzt nun individuelle Werte und kann über das Array angesprochen werden. Die 6 Zeilen Code des ersten Beispieles lassen sich nun zudem auch folgendermaßen umsetzen:

Cuboid block = new Cuboid(2.0,3.0,6.0);
Cuboid cube  = new Cuboid(3.0,3.0,3.0);

Wenn man nun mit diesen Objekten arbeiten möchte, so kann man zudem relevante Operationen für diese Objekte auch als Methoden dieses Objektes formulieren:

public class Cuboid {
    private double width;
    private double height;
    private double length;

    public Cuboid(double width, double height, double length){
        this.width  = width;
        this.height = height;
        this.length = length;
    }

    public double getVolume(){
        return this.width * this.height * this.length;
    }
}

Mit der Verwendung:

Cuboid[] cuboids = new Cuboid[10];
for(int i = 0; i < 10 ; i++){
    cuboids[i] = new Cuboid(i+1,i+2,i+3);
}
[...]
for(int i = 0; i < 10; i++){
    System.out.println("Volume of Cuboid #"+i+": "+cuboids[i].getVolume());
}

Eigenschaften eines Objekts

Zustand

Jedes Objekt ist eine einzelne Instanz einer Klasse. Jedes Objekt einer Klasse besitzt seine eigenen, persönlichen Attribute, deren direkte Manipulation keinen Einfluss auf die Attribute anderer Objekte dieser Klasse haben.

Die individuellen Werte der Attribute eines Objektes nennt man daher auch seinen Zustand.

Beispiele

Die häufig verwendeten setter von Attributen ändern das Attribut des Objektes, auf welchem der setter aufgerufen wurde:

[...]
public void setWidth(double width){
    this.width = width;
}
[...]

Verhalten

Die innerhalb der Klasse definierten, nicht statischen, Methoden können nur auf einem Objekt ausgeführt werden. Anders formuliert führt das Objekt die Methode aus. Das Verhalten der Methode ist dann abhängig vom Zustand des Objektes, welches die Methode ausführt. So gibt z.B. die oben erwähnte getVolume()-Methode für jedes Objekt einen anderen Wert zurück. Ihr Ergebnis ist also abhängig vom Zustand (den Attributen) des Objektes.

Instanziierung

Zur Laufzeit werden Objekte erzeugt. Dies wird Instanzierierung genannt. Ein neues Objekt wird im Programmcode durch den new-Operator erzeugt. Dabei muss beachtet werden, dass Variablen, die auf ein Objekt verwiesen können, nicht immer ein Objekt besitzen. Erst nachdem derr new-Operator eihn Objekt erzeugt hat, besitzen die Variblen ein Objekt, ansonsten sind diese nur "Platzhalter."