Methode wird ohne Aufruf ausgeführt!?

Mik3e

Erfahrenes Mitglied
Hallo zusammen!

Bin gerade am Weg von prozeduralen Programmiersprachen hin zu OOP. Wühle mich nun schon seit zwei Tagen durch Handbücher und Tutorials. Bislang gibts kaum Probleme (außer die Verwirrung mit den tausenden Begrifflichkeiten).

Habe nun ein einfaches GUI mit AWT gebastelt. Klasse "Grafikbeispiel" wird von der Java AWT Klasse "Frame" vererbt.

Im Programm wird dann ein neues Objekt vom Typ "Grafikbeispiel" erstellt, dass auch event-Handler Methoden beinhaltet.

Dann gibt es noch eine Methode "Paint" die ein paar Striche in das Fenster zeichnet.
Meine Frage:
Wann und Warum wird diese Methode (paint) automatisch beim Start ausgeführt?
(Die Striche werden gezeichnet). Ist dies nur eine überlagerte Methode aus der Frame Klasse?

Hier der funktionierende Quellcode:
Code:
package kfzverwaltung;

import java.awt.*;
import java.awt.event.*;

public class GrafikBeispiel
extends Frame
{
  public static void main(String[] args)
  {
    GrafikBeispiel wnd = new GrafikBeispiel();
  }

  public GrafikBeispiel()
  {
    super("GrafikBeispiel");
    addWindowListener(new WindowClosingAdapter(true));
    setBackground(Color.white);
    setSize(300,200);
    setVisible(true);
    setResizable(false);
  }

  public void paint(Graphics g)
  {
    int i;
    int x = 80;

    for (i=0; i<60; ++i) {
      g.drawLine(x,40,x,100);
      x += 1+3*Math.random();
    }
  }
}

Danke für eine kurze Aufklärung und LG,
Mike
 
Das ist in einer der Super-Klassen hineinprogrammiert.

Deine Frage zeigt mir, daß Du am Anfang bist und noch Grundlagen lernen solltest.
Die allgemeinen Beispiele sind schon der richtige Weg. Mit AWT bzw. Swing solltest Du allerdings erst beginnen, wenn alle HalloWelt-Programme problemlos laufen. :)
 
Danke.. habe schon vermutet, dass es sich um eine überlagerte Methode handelt (wie oben geschrieben). Es ist nicht wirklich easy, von einer Pozeduralen auf eine OOP Sprache zu wechseln.

Sehe ich das richtig, dass das nun bedeutet, dass es sich bei "paint()" um eine Methode in einer Superklasse handelt (in der Klasse "Frames"), die im Konstruktor der Superklasse eingebunden ist?

Das würde mir nach dem Ablaufregeln bei vererbten Klassen (zuerst wird der Konstruktor der Superklasse, dann die überlagerten der vererbten Klassen ausgeführt) einleuchten.

Oder sehe ich das Konstrukt komplett von der falschen Seite (bin ich sozusagen auf dem Holzweg)?

Danke jedenfalls & LG
Mike

// EDIT:
Denke ich habe die Antwort schon gefunde, die mein Verständnis zumindest teilweise bestätigt:
"Die Ausgabe in ein Fenster erfolgt durch Überlagern der Methode paint, die immer dann aufgerufen wird, wenn das Fenster ganz oder teilweise neu gezeichnet werden muß. Dies ist beispielsweise dann der Fall, wenn das Fenster zum ersten Mal angezeigt wird oder durch Benutzeraktionen ein Teil des Fensters sichtbar wird, der bisher verdeckt war. paint bekommt beim Aufruf eine Instanz der Klasse Graphics übergeben:"
 
Beim Instanziieren einer Klasse wird stets zuerst der entsprechende Konstuktor dieser Klasse aufgerufen, dann der Konstruktor der Superklasse (wenn mit super(...) angegeben, sonst: der parameterlose Konstruktor), danach der Konstruktor der Super-Superklasse (wenn mit super(...) angegeben, sonst: der parameterlose Konstruktor), usw., bis wir bei Object angelangt sind. Danach werden die weiteren Zeilen innerhalb der Konstruktoren (beginnend bei der Super-Super-...Superklasse) ausgeführt.

Nicht in Frame, sondern warscheinlich bereits in Component wird diese paint(...)-Methode aufgerufen. Bei näherem Interesse kannst Du natürlich auch mal die Source-Codes von Java begutachten. Die sind schließlich auch downloadbar.

Beim näheren Hinsehen wirst Du feststellen, daß sich bei OOP eigentlich kein Unterschied zu Ablaufprogrammierungen feststellen läßt. Alles wird nach wie vor hintereinander weg ausgeführt. Zur besseren "Übersicht" werden nur dem menschlichen Empfinden nach Klassen kreiert, die "unwichtigen" Code für Sub-Klassen verstecken können und den Aufbau übersichtlicher machen sollen. :)

Leider leidet der Grundgedanke OOP oft an allzu eifrigen "Überdesignern", die Aufgaben von knapp 3 Klassen gern in Packages von 100 Klassen und Interfaces unnötig aufplähen.
Im Internet finden sich genügend dieser "sinnvollen" Packages, die vor lauter fehlender Doku nicht mehr einsetzbar sind... :(
 
Ja, diese "Überladung" gibts aber auch bei prozeduralen Sprachen (ich erinnere mich an einen PHP Quellcode, in dem der Entwickler die Standard-Schleifen (For- While etc.) extra nochmals in eine Klasse und Funktion gepackt und im Prinzip nur umbenannt hat... :-)

Ich versuche meinen Horizont derzeit mit einer Uni-Doku und javabuch.de zu erweitern. Dabei bin ich bei den Konstruktoren auf diese Beschreibung gestoßen:

"Beim Instanzieren eines neuen Objekts werden die Initialisierungschritte in einer genau festgelegten Reihenfolge ausgeführt:

- Zunächst werden die Superklassenkonstruktoren aufgerufen, so wie es im vorigen Abschnitt beschrieben wurde.
- Anschließend werden alle Membervariablen in der textuellen Reihenfolge ihrer Deklaration initialisiert.
- Schließlich wird der Programmcode im Rumpf des Konstruktors ausgeführt. "


Wenn ich nun von folgendem Pseudo-Konstrukt ausgehe:

Code:
Klasse A
-> Konstruktor A()

Klasse B
extends A
-> Konstruktor B()
methode B_Object()
methode main -> new B Object

Würde ich den Ablauf laut Doku so interpretieren, dass beim Instanzieren der Klasse B (objekterzeugung) zuerst der Konstruktor A() der Vaterklasse und dann der Konstruktor B() ausgeführt wird.

Laut Deiner Beschreibung (wenn ich es richtig verstanden habe), wäre es aber genau umgekehrt...

Interpretiere ich jetzt die Doku irgendwie falsch

Danke für Deine Hilfe & LG
Mike
 
Jein!
Aufgerufen wird zuerst der Konstruktor der Subklasse. Ausgeführt wird jedoch als erstes der Konstruktor der Superklasse, da dieser (entweder explizit mit super oder implizit der Standardkonstruktor) am Anfang des Konstruktors der Subklasse aufgerufen wird.
 
Zurück