Instanzvariable?

2 Antworten

Instanzvariablen bzw. Instanzattribute (Java Fachjargon) dienen der Beschreibung eines Objekts. Sie sind dessen Eigenschaften. So könnte es von einem Objekt apple, welches den Typ Fruit hat, eine Eigenschaft color geben:

class Fruit {
 String color;
}

Fruit apple = new Fruit();
apple.color = "red";

Jedes Objekt vom Typ Fruit hat nun eine Eigenschaft color. Doch nur bei dem Objekt, auf welches apple zeigt, ist der Wert dieser Eigenschaft red.

Attribute werden dabei innerhalb der Klasse gelistet, von der später die Objekte erzeugt werden. Innerhalb dieser Klasse hat sie die Rolle einer globalen Variable (existiert also so lange, wie auch das Objekt existiert) und kann in jedem instanzgebundenen Kontext aufgerufen werden.

Ein Beispiel:

class Toolbox {
  Screw[] screws;

  public Toolbox(int numberOfScrews) {
    screws = new Screw[numberOfScrews];
  }

  public Screw getFirstScrew() {
    if (screws.length > 0) {
      return screws[0];
    }

    return null;
  }
}

Um sprachlich nochmals zu verdeutlichen, dass es sich um ein Instanzattribut handelt, kannst du es auch explizit über das Schlüsselwort this aufrufen:

public Toolbox(int numberOfScrews) {
  this.screws = new Screw[numberOfScrews];
}

Das Schlüsselwort bezeichnet hierbei die aktuelle Instanz, welche gerade verwendet wird. So zeigt es bei diesem Aufruf:

Toolbox myToolbox = new Toolbox(5);

auf das neu angelegte Objekt, auf welches auch myToolbox später zeigt.

Die explizite Schreibweise eignet sich vor allem, wenn verhindert werden soll, dass eine lokale Variable das Attribut verdeckt.

Ein Beispiel:

public Toolbox(Screw[] screws) {
  screws = screws; // parameter (local variable) assigns its value to itself
  this.screws = screws; // parameter value will be assigned to attribute
}

Eine weitere Besonderheit von Attributen gegenüber lokalen Variablen ist, dass ihnen verschiedene modifier zugeordnet werden können (bei lokalen Variablen gibt es nur die Möglichkeit des final modifier). Mit diesen lässt sich bspw. der Zugriff von außen auf diese Variablen steuern.

Ein Beispiel:

class Toolbox {
  public Screw[] screws;

  private Nut[] nuts;
}

Toolbox box = new Toolbox();
box.screws = new Screw[5];
box.nuts = new Nut[2]; // error

In diesem Beispiel können Schraubenmuttern nicht gesetzt werden, denn sie sind nach außen hin nicht sichtbar. Das Konzept, bestimmte Inhalte nicht sichtbar zu gestalten, nennt sich Data-Hiding-Prinzip und ist ein wesentlicher Bestandteil der objektorientierten Programmierung. Eine kurze und einfache Erklärung ist diese: Siehe eine Klasse / ein Objekt als Mikrowelle. Alles was innen abläuft (Kabelgewirr, etc.) ist für den Verbraucher irrelevant. Nur bestimmte Funktionalitäten müssen von außen erreichbar sein (ein-/ausschalten, u.ä.).

Zuletzt sollte nur noch auf Klassenattribute eingegangen werden, um zu erklären, wieso man nicht einfach nur von Attributen redet.

Klassenattribute sind Attribute, die für alle Objekte einer Klasse gelten. Ändert sich das Attribut, ändert es sich für alle Objekte / Instanzen.

Ihnen wird ihnen der static modifier vorangestellt. So wie auch bei Instanzattributen, kann man ihre Sichtbarkeit setzen oder sie als Konstanten deklarieren.

class Car {
  static int numberOfWheels;

  int getNumberOfWheels() {
    return numberOfWheels;
  }
}

Car.numberOfWheels = 4;
Car audi = new Car();
System.out.println(audi.getNumberOfWheels()); // output: 4

Car vw = new Car();
System.out.println(vw.getNumberOfWheels()); // output: 4

Car.numberOfWheels = 5;
System.out.println(audi.getNumberOfWheels()); // output: 5
System.out.println(vw.getNumberOfWheels()); // output: 5

Die Lebensdauer eines statischen Attributs hängt von der Lebensdauer seiner Klasse ab. Innerhalb der Klasse ist es in jedem Kontext nutzbar, der Aufruf erfolgt wenn über den Klassennamen (kann innerhalb der Klasse aber weggelassen werden).

Natürlich finden sich noch weitere Unterschiede zwischen Instanz- und Klassenattributen (bspw. bei der Vererbung), auf diese werde ich hier aber nicht mehr eingehen.

Das sind 'globale' Variablen, die in der gesamten Klasse bekannt sind, also nicht nur in einer einzelnen Methode.
Diese Variable existiert aber je Instanz der Klasse genau einmal. In Gegensatz dazu gibt es auch Variablen, die eben nur einmal je Klasse existieren, auf die also alle Instanzen der Klasse zugreifen können. Wenn eine Instanz den Wert dieser Variablen ändert, ist der geänderte Wert den anderen Instanzen bekannt. Das ist bei Instanz Variablen eben nicht der Fall.
Eine neue Instanz dieser Klasse erzeugt man mit 'new Klassenname()'.