/***************************************************************/ /* Prof. Dr. Carsten Vogt */ /* FH Koeln, Fak. 07 / Nachrichtentechnik */ /* http://www.nt.fh-koeln.de/vogt */ /* */ /* Das Programm illustriert das Ueberladen und Ueberschreiben */ /* von Methodennamen anhand von Ausschnitten der Oberklasse */ /* Konto und der Unterklasse GeschuetztesKonto. */ /***************************************************************/ import java.io.*; /* Oberklasse */ class Konto { /* Kontostand */ private double stand; /* Konstruktor konto() initialisiert den Kontostand */ Konto(double initBetrag) { stand = initBetrag; } /* abheben(double betrag) senkt den Kontostand um den Abhebebetrag betrag, wenn der Kontostand dafuer ausreicht. liefert den ausgezahlten Betrag oder -1, wenn Abheben nicht erfolgreich. */ public double abheben(double betrag) { if (betrag<=stand) { stand -= betrag; return betrag; } else return -1; } } /* Unterklasse */ class GeschuetztesKonto extends Konto { /* pin: Abheben ist nur bei Angabe der korrekten PIN moeglich */ private int pin; /* Konstruktor GeschuetztesKonto() initialisiert den Kontostand und die PIN. Zur Initialisierung des Kontostands wird durch super() der Konstruktor der Oberklasse aufgerufen. */ GeschuetztesKonto(double initBetrag, int anfangsPin) { super(initBetrag); pin = anfangsPin; } /* abheben(double betrag, int p) ueberLAEDT die Methode abheben(double betrag) der Oberklasse Konto: In einem zusaetzlichen Parameter p muss die PIN uebergeben werden. Sie wird geprueft, und bei korrekter Eingabe wird die abheben()-Methode der Oberklasse aufgerufen. */ public double abheben(double betrag, int p) { if (pin!=p) return -1; return super.abheben(betrag); } /* abheben(double betrag) ueberSCHREIBT die Methode abheben(double betrag) der Oberklasse Konto: Wird auf einem GeschuetztesKonto-Objekt abheben() ohne Angabe der PIN aufgerufen, so erfolgt eine Fehlermeldung. Ohne diese Ueberschreibung koennte auf einem geschuetzten Konto die Methode abheben(double betrag) der Oberklasse aufgerufen und somit die PIN-Pruefung umgangen werden. Das ist hier nicht moeglich, da die Methode der Unterklasse die Methode der Oberklasse verdeckt. */ public double abheben(double betrag) { System.out.println("Abheben nur mit PIN!"); return -1; } } public class Ueberlad { public static void main(String args[]) { double erg; Konto meinKonto; /* meinKonto kann sowohl Verweise auf Objekte der Klasse Konto als auch Verweise auf Objekte der Klasse GeschuetztesKonto aufnehmen. */ /* Aktionen auf einem Objekt der Oberklasse */ meinKonto = new Konto(200.0); System.out.println(); System.out.println("meinKonto = new Konto(200.0) ausgefuehrt."); System.out.println("dynamische Klasse von meinKonto jetzt: " + meinKonto.getClass()); System.out.println(); erg = meinKonto.abheben(100.0); /* Bei diesem Aufruf wird der Name abheben dynamisch an die Methode abheben(double betrag) der Oberklasse Konto gebunden, da hier meinKonto den dynamischen Typ Konto hat (d.h. auf ein Objekt der Klasse Konto verweist). */ if (erg>=0) System.out.println("meinKonto.abheben(100.0) erfolgreich."); else System.out.println("meinKonto.abheben(100.0) NICHT erfolgreich!!!"); System.out.println(); /* Aktionen auf einem Objekt der Unterklasse */ meinKonto = new GeschuetztesKonto(500.0,4711); System.out.println(); System.out.println("meinKonto = new GeschuetztesKonto(500.0) ausgefuehrt."); System.out.println("dynamische Klasse von meinKonto jetzt: " + meinKonto.getClass()); System.out.println(); erg = meinKonto.abheben(100.0); /* Bei diesem Aufruf wird der Name abheben dynamisch an die Methode abheben(double betrag) der Unterklasse GeschuetztesKonto gebunden, da hier meinKonto den dynamischen Typ GeschuetztesKonto hat (d.h. auf ein Objekt der Klasse GeschuetztesKonto verweist. */ if (erg>=0) System.out.println("meinKonto.abheben(100.0) erfolgreich."); else System.out.println("meinKonto.abheben(100.0) NICHT erfolgreich!!!"); System.out.println(); erg = ((GeschuetztesKonto)meinKonto).abheben(100.0,4711); /* Bei diesem Aufruf wird der Name abheben dynamisch an die Methode abheben(double betrag, int p) der Unterklasse GeschuetztesKonto gebunden. Die explizite Typumwandlung nach GeschuetztesKonto ist notwendig, da meinKonto den statischen Typ Konto hat, der keine solche abheben- Methode kennt. */ if (erg>=0) System.out.println("meinKonto.abheben(100.0,4711) erfolgreich."); else System.out.println("meinKonto.abheben(100.0,4711) NICHT erfolgreich!!!"); System.out.println(); } }