Java
Von: Maze, 26.11.2000 18:07 Uhr
Hi,
wie es so bei Anfängern ist fehlt es noch hier und da (bei mir wohl etwas mehr) und leider liegen erstmal alle Nerven blank und darum hier mein nicht funktionierndes Problem (aus Übungszwecken enstanden):

class Ueberschreiben {
public string a = "Orignial";
System.out.println (A);
}
class Ueberschrieben extends Ueberschreiben {
public string a = "Ueberschrieben";
System.out.println (A);
Super();
}

Hope for improvements
<Maze>



  1. Antwort von Andreas Benk (abgemeldet) 1
    Re: Grundlagen - Prob. mit überschreiben
    Hi Maze!

    Wenn der angegebene Code wirklich das ist, was du übersetzen willst, dann hast du ne Menge Fehler in die paar Zeilen gepackt ;o) Also erstmal die Fehler: class Ueberschreiben {
    public string a = "Orignial";
    Die Klasse heißt String - beachte das große S System.out.println (A);
    Du rufst hier eine Methode eines anderen Objektes (System.out) auf. Das macht nur Sinn, wenn du eine Instanzvariable initialisieren willst oder innerhalb von anderen Methoden. Da du hier den Inhalt vom String ausgeben willst, gehört diese Ausgabe sicherlich in den Konstruktor (siehe unten). Das A muss klein geschrieben sein, da Java Case sensitiv ist!! }
    class Ueberschrieben extends Ueberschreiben {
    Hätte fast den Unterschied übersehen ie - ei. Nur zum Verständnis: Die Klasse wird nicht überschrieben, sondern vererbt. Lediglich Methoden der übergeordneten Klasse können überschrieben werden. public string a = "Ueberschrieben";
    Und genau das ist hier falsch. Die Variable a existiert in der Superklasse schon und kann hier nicht nochmal definiert werden.
    Wenn die abgeleitete Klasse einen anderen Inhalt haben möchte, dann kann dieser im Konstruktor verändert werden. (siehe unten) System.out.println (A);
    Super();
    Auch hier wieder die gleichen Probleme wie oben. Bei Super() handelt es sich um den Aufruf des Konstruktors der Superklasse. Dieser MUSS immer als erstes erfolgen. - super(), s klein }
    Was ich ganz vermisse ist eine main-Methode.

    UNTEN:
    class Ueberschreiben {
    public String a = "Orignial";
    Ueberschreiben() {
    System.out.println(a);
    }
    }
    class Ueberschrieben extends Ueberschreiben {
    Ueberschrieben() {
    super();
    a="Uberschrieben";
    System.out.println (a);
    }
    }
    public class Test() {
    public static void main(tring[] args) {
    Ueberschrieben a=new Ueberschrieben();
    Ueberschreiben b=new Ueberschrieben();
    Ueberschreiben c=new Ueberschreiben();
    }
    }

    Das super() kann man sich auch sparen, da der Kompiler auf jeden Fall ein super() am Anfang des Konstruktors einbaut. Der Grund ist der, daß das initialisieren eine strikte Reihenfolge haben muss!!! Von der obersten Klasse nach unten. Damit soll sichergestellt werden, daß die abgeleitete Klasse die geerbten Instanzvariablen komplett initialisiert vorfindet.
    Warum gibt es dann das super()??? Da der Kompiler das super() selbst einfügt, könnte man hierauf tatsächlich verzichten, aber es gibt ja auch noch Konstruktoren mit Parametern. Wenn eine abgeleitete Klasse eben nicht den default-Konstruktor der Superklasse aufrufen möchte, dann braucht man das super(..). Auf dein Beispiel angewendet:

    class Ueberschreiben {
    public String a = null;
    Ueberschreiben() {
    Ueberschreiben( "Orignial" );
    }
    Ueberschreiben(String s) {
    a=s;
    System.out.println(a);
    }
    }
    class Ueberschrieben extends Ueberschreiben {
    Ueberschrieben() {
    super("Uberschrieben");
    System.out.println (a);
    }
    }
    ....
    Rest siehe oben.



    So, bevor es ein komplettes Java-Tutorial wird hör ich lieber auf ;o)

    Gruß
    Benky
    1 Kommentare
    • von Maze 0
      Tnx!
      Vielen Dank!
      jetzt kommts langsam ;-)
      hab nur noch kleine Feinheiten ausgebessert und nun funktioniert es wie erhofft. Um meine Beginnerehre etwas aufzupepppeln hier Feinheiten Listing:
      - hab Ueberschreiben.java in Test.java umbenannt
      - hab main(tring[] in main(String[] verbessert
      - hab nach schwerer Anschuldigung durch compiler die ()
      hinter 'public class Test()' entfernt und alles war gut *sogarverstandenhab*

      thanks again
      so long
      <Maze> class Ueberschreiben {
      public String a = "Orignial";
      Ueberschreiben() {
      System.out.println(a);
      }
      }
      class Ueberschrieben extends Ueberschreiben {
      Ueberschrieben() {
      super();
      a="Uberschrieben";
      System.out.println (a);
      }
      }
      public class Test() {
      public static void main(tring[] args) {
      Ueberschrieben a=new Ueberschrieben();
      Ueberschreiben b=new Ueberschrieben();
      Ueberschreiben c=new Ueberschreiben();
      }
      }

      Das super() kann man sich auch sparen, da der Kompiler auf
      jeden Fall ein super() am Anfang des Konstruktors einbaut. Der
      Grund ist der, daß das initialisieren eine strikte Reihenfolge
      haben muss!!! Von der obersten Klasse nach unten. Damit soll
      sichergestellt werden, daß die abgeleitete Klasse die geerbten
      Instanzvariablen komplett initialisiert vorfindet.
      Warum gibt es dann das super()??? Da der Kompiler das super()
      selbst einfügt, könnte man hierauf tatsächlich verzichten,
      aber es gibt ja auch noch Konstruktoren mit Parametern. Wenn
      eine abgeleitete Klasse eben nicht den default-Konstruktor der
      Superklasse aufrufen möchte, dann braucht man das super(..).
      Auf dein Beispiel angewendet:

      class Ueberschreiben {
      public String a = null;
      Ueberschreiben() {
      Ueberschreiben( "Orignial" );
      }
      Ueberschreiben(String s) {
      a=s;
      System.out.println(a);
      }
      }
      class Ueberschrieben extends Ueberschreiben {
      Ueberschrieben() {
      super("Uberschrieben");
      System.out.println (a);
      }
      }
      ....
      Rest siehe oben.



      So, bevor es ein komplettes Java-Tutorial wird hör ich lieber
      auf ;o)

      Gruß
      Benky
  2. Antwort von Dirk Schnelle (abgemeldet) 0
    Re: Grundlagen - Prob. mit überschreiben
    Servus Maze,

    worin äußerst sich denn dein nicht Funktionieren des Beispiels.

    Wie ich es verstehe, möchtest du, dass bei Aufruf von Ueberschriebe erst Ueberschreiben und dann Original ausgegeben wird.

    Ist dein oben angegebener Coder der vollständige. mit dem du es versucht hast?

    Deswegen die Frage, weil mir unklar ist, ob die Ausgabe in der main-Routine oder im Konstruktor erfolgen soll. Beides fehlt hier.

    Nebenbei kann der Aufruf von Super nur im Konstruktor erfolgen. Dann muss es aber auch die erste Anweisung sein.

    Dirk [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]