Javaschubla.de - Java als erste Programmiersprache

OO03 Nicht-statische Methoden

(Voraussetzung: statische Methoden und Objektorientierung 2)

In OO02 hatten wir

kennen gelernt. Das war unsere Angestellten-Klasse:

class Angestellter
{
  String vorname;
  String nachname;
  int alter;
  int gehalt;
}

Und diese Klasse verwendet die Klasse Angestellter:

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);
  }
}

Jetzt wollen wir zur Klasse eine Methode zum Erhöhen des Gehalts hinzufügen. Sie ist void, denn sie gibt nichts zurück, sondern verändert das Attribut gehalt. Sie erwartet einen Parameter vom Typ int - um so viel soll das Gehalt erhöht werden.

class Angestellter
{
  String vorname;
  String nachname;
  int alter;
  int gehalt;

  void erhöheGehalt(int erhöhung)
  {
    gehalt += erhöhung;
  }
}

Und so wird es verwendet:

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.erhöheGehalt(50); // geänderte Zeile
    System.out.println("Das neue Gehalt von Herrn Wawrzyniak: " + waw.gehalt);
  }
}

Nochmal zum Unterschied zwischen statischen und nicht-statischen Methoden:

Auf statische Methoden greift man über den Klassennamen zu:

    Klassenname.methodenname(parameter);

Beispiele:

    double wurzel2 = Math.sqrt(2);
    int zinsen = MatheHelfer.zins(1500, 3.5);

Auf nicht-statische Methoden greift man über ein Objekt vom Typ "Klasse" (also eine Instanz der Klasse) zu.

    variablenname.methodenname(parameter);

Nicht-statische Methoden verändern Attribute des Objekts oder geben Auskunft über sie oder berechnen etwas aus ihnen.

Beispiel:

    String s = "abc";
    char first = s.charAt(0);

Oder eben

    waw.erhöheGehalt(50);

Was ist der Vorteil von erhöheGehalt(50) gegenüber gehalt+=50? Man kann z.B. verhindern, dass nicht um 0 oder einen negativen Betrag "erhöht" wird.

  void erhöheGehalt(int erhöhung)
  {
    if (erhöhung > 0)
    {
      gehalt += erhöhung;
    }
  }

Diese Variante tut einfach nichts, wenn die erhöhung nicht positiv ist. Besser ist es, eine Fehlermeldung auszugeben.

  void erhöheGehalt(int erhöhung)
  {
    if (erhöhung <= 0)
    {
      System.err.println("Das ist aber keine Erhöhung!");
    }
    else
    {
      gehalt += erhöhung;
    }
  }

In einer richtigen Anwendung würde man statt die Fehlermeldung direkt auszugeben eine Exception werfen. Exceptions kommen später.

Was nützt es, in erhöheGehalt zu verhindern, dass das Gehalt abgesenkt wird, wenn der Benutzer der Klasse dennoch einfach gehalt -= zahl schreiben kann oder auch gehalt += negativeZahl? Bald werden wir eine Möglichkeit kennen lernen, den direkten Zugriff auf ein Attribut zu verhindern (aber vorher kommen Konstruktoren dran).

Es geht eher darum, zu verhindern, dass der Benutzer der Klasse das Gehalt versehentlich absenkt, als dass er es absichtlich tut. Das könnte leicht passieren, wenn nicht um einen festen Betrag erhöht wird, wie waw.erhöheGehalt(50), sondern der Betrag erst berechnet wird, etwa aus Alter, bisherigem Gehalt und Betriebszugehörigkeit (für letztere gibt es noch kein Attribut in der Klasse). Der Benutzer (also der Programmierer von AngestelltenVerwaltung) könnte vergessen zu überprüfen, ob das Ergebnis positiv ist, oder er ist sich sicher, dass seine Formel korrekt ist und liegt da falsch. Durch die Ausgabe der Fehlermeldung in der Klasse Angestellter wird der Fehler auffallen, wenn die Anwendung AngestelltenVerwaltung mit ein paar verschiedenen Werten getestet wird.


Übung

Schreibe eine Methode geburtstagFeiern, die das Alter um ein Jahr erhöht. Füg irgendeine Nebenwirkung zur Methode hinzu, z.B. "Happy Birthday " + den ganzen Namen ausgeben oder das Gehalt automatisch um 10 Euro erhöhen. Ruf die Methode für Frau Müller auf.

In einer realen Anwendung könnte z.B. dem Angestellten automatisch eine Geburtstagskarte geschickt werden.

So ist der Begriff "Klasse" definiert: Es ist eine komplexe (d.h. zusammengesetzte) Datenstruktur, die außerdem Methoden (Funktionen) bereit stellt, die auf diesen Daten operieren.


Die nächste Lektion ist Objektorientierung 4: Konstruktoren.