/**
Diese Klasse enthaelt einen statischen Initialisierer
sowie die Methode finalize().
Es duerfen nur MaxPunkte Punkte erzeugt werden (hier im Beispiel
sind das 4). Die Konstruktoren geben eine Meldung aus, wenn diese Zahl
ueberschritten wird; der Name ist dann null.
Die Testumgebung sollte dann den gerade erzeugten Punkt wieder loeschen.

*/
/*-----------------------------------------------------------------------*/
class Punkt
{  int x, y;
   String name;
   static int AnzahlPunkte, MaxPunkte;

   /**
   *  Hauptkonstruktor. Er ueberprueft auf MaxPunkte.
   *  Alle anderen Konstruktoren rufen diesen Konstruktor auf.
   */
   Punkt(int x, int y, String name)
   {
      if (AnzahlPunkte < MaxPunkte)
         AnzahlPunkte++;
      else
      {  System.out.println("Zu viele Punkte. Fehler bei Punkt " + name);
         return;
      }
      this.x = x;
      this.y = y;
      this.name = name;
   }

   Punkt()
   {  this(0, 0, "unbenannt");  }

   Punkt(String n)
   {  this(0, 0, n);  }

   Punkt(int a, int b)
   {  this(a, b, "unbenannt");  }
   
   double laenge()
   {  
      return Math.sqrt(x*x + y*y);
   }
   
   Punkt maximum(Punkt p)
   {
      if (laenge() > p.laenge())
         return this;
      else
         return p;
   }

   static
   {
      AnzahlPunkte = 0;
      MaxPunkte = 4;
   }

   /**
   *  Beender mit Testausdrucken, die anzeigen, wann er aufgerufen 
   *  wird.
   */
   public void finalize()
   {
      System.out.println("\t>>>Aufruf finalize():"+AnzahlPunkte);
      AnzahlPunkte--;
      System.out.println("---. neue AnzahlPunkte : "+AnzahlPunkte);
   }   
   
   static Punkt maximum(Punkt p1, Punkt p2)
   {
      if (p1.laenge() > p2.laenge())
         return p1;
      else
         return p2;
   }

   void zeige()
   {
      System.out.println(
         name + "(" + x + "," + y +"), Anzahl= " + AnzahlPunkte);
   }
   
   void zeige(String txt)
   {  
      System.out.print(txt + ": ");
      this.zeige();
   }
}
