Skip to main content

Der bedeutende Unterschied zwischen Klassenvariablen und Instanzvariablen

Bei der Java Programmierung unterscheidet man drei Arten von Variablen.

Als erste Gruppe sind die lokalen Variablen zu nennen.
Auf diese gehe ich in einem separaten Artikel ein.

Mich interessieren die zwei anderen Variablentypen.

Zum einen existieren Klassenvariablen.
Und dann sind da noch die Instanzvariablen.

Wo liegt der Unterschied?
Instanzvariablen stehen einem Objekt zur Verfügung.
Klassenvariablen stehen allen Objekten zur Verfügung.

Wie meine ich das?
Ganz einfach.

Stell dir vor, du erstellst eine Mitarbeiterverwaltung.

Dazu erstellst du Mitarbeiterobjekte.
Jeder Mitarbeiter hat eine Nummer.
Diese wären Instanzvariablen.

Nehmen wir weiter an, du hast drei Mitarbeiter.
Carmen, Peter und Mathias.

Und jeder Mitarbeiter bekommt jetzt diese Nummer.
Bei einer Instanzvariablen würde diese Nummer dann dreimal existieren.

Jedes Objekt hätte diese Nummer.
Und natürlich könnte diese Nummer dann auch dreimal den gleichen Wert annehmen.

Du erstellst also das Carmen-, das Peter- und das Mathias-Objekt.
Und schon haben alle drei Objekte die Nummern -Instanzvariable.

Ich verdeutlich das ganze Prinzip einmal auf diesem Bild.


Java Instanzvariable

Und im Java Programm würde dies dann so aussehen:


public class Mitarbeiter {
int nummer=1;//das soll eigentlich eine laufende Nummer werden
String vorname;//der Vorname des Mitarbeiters


Mitarbeiter (String derVorname){ //Konstruktor mit Parameterliste
vorname=derVorname; //Zuweisung der Instanzvariablen vorname
System.out.println("Mitarbeiter "+nummer+" heißt "+vorname);
}
}

Ganz kurz – Was siehst du hier.
In der Klasse Mitarbeiter legst du den Bauplan für ein Mitarbeiter Objekt an.
Dieser Bauplan enthält einen Konstruktor und die Instanzvariablen „nummer“ und „vorname“.

Der Konstruktor hat eine Parameterliste und nimmt den Vornamen entgegen.
Im Konstruktorrumpf wird jetzt das Argument aus der Paramterliste zugewiesen.
Außerdem kannst du im Konstruktorrumpf eine Konsolenausgabe anlegen, welche dir den Wert der Instanzvariablen zurückgibt.

Und um die Instanzvariable „nummer“ geht es eigentlich nur.

Dann erstellst du eine Programmklasse.


public class MitarbeiterVerwaltung{
public static void main (String [] args) {
Mitarbeiter carmen = new Mitarbeiter ("Carmen");
Mitarbeiter peter = new Mitarbeiter ("Peter");
Mitarbeiter mathias = new Mitarbeiter ("Mathias");
}
}

Und diese enthält die main-Methode zum Programmstart.

Dann legst du deine Mitarbeiterobjekte an, übergibst die Argumente und startest das Programm.

Na was ist passiert?
Alle drei Objekte haben den gleichen „Nummern-Wert“.

Aber!
In einer Mitarbeiterverwaltung gibt es ja so etwas wie laufende Nummern oder Mitarbeiter ID-Nummern.
Und diese Nummern sollten dann mitarbeiterspezifisch sein.

Das bedeutet doch, dass der Wert dieser Nummern von Mitarbeiter zu Mitarbeiter unterschiedlich sein sollte.

Oder anders gesagt:
Kein Mitarbeiter darf die gleiche laufende Nummer besitzen, wie ein anderer.

Versuchen wir doch einmal die Instanzvariable im Konstruktor zu erhöhen.


public class Mitarbeiter {
int nummer=1;//das soll eigentlich eine laufende Nummer werden
String vorname;//der Vorname des Mitarbeiters


Mitarbeiter (String derVorname){ //Konstruktor mit Parameterliste
vorname=derVorname; //Zuweisung der Instanzvariablen vorname
nummer=nummer+1;//Erhöhung um jeweils 1
System.out.println("Mitarbeiter "+nummer+" heißt "+vorname);
}
}

Die Klasse „MitarbeiterVerwaltung“ brauchst du nicht ändern.
Klicke auf „Run“.

Und alle Mitarbeiter haben jetzt die Nummer 2.
Blöd…

So ein Vorhaben kannst du nicht über Instanzvariablen lösen.
So etwas bekommst du aber mit Klassenvariablen hin.

Klassenvariablen sind globale Variablen.

Das bedeutet:
Klassenvariablen stehen nicht einem Objekt zur Verfügung.

Eine Klassenvariable steht allen Objekten zur Verfügung.


java klassenvariable

Wenn du dies jetzt in deine Mitarbeiterverwaltung einbauen möchtest, musst du eine statische Variable anlegen.
Der Ausdruck statisch ist lediglich eine andere Bezeichnung für die Klassenvariable.

Klassenvariablen sollten immer public sein.
Denn es sollen ja schließlich alle Objekte darauf zu greifen.

Eine Klassenvariable wird immer durch das Keyword static ausgezeichnet.
public static int

Und jetzt kannst du dieser Variablen einen Wert, im Konstruktor, zuweisen.
Ich werde den Wert der Variablen bei jedem Konstruktoraufruf um eins erhöhen.

Und so sieht das Ganze dann aus.


public class Mitarbeiter {
public static int laufendeNummer;//die Klassenvariable laufende Nummer
int nummer=1;
String vorname;//der Vorname des Mitarbeiters


Mitarbeiter (String derVorname){ //Konstruktor mit Parameterliste
vorname=derVorname; //Zuweisung der Instanzvariablen vorname
laufendeNummer=laufendeNummer+1;//Erhöhung der Klassenvariablen um jeweils 1
System.out.println("Mitarbeiter "+laufendeNummer+" heißt "+vorname);
}
}

Wenn du jetzt dein Programm startest, dann bekommt jedes Objekt eine individuelle Nummer zugewiesen.

Nochmal ganz kurz:
Du setzt also Instanzvariablen dazu ein, einen Mitarbeiter:

  • Eine individuelle Größe
  • Eine individuelle Anschrift
  • Eine individuelle Telefonnummer zuzuweisen.

Klassenvariablen nutzt du, um etwas nicht Individuelles zu platzieren.

Jetzt lass uns die Klassenvariable einmal an anderer Stelle aufrufen

Und zwar, möchte ich die laufende Nummer nicht bei null, sondern bei 1.000 starten.

Klar, du könntest in der Klasse Mitarbeiter der Variable gleich einen Wert zuweisen.

Ich möchte dir aber etwas anderes zeigen.
Und zwar möchte ich den Wert der Variablen in der main Methode zuweisen.

Jetzt befindet sich die main Methode in einer anderen Klasse.

Und deshalb musst du die Variable per Punktnotation ansprechen.

Also schreibe die Klasse, dann den Punkt und dann den Variablennamen.
Danach kannst du der statischen Variablen einen Wert zuweisen.


public class MitarbeiterVerwaltung{
public static void main (String [] args) {
Mitarbeiter.laufendeNummer=1000;//neuer Startwert der Variablen
Mitarbeiter carmen = new Mitarbeiter ("Carmen");
Mitarbeiter peter = new Mitarbeiter ("Peter");
Mitarbeiter mathias = new Mitarbeiter ("Mathias");
}
}

Klicke auf „Run“ und du startest mit einem neuen Startwert.

Du siehst:
Es besteht auch beim Zugriff ein Unterschied zu den Instanzvariablen.

Für einen Zugriff auf eine Instanzvariable musst du immer ein Objekt erschaffen.
Und dann kannst du per Punktnotation auf dieses Objekt und deren Eigenschaften zugreifen.

Auf eine Klassenvariable greifst du immer mit dem entsprechenden Klassennamen zu.

Zusammenfassung:

  • Instanzvariablen stehen immer einem Objekt zur Verfügung.
  • Immer wenn du einem bestimmten Objekt einen ganz individuellen Wert zuweisen möchtest, nutzt du Instanzvariablen.
  • Klassenvariable stehen allen Objekten zur Verfügung.
  • Deshalb nutzt du Klassenvariablen immer dann, wenn alle Objekte darauf zugreifen. (Beispiel: laufende Nummern, Summe aller Gehälter, einheitliche Hintergrundfarben bei Anwendungen usw.)

Na, hast du noch etwas zu ergänzen?
Habe ich irgendetwas vergessen?
Lass es mich wissen – Nutze doch das Kommentarfeld und hinterlasse einen Kommentar zum Beitrag.


Ähnliche Beiträge

So lassen sich Java Strings in char zerlegen

Java Strings zerlegen char

Java Strings sind Zeichenketten. Und diese Zeichenketten lassen sich aufsplitten und in ihre Einzelteile zerlegen. Ich möchte dir in diesem Beitrag Möglichkeiten vorstellen, wie du Strings in Character-Datentypen zerlegen, extrahieren und die Einzelteile in Arrays speichern kannst.

Über das kurze Leben einer lokalen Variablen

Java Variable lokal

Lass uns über die Lebensdauer einer lokalen Variablen sprechen. Warum ausgerechnet die Lebensdauer? Alle Java Variablen, unterscheiden sich in folgenden Punkten: wo diese deklariert werden können, wie du diese aufrufen kannst, welchen Bereich diese abdecken, und Ihre Lebensdauer Und eine lokale Java Variable hat eine relativ kurze Lebensdauer. Schauen wir uns zuerst Klassen- und Instanzvariablen […]

Java Übung 19 – Zähle die Kommastellen

Java Übung Kommastellen Zählen

In dieser Java Übung möchte ich, dass du eine Methode zum Zählen von Kommastellen schreibst. Lege dazu eine Klasse „KommaZahl“ an. Diese Klasse enthält die statische Methode „zaehleKommaStellen“, welche eine Kommazahl als übergebenen Parameter erwartet.

Java Übung 27 – Auf zur Mathe-Olympiade

Java Übung Mathe Olympiade

In dieser Java Übung möchte ich mit dir ein Programm erstellen, welches ein Mathematik-Test oder eine Mathe-Olympiade simuliert. Du kennst das vielleicht noch aus der Schule. Matheolympiade- Da wurden aus allen vier Grundrechenarten, Aufgaben formuliert. Die Schüler mussten diese Aufgaben lösen. Die Lehrer kontrollierten die Lösungen. Und der Schüler, welcher die wenigsten Fehler hatte – […]

Zwei smarte Möglichkeiten eine Java Zufallszahl zu erzeugen

Java Zufallszahl

Java Zufallszahl – Wieso? In der Java Programmierung benötigst du immer wieder einmal Zufallszahlen. Du möchtest deine Software mit Daten testen und dir keine Zahlen ausdenken. Du benötigst Stichproben, welche ein reales Verhalten simulieren. Du hast ein Spiel entworfen und die Akteure sollen mit zufälligen aber unterschiedlichen Größen, Rüstungsleveln usw. auftreten. Die Einsatzmöglichkeiten für Zufallszahlen […]

Java Polymorphie – besserer Code und mehr Möglichkeiten

Java Polymorphie Vorteile

Polymorphie ist das Herzstück jeder objektorientierten Sprache. Nicht nur in Java – auch in Python, Javascript und in anderen Sprachen. Aber was bedeutet Polymorphie eigentlich? Polymorphie oder auch Polymorphismus genannt, kommt aus dem Griechischen. Es bedeutet Vielgestaltigkeit. Etwas freier übersetzt, kannst du es auch als Facettenreichtum bezeichnen. Im Grunde genommen zielt die ganze Java Vererbung […]

Java lernen – 10 nützliche Tipps für Java Anfänger

Java Lernen Anfänger

Wenn du die Programmiersprache Java lernen möchtest, bist du hier prinzipiell erst einmal richtig. Und wenn du es wirklich ernst meinst und in die Java Programmierung einsteigen möchtest, solltest du auch meinen kostenlosen Java Kurs beanspruchen. Wenn du dabei bist, bekommst du: Eine Lektion pro Woche zu den Basics. Hier geht es um die ersten […]

Warum Java Kommentare immer ein Mittel der Kommunikation sind

Java Kommentare Kommunikation

Kennst Du die Bücherreihe „Miteinander reden“ von Schulz von Thun? Falls Du an der Uni warst oder bist, gehört dieses Buch zur Standardlektüre im Fach Schlüsselkompetenz. Denn ein Java Entwickler, welcher im Team arbeitet, muss klar und deutlich kommunizieren können. Und klar und deutlich heißt nicht, dass die Aussprache Deiner Worte verständlich sein soll. Nein […]

So kannst du dein Java Programm mit der main Methode ausführen

Auf zum ersten Java Programm. Vielleicht fragst du dich jetzt gerade: Na, was haben wir denn bisher gemacht? War das etwa kein Java Programm? Wir haben bisher nur eine Klasse „Human“ für ein zuküntfiges Mensch-Objekt erstellt. Diesem Objekt haben wir eine Instanzvariable, namens size (Größe) zugeordnet. Und wir haben eine Instanzmethode, namens grow (wachsen) geschrieben. […]

So kannst du in den Java Klassen Attribute anlegen

Java Klassen Attribute

Die bisherigen Java Klassen in unserem Einführungsbeispiel besitzen noch keine Attribute. Das ändern wir und legen diese jetzt an. In diesem Beitrag erfährst du: Warum Variablen in deinen Klassen eine entscheidende Rolle spielen. Was es bedeutet eine Variable zu deklarieren. Wo du Attribute in den Java Klassen anlegen darfst und wo nicht. Wie du durch […]