Javaschubla.de - Java als erste Programmiersprache
Voraussetzungen: Variablen und Strings.
(Nebenbemerkung: Wer schon objektorientiert in Java, C++ o.ä. programmieren kann, will nach dieser Lektion evtl. schreiend weglaufen, weil ich die Attribute nicht private mache und direkt auf sie zugreife statt über get- und set-Methoden ;-) . Aber es geht erstmal nur ums Grundverständnis. Methoden und Zugriffsmodifizierer kommen später.)
Vom HalloWelt-Programm und den anderen Beispielen her sind Klassen als Programme bekannt. Jetzt wollen wir Klassen als Datenstrukturen bzw. komplexen Datentyp kennen lernen.
Zur Erinnerung: Primitive Datentypen sind byte, short, int, long, float, double, char und boolean. Außerdem ist der Datentyp String bereits bekannt.
Nehmen wir als Beispiel ein Programm zur Lohnabrechnung von Angstellten. Angestellte haben einen Vornamen (String) und einen Nachnamen (String), ein Alter (int) und ein Gehalt (int).
Betrachten wir eine Minifirma mit zwei Angestellten, Frau Petra Müller und Herrn Leszek Wawrzyniak. Jetzt könnte man die Angaben über sie in acht Variablen speichern:
class AngestelltenVerwaltung { public static void main(String[] args) { // Angestellte Müller anlegen String vornameMül = "Petra"; String nachnameMül = "Müller"; int alterMül = 45; int gehaltMül = 1800; // Angestellten Wawrzyniak anlegen String vornameWaw = "Leszek"; String nachnameWaw = "Wawrzyniak"; int alterWaw = 23; int gehaltWaw = 1300; // Gehalt von Herrn Wawrzyniak erhöhen System.out.println("Das alte Gehalt von Herrn Wawrzyniak: " + gehaltWaw); gehaltWaw += 50; System.out.println("Das neue Gehalt von Herrn Wawrzyniak: " + gehaltWaw); } }
Zur Erinnerung:
Viel angenehmer als für jeden Angestellten diese vier Variablen anzulegen, wäre es, wenn man eine Datenstruktur "Angestellter" hätte, die Vorname, Nachname, Alter und Gehalt umfasst. Genau das tut eine Klasse.
class Angestellter { String vorname; String nachname; int alter; int gehalt; }
Schreib diesen Quellcode in eine separate Datei mit dem Namen Angestellter.java und kompilier sie wie üblich mit javac. (Alternativ kann man sie auch in dieselbe *.java-Datei wie die Klasse AngestelltenVerwaltung schreiben. Beim Kompilieren würden dann dennoch zwei *.class-Dateien entstehen.) Mit java ausführen kann man die Klasse Angesteller natürlich nicht - sie enthält ja keine main-Methode.
Nun verändert sich die Klasse AngestelltenVerwaltung so:
class AngestelltenVerwaltung { public static void main(String[] args) { // Angestellte Müller anlegen Angestellter mül = new Angestellter(); mül.vorname = "Petra"; mül.nachname = "Müller"; mül.alter = 45; mül.gehalt = 1800; // Angestellten Wawrzyniak anlegen Angestellter waw = new Angestellter(); waw.vorname = "Leszek"; waw.nachname = "Wawrzyniak"; waw.alter = 23; waw.gehalt = 1300; // Gehalt von Herrn Wawrzyniak erhöhen System.out.println("Das alte Gehalt von Herrn Wawrzyniak: " + waw.gehalt); waw.gehalt += 50; System.out.println("Das neue Gehalt von Herrn Wawrzyniak: " + waw.gehalt); } }
Wie üblich als AngestelltenVerwaltung.java speichern, mit javac kompilieren und mit java ausführen.
Angestellter mül = new Angestellter();
hätte man auch wieder als zwei Anweisungen schreiben können:
Angestellter mül; mül = new Angestellter();
Zuerst wird eine Variable namens mül vom Typ Angestellter deklariert. Klassen sind also Typen. int, double, char etc. sind einfache oder primitive Datentypen. Klassen sind zusammengesetzte oder komplexe Datentypen.
Dann wir die Variable mül initialisiert, d.h. ihr wird zum ersten Mal ein Wert zugewiesen. Bei einer primitiven Variable oder einem String würde man den Wert einfach hinschreiben: i = 5; oder s = "hallo" beispielsweise. Von einer Klasse erzeugt man eine Instanz (ein Objekt), und zwar mit dem Schlüsselwort new.
Klassenname variablenname = new Klassenname();
Mit new Angestellter()
wird ein neues Angestellten-Objekt (= eine Angestellten-Instanz) erzeugt. Diese wird in der Variablen mül gespeichert. Beziehungsweise wird genauer gesagt - wie wir schon bei den Strings gesehen haben - nur eine Referenz (Pointer, Zeiger) auf das Objekt in der Variablen gespeichert, also die Adresse des Objekts. Außer beim Vergleichen ist das bei Java aber egal. Man kann sich die Adresse nicht ausgeben lassen, nicht mit ihr rechnen, sie nicht erhöhen o.ä.
Mit Angestellter mül = new Angestellter();
und Angestellter waw = new Angestellter();
haben wir also zwei Angestellten-Objekte, zwei Instanzen der Klasse Angestellter erzeugt. mül hat die Variablen vorname, name, alter und gehalt, und waw hat sie auch. Wenn man sie bei dem einen Objekt initialisiert oder verändert, interessiert das das andere Objekt überhaupt nicht.
Wie man im Beispiel sieht, greift man auf eine Variable, also ein Attribut (quasi "Eigenschaft") eines Objekts, über den Punktoperator zu:
variablennameDesObjekts.variablenNameDesAttributs
Zum Beispiel
mül.alter = 45;
waw.gehalt += 50;
Es würde natürlich überhaupt keinen Sinn machen, einfach nur alter = 45 oder gehalt += 50 hinzuschreiben, da nicht klar wäre, wessen Alter bzw. Gehalt gemeint wäre.
Beim Entwickeln eines Softwareprojekts kommt es wesentlich darauf an, sich zu entscheiden, welche Klassen/Objekte es geben sollte, welche Attribute und Methoden sie haben müssen und wie die Klassen und Objekte miteinander im Zusammenhang stehen. Für konkrete Klassen wie "Angestellter" ist das relativ klar ersichtlich, aber viele Klassen drücken viel abstraktere Sachen aus, etwa eine Verbindung zwischen einem Client und einem Server.
Leg noch einen Angestellten an.
Schreib eine Klasse Hund oder Tier und eine Klasse TierarztVerwaltung, in der einige Hunde oder andere Tiere angelegt werden. Lasse Methoden wie impfen vorerst weg, überleg dir nur ein paar Attribute.
In der nächsten Lektion geht es um (statische) Methoden, dann kommen Arrays und noch mehr über Strings, und dann geht es mit der Objektorientierung weiter.