Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich habe eine kleine Verständnisschwierigkeit bezüglich der Methode paint von Applets. Diese wird ja zum Beispiel von einem Webbrowser aufgerufen. Allerdings ist diese Methode ja nicht static, wenn ich mich nicht täusche. Das heisst meiner Meinung nach, dass ein Objekt der Klasse erstellt werden müsste, damit diese Methode überhaupt aufgerufen werden könnte.
Erstellt der Webbrowser in dem Fall selber ein solches Objekt? oder ist die Methode doch static, man sieht es nur nicht? Oder geht das aus irgendeinem anderen grund?
Es funktioniert alles bei mir, aber die Theorie dahinter ist mir wichtig.
Hier ein Beispiel:
Code:
import java.applet.Applet;
import java.awt.*;
import java.io.*;
public class Irgendeinapplet extends Applet
{
public void paint(Graphics gr)
{
//Irgendwelche Methoden von gr
}
}
Wird irgendwann ein "Irgendeinapplet"-Objekt erstellt?
Die JVM, die vom Browser gestartet wird, erzeugt ein Objekt deines Applets und ruft darin mit dem Grafikkontext des Browsers die paint-Methode auf.
Das merkst du z.B. daran, dass du einem Applet auch einen Konstruktor verpassen kannst, der als erstes abgehandelt wird (noch vor der init()-Methode).
Erstellt der Webbrowser in dem Fall selber ein solches Objekt? oder ist die Methode doch static, man sieht es nur nicht? Oder geht das aus irgendeinem anderen grund?
Es funktioniert alles bei mir, aber die Theorie dahinter ist mir wichtig.
Dein Applet, das von java.applet.Applet erbt, erbt alle Methoden, auch die "Callback-Methoden" start(), stop(), und paint( Graphics g ). Die Paint-Methode stammt von java.awt.Container, das Applet hat sie auch nur geerbt. Diese Callback-Methoden werden von einem Anwenderprogramm normalerweise nie aufgerufen, sondern sie sind dazu gedacht, dass man sie "überschreibt". Das Überschreiben einer Methode bedeutet, dass man eine Methode, die geerbt worden ist, mit der gleichen Signatur (Kopfzeile) in der Subklasse noch einmal definiert. Dadurch kann man das geerbte Verhalten modifizieren.
Callback-Methoden werden von anderen Objekten aufgerufen, d.h. es gibt bereits einen Aufrufer, der die Methode aufruft. Das tut er "wenn er es will". Speziell beim Applet ist es letztendlich der Browser, der die paint(...)-Aufrufe auslöst. Er "weiß" selbst, wann das notwendig ist, z.B. wenn das Browserfenster minimiert und dann wiederhergestellt wird. Der Browser erzeugt auch ein Objekt von Deiner Klasse, weil er in der HTML-Datei ein APPLET-Tag findet. In diesem Applet-Tag steht im Attribut CODE der Klassenname Deiner abgeleiteten Applet-Klasse. Aus der Sicht des Browsers handelt es sich aber um die Klasse java.applet.Applet, er "weiß" also gar nicht, dass Du das Verhalten der Standard-Applet Klasse - in paint(..) - modifiziert hast.
Dein Applet selbst verhält sich nun beim Zeichnen anders als das Standard-Applet, das einfach einen grauen Hintergrund zeigt und sonst nichts.
Die hauptsächliche Arbeit beim Programmieren mit Java ist also nicht das Aufrufen von Methoden, sondern das Definieren neuer, bzw. Überschreiben geerbter Methoden. Dadurch kannst Du zwar von der Elternklasse sehr viel "Implementierung = Verhalten" erben, aber an den entscheidenden Stellen Deine Modifikationen anbringen. Die geerbte Methode kann man selbst auch wieder aufrufen, und damit das geerbte Verhalten nutzen. Das geht mit dem Schlüsselwort super.
Konkret in paint könnte das z.B. so aussehen:
Code:
public void paint( java.awt.Graphics graphics ) {
super.paint( graphics ); // rufe erst die geerbte Methode auf
graphics.fillOval( 150, 100, 50, 50 ); // zeichnet einen Kreis mit Durchmesser 50 pixel
}
Das Graphics-Objekt bekommst Du vom Aufrufer (Browser). Um die Erzeugung musst Du Dich nicht sorgen. Du kannst es einfach nutzen und seine Methoden aufrufen. Der Aufruf von super.paint(...) ist allerdings sinnlos, weil
die Methode in java.applet.Applet nichts macht (deshalb auch der graue Hintergrund). Sie sieht dort so aus:
Code:
public void paint( Graphics g ) {
}
Das genau ist der Sinn der Callback-Methoden. Sie existieren nur dazu, dass man sie in einer Subklasse überschreibt. Allerdings existiert bereits irgendwo ein Aufrufer, der eine solche paint-Methode aufruft, ohne zu wissen, dass das Verhalten modifiziert wird. Dieses Prinzip heisst Polymorphismus (Vielgestaltigkeit), d.h. verschiedene Klassen, die in einer Vererbungshierarchie zueinander stehen, haben die selbe Methode (mit den gleichen Parametertypen und dem gleichen Namen), die aber unterschiedliches Verhalten implementieren. Der Aufrufer hat eine abstrakte Sicht auf diese verschiedenen Objekttypen und "weiss" vorher nicht, wie sich das konkrete Objekt verhalten wird. Beispiel: Die abstrakte Superklasse Fahrzeug hat bereits Methoden zum Lenken. Diese Methoden dürfen dort auch abstrakt sein, d.h. es ist nur bekannt, dass es so eine Methode gibt und welche Parameter sie erwartet und welchen Ergebnistyp sie liefert, aber nicht WIE sie intern funktioniert. Erst die Subklassen Fahrrad, PKW, Wassertreter usw. haben vielleicht eine Implementierung. Vielleicht wird aber erst in weiteren Ableitungen (Golf III, Opel Astra usw.) die konkrete Implementierung stehen.
Damit ist leider das Schreiben eines Applets, was man Programmieranfängern gern zuerst beibringen will, weil es bunt und spektakulär ist, schon ganz weit im Bereich von Objektorientierung, Vererbung und Polymorphie. Das ist das Anfänger-Problem in Java. Entweder es ist langweilig, oder man versteht es noch gar nicht. Da muss jeder durch.