Im Unterschied zur Klassenmethode muss eine Objektmethode an einem konkret instanziierten Objekt aufgerufen werden, dies ist bei Klassenmethoden nicht der Fall.
Bislang haben wir bei der Definition unserer main-Methoden immer das Schlüsselwort static vorangestellt. Damit erreichen wir, dass eine Klassenmethode angelegt wird. Selbes gilt auch für Attribute durch das Voranstellen von static.
Beispiel
Am Besten schauen wir uns den Unterschied zwischen Klassenmethoden und Objektmethoden an einem konkreten Beispiel an:
public class Auto { // Klassenattribute static int anzahlRaeder = 4; // Objektattribute String marke, farbe; double verbrauch; // Klassenmethode static void wieVieleRaeder() { System.out.println("Ein Auto hat " + anzahlRaeder + " Räder!"); } // Objektmethoden void fahren() { System.out.print(this.marke + " fährt, "); System.out.println("brumm brumm brumm..."); } // Konstruktor public Auto(String marke, String farbe, double verbrauch) { this.marke = marke; this.farbe = farbe; this.verbrauch = verbrauch; } // Main Methode public static void main(String[] args) { // Objekte instanziieren Auto pkw1 = new Auto("Audi", "schwarz", 5.6); Auto pkw2 = new Auto("BMW", "weiß", 6.3); // Objektmethoden aufrufen pkw1.fahren(); pkw2.fahren(); // Klassenmethode aufrufen wieVieleRaeder(); } }
Wir definieren ein Objekt Auto über die Attribute:
- Marke
- Farbe
- Verbrauch
Diese Attribute können pro Auto mit einem objektspezifischen Wert belegt werden, dies erfolgt mit dem Konstruktor.
Nach der Instanziierung eines Objekts können wir die Objektmethode fahren() an einem konkreten Objekt aufrufen und so über this auch auf die Objektattribute zugreifen.
Audi fährt, brumm brumm brumm...
BMW fährt, brumm brumm brumm...
Die Gesamtheit aller Autos lässt sich über die Anzahl der Räder beschreiben, die Belegung gilt über alle Objekte hinweg. Daher wird anzahlRaeder() als static definiert.
Ein Auto hat 4 Räder!
Aus einer Klassenmethode hat man keinen Zugriff auf Attribute eines Objekts, d.h. this funktioniert nur in Objektmethoden.
Mit dem nun gewonnenen Wissen über Objetmethoden können wir die im Beitrag Konstruktor geschriebene Klasse Mitarbeiter vereinfachen. Die Ausgaben auf der Konsole können wir in eine Methode print() verlagern und somit die main-Methode vereinfachen und unseren Code übersichtlicher gestalten. Hierfür muss nur das konkrete Objekt mitarbeiter1 durch die this-Referenz ausgetauscht werden.
public class Mitarbeiter { // Attribute int personalnummer; String name, vorname, abteilung; // Objektmethode void print() { System.out.print("Personalnummer: "); System.out.println(this.personalnummer); System.out.print("Name: "); System.out.println(this.name); System.out.print("Vorname: "); System.out.println(this.vorname); System.out.print("Abteilung: "); System.out.println(this.abteilung); } // Standardkonstruktor public Mitarbeiter() { } // Eigener Konstruktor public Mitarbeiter(int personalnummer, String name, String vorname, String abteilung) { this.personalnummer = personalnummer; this.name = name; this.vorname = vorname; this.abteilung = abteilung; } public static void main(String[] args) { // Neuen Mitarbeiter instanziieren Mitarbeiter mitarbeiter1 = new Mitarbeiter(123, "Müller", "Hans", "Vertrieb"); // Ausgabe der Attribute mitarbeiter1.print(); } }
Personalnummer: 123
Name: Müller
Vorname: Hans
Abteilung: Vertrieb
Die Ausgabe auf der Konsole bleibt unverändert zur bisherigen Implementierung.
Im nächsten Beitrag werden wir mit Getter- und Settermethoden einige Objektmethoden schreiben und verwenden.