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

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.

So verwendest du in Java try und catch Blöcke

Java try und catch

Ich bereue lieber die Dinge, die ich getan habe – als die Dinge, welche ich gar nicht erst versucht habe. Ja ich würde mich als den typischen „try-and-error-Menschen“ bezeichnen. Was ich will, probiere ich einfach aus und schaue dann erst was passiert. So etwas wie Pläne kenne ich eigentlich nicht. Und wenn ich mal einen […]

So lassen sich aus Java Klassen Instanzen erstellen

Java Klassen Instanzen erstellen

Lass uns jetzt aus den Java Klassen heraus Objekte anlegen. Im Einführungsbeispiel hast du bereits gelernt, wie du: Instanzvariablen bzw. Attribute anlegst Wie du aus einer normalen Java Klasse eine Programmstart Klasse machst In diesem Artikel erfährst du: Was Objekte bzw. Instanzen sind. Wie sich Objekte zusammensetzen. Wo und wie du Instanzen aus Java Klassen […]

Java lernen von Kopf bis Fuß

Wenn du Java lernen möchtest, kannst du an meinem kostenlosen Java Kurs teilnehmen. Aber manch Einer hätte gern eine zweite Meinung. Und da bieten sich natürlich Java Bücher an. Eines dieser Java Bücher möchte ich dir jetzt vorstellen. Dieses Buch nennt sich „Java von Kopf bis Fuß“. Was kannst du von diesem Buch erwarten? Also […]

So verwendest du den Java Oder Operator

Java Oder Operator

Kennst du das auch aus deiner Schulzeit? Du schreibst eine Klassenarbeit in irgendeinem Fach. Nehmen wir einfach mal an – Mathe. Jetzt bist gerade fertig mit deiner Arbeit. Und zu Hause wirst du gefragt: „Und wie lief es?“ Du antwortet:“ Ganz gut. Es wird bestimmt eine Eins oder eine Zwei.“ Drei oder vier Tage später […]

Java Vererbung findet auch zwischen Einkaufstüten und Polizeiautos statt

Java Vererbung

„Manchmal findet Java Vererbung auch zwischen Einkaufstüten und Polizeiautos statt“ Irrer Titel, oder? Aber mal Hand aufs Herz. Was haben eigentlich eine Einkaufstüte und ein Polizeiwagen gemeinsam? Ich verrate dir etwas: Du kannst die Verbindung nicht erkennen, denn ich habe dir nicht alles verraten. Es fehlt noch ein wichtiger Aspekt – eine Verbindung zwischen beiden. […]

Die mathematischen Grundlagen des Dezimalsystems für Java Programmierer

Java Dezimalsystem Mathematik Programmierer

Bei der Java Programmierung benötigst du Kenntnisse über das Dezimalsystem. Allein schon für die technische Umsetzung beim Runden einer Zahl. Oder du möchtest den Kehrwert bzw. den Umkehrwert einer Zahl im Programm bestimmen lassen. Aber auch für das Herausfinden des Stellenwertes – also wieviel Stellen hat eine Zahl – benötigst du das Grundwissen des Dezimalsystems. […]

Von Java Klassen zum Java Programm – Der Programmstart

Java Klassen ausführen

In den letzten Beiträgen hast du gelernt, wie Java Klassen erstellt werden und aufgebaut sind. In diesem Beitrag geht es um den Programmstart. Ich will dir zeigen, was nötig ist, dass du ein Java Programm ausführen kannst. Und ich zeige dir außerdem, wie du eine Startklasse in einem x-beliebigen Javaprogramm anlegst. Wie auch schon zuvor, […]