/***************************************************************/
/* Prof. Dr. Carsten Vogt                                      */
/* FH Koeln, Fak. 07 / Nachrichtentechnik                      */
/* http://www.nt.fh-koeln.de/vogt                              */
/*                                                             */
/* Das Programm zeigt am Beispiel von Bankkonten die Benutzung */
/* des Klassenkonzepts, insbesondere                           */
/* - Definition von Klassen mit klassen- und objektbezogenen   */
/*   Attributen / Methoden sowie oeffentlichen und privaten    */
/*   Attributen,                                               */
/* - Erzeugung und Loeschung von Objekten                      */
/*   (siehe hierzu Datei KontoTestGraf.java) und               */
/* - Vererbung mit Nutzung und Ueberschreiben von Methoden der */
/*   Superklasse                                               */
/*   (siehe hierzu Datei GeschuetztesKonto.java).              */
/* Eine fensterorientierte Testumgebung befindet sich in der   */
/* Datei KontoTestGraf.java.                                   */
/***************************************************************/

/****************************************************************

   Die Klasse 'Konto' ist die Basisklasse fuer Konten.
   Sie enthaelt als Attribute
   - die Anzahl existierender Konten (klassenbezogen) und
   - den Kontostand (objektbezogen).
   Sie ermöglicht mit ihren Methoden
   - das Erzeugen eines Kontos mit Ersteinzahlung,
   - die Abfrage der Anzahl der existierenden Konten,
   - die Abfrage des Kontostands,
   - das Einzahlen und
   - das Abheben (sofern ausreichend Deckung vorhanden).
   
*****************************************************************/

class Konto {

 /* 'anzahlKonten' (klassenbezogenes Attribut)
    gibt die Anzahl existierender Konten an */

 static private int anzahlKonten = 0;

 /* 'stand' gibt den aktuellen Kontostand an */

 private double stand;

 /* Konstruktor 'Konto()': setzt Anfangsstand auf
    'initBetrag' und erhoeht 'anzahlKonten' um 1 */

 Konto(double stand) {
  this.stand = stand;
  anzahlKonten++;
 } 

 /* Destruktor 'finalize()': senkt 'anzahlKonten' um 1 */

 protected void finalize() throws Throwable {
  anzahlKonten--;
  System.out.println("Konto geloescht");
 } 

 /* 'getAnzahlkonten()' liefert Anzahl der Konten (klassenbezogene Methode) */

 static public int getAnzahlKonten() {
  return anzahlKonten;
 }

 /* 'abfragen()' liefert aktuellen Kontostand */

 public double abfragen() {
  return stand;
 }

 /* 'einzahlen()' erhoeht Kontostand um Einzahlungsbetrag 'betrag' */

 public void einzahlen(double betrag) {
  stand += betrag;
 }

 /* 'abheben()' senkt Kontostand um Abhebebetrag 'betrag', wenn Kontostand
    dafuer ausreicht.
    liefert ausgezahlten Betrag oder -1, wenn Abheben nicht erfolgreich. */

 public double abheben(double betrag) {
  if (betrag<=stand)
   { stand -= betrag;
     return betrag; }
  else return -1;  
 }

}

