q1:java-oop3

Die Vererbung ist ein zentrales Konzept der OOP und wesentlich für den Erfolg objektorientierter Sprachen. Eine Klasse kann von einer anderen Klasse alle Attribute und Methoden erben. Dazu können in dieser Subklasse neue Attribute und Methoden definiert werden, bzw. geerbte Methoden abgeändert werden. Die Klasse, von der etwas geerbt wird, wird als Basis- oder Superklasse bezeichnet. Damit lassen sich ganze Klassenhierarchien aufbauen.

Jede Java-Klasse kann nur eine Superklasse haben, aber beliebig viele Subklassen. Stammvater aller Java-Klassen ist die Klasse „Object“.

In Java wird schon eine umfangreiche Klassenhierarchie zur Verfügung gestellt. Verwandte Klassen werden oft in so genannten Paketen (packages) zur Verfügung gestellt. Standardmäßig existiert ein Zugriff auf ein Paket namens java.lang. Alle anderen Pakete müssen im Quelltext explizit mit den Befehlen import <Vollständiger Klassenname> oder import <Paketname.*> importiert werden.

Ein Beispiel dazu findet sich in sämtlichen Programmen mit grafischer Oberfläche:

import java.awt.*;
import java.awt.event.*;
 
public class Hauptprogramm extends Frame ...

Die Pakete java.awt und java.awt.event werden hier standardmäßig importiert, denn sie er-halten z.B. Klassen, um Benutzerschnittstellen oder grafische Ausgabe verwenden zu können. Die neu geschaffene Klasse Hauptprogramm ist damit eine Subklasse der schon in Java vordefinierten Superklasse Frame, die wiederum in eine übergeordnete Klassenstruktur eingebettet ist:

Als Beispiel für Vererbung soll nun die Klasse Sparkonto als Subklasse unserer Klasse Konto aus Kapitel 12 definiert werden. Ein Sparkonto ist ein besonderes Konto, denn es hat keinen Überziehungskredit, liefert aber eine Verzinsung. Das realisieren wir durch eine zusätzliche Methode verzinsen(…) in der Subklasse. Der Konstruktor der neuen Klasse erhält als Parameter den Zinssatz für das Konto und ruft seinerseits den Konstruktor der Superklasse mit dem Parameter 0 für den Überziehungskredit auf. Da man einen Konstruktor selbst aber nicht explizit aufrufen kann (nur indirekt im Zusammenhang mit new), kennt JAVA das Schlüsselwort super, das den Konstruktor der Superklasse aufruft, gefolgt von den Parametern dieses Konstruktors. Der Aufruf von super muss der erste Befehl im Konstruktor der Subklasse sein:

public class Sparkonto extends GiroKontoN
{
  double Zinssatz;
 
  Sparkonto(double zs)
  {
    super(0);
    Zinssatz = zs;
  }
 
  void verzinsen()
  {
    GeldEinzahlen(KontostandAnzeigen()*Zinssatz/100) ;
  }
}

Und nun noch ein einfaches Hauptprogramm zur neuen Subklasse:

// Anfang Ereignisprozeduren
public void btnStartActionPerformed(ActionEvent evt)
{
    Sparkonto AsterixSparKonto = new Sparkonto(3.5);
    AsterixSparKonto.GeldEinzahlen(5000);
    AsterixSparKonto.verzinsen();
 
    System.out.println("Asterix");
    System.out.println("Kontonummer: " +
                    String.valueOf(AsterixSparKonto.KontoNrAnzeigen()));
    System.out.println("Kontostand: " +
                    String.valueOf(AsterixSparKonto.KontostandAnzeigen()));
}
// Ende Ereignisprozeduren

Zum Abschluss dieses Kapitels sollen unsere bisherigen Programme nochmals unter dem Aspekt des objekt¬orientierten Ansatzes betrachtet werden. Wenn wir ein Programm mit grafischer Oberfläche erstellt haben, haben wir eigentlich eine neue Klasse als Subklasse der Klasse Frame definiert, die am Ende die Methode main enthielt:

public static void main(String[] args) 
{
    new Hauptprogramm("Hauptprogramm");
}

Der main-Methode wird ein String-Feld mit Namen args übergeben. Das dient dazu, um beim Start des Programms Parameter übergeben zu können (von uns bisher nicht verwendet). Außerdem muss main public sein, damit man von außen darauf zugreifen kann. void bedeutet wie bisher, dass die Methode nichts zurückgibt (an wen auch).

Das dritte Schlüsselwort static haben wir im Zusammenhang mit Klassenvariablen kennen gelernt. Bei Methoden bezeichnet es so genannte Klassenmethoden, die für alle Objekte der Klasse verfügbar sind und anderen Klassen zur Verfügung gestellt werden können. Im Gegensatz zur Unterscheidung Klassenvariable-Objektvariable ist der Unterschied Klassenmethode-Objektmethode eher akademisch, aber ein wichtiger Punkt muss beachtet werden: Klassenmethoden können aufgerufen werden, ohne dass ein Objekt dieser Klasse definiert wurde! Deshalb können wir auch unsere Programme, die ja Klassen sind, verwenden, ohne ein Objekt zu erzeugen, da ja die Methode main eine Klassenmethode ist.

Wir haben auch die Klasse Math kennen gelernt. Ihre Methoden wie z.B. Math.sqrt() sind Klassen¬methoden, so dass wir sie verwenden können, ohne ein Objekt der Klasse Math schaffen zu müssen.

Aufgaben

Veranschauliche eine Klassenhierarchie für folgende Getränke-Klassen grafisch: Bier, Wein, Alkoholfreies Getränk, Limonade, Getränk, Sekt, Alkoholisches Getränk, Fruchtsaft, Cola. Die Programmierung ist nicht verlangt!

Die folgende Klassenhierarchie soll in Java erzeugt werden. Überlege Dir zwei sinnvolle Attribute und zwei Methoden für die Klasse Fahrzeug und implementiere sie mit Java. Teste die korrekte Funktionsweise z.B. mit einem Konsolen-Hauptprogramm. Erstelle dann durch Vererbung die Klassen Auto, Schiff und Familienauto. Füge jeweils wieder zwei neue sinnvolle Attribute und Methoden pro Klassen ein und teste die Klassen mit einem Hauptprogramm! Lösung

Recherchiere im Internet!

(a) Was ist das Besondere an der Klasse „Object“?

(b) Was versteht man unter dem „Überlagern“ von Methoden?

© Wie steht es mit der Vererbung von Konstruktoren?

Lösung

Setze die folgende Klassenhierarchie in Java um und teste dann mehrere Objekte dieser Klassen:

  • /var/www/infowiki/data/pages/q1/java-oop3.txt
  • Zuletzt geändert: 2017/07/11 10:45
  • von admin03