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.
Hi kann mir jemand sagen wieso in diesem Code eine Klassen in der Mainmethode erstellt werden kann und ob dies mit jeder Klasse geht oder nur mit einem Interface
Java:
import java.awt.event.*;
import javax.swing.*;
public class JButtonDemo
{
public static void main( String args[] )
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
JButton b = new JButton( "Ende" );
frame.getContentPane().add( b );
ActionListener al = new ActionListener() {
public void actionPerformed( ActionEvent e ) {
System.exit( 0 );
}
};
b.addActionListener( al );
frame.pack();
frame.setVisible( true );
}
}
was du da beschreibst ist eine annoynme Klasse. Bei kompilieren wird dafür dann eine Proxy-Klasse erstellt. Bei der Ausführung werden dann die Methoden aus Objekten der Proxy-Klasse aufgerufen. Ein Interface dient zur deklaration von Methoden, es enthält keine Implementierungen. Von Interfaces und abstrakten Klassen kann keine Instanz erstellt werden.
Java:
ActionListener al = new ActionListener() {
public void actionPerformed( ActionEvent e ) {
System.exit( 0 );
}
};
Der Code ausschnitt macht jedoch den Anschein als könne man eine Instanz davon erstellen. Tatsächlich passiert beim Kompilieren aber das oben beschriebene. Es wird eine anonyme Proxy-Klasse erstellt und davon bei der Auführung ein Objekt erstellt. Da das Interface die Methode actionPerformed deklariert aber keine Implementierung existiert muss die Methode über oben gezeigten weg zunächst implementiert werden. Ein anderer Weg wäre das schreiben einer eigenen nicht-anonymen Klasse die das Interface implementiert.
Prinzipiell funtkioniert das überschreiben von Methoden in anonymen Klassen immer, solange die sie nicht final ist.
Grundsätzlich stimmt die Erklärung von Tente - ich würde in dem Zusammenhang aber das Wort "Proxy" eher vermeiden, denn das ist etwas anderes: Proxy-Klassen werden zur Laufzeit erstellt.
Eine anonyme Klasse ist aber eine ganz normale Klasse, die vom Compiler in eine class-Datei gepackt wird. Sie kann allerdings (logischerweise, da sie keinen Namen hat) nur an der einen Stelle im Code instanziert werden und kann keinen Konstruktor haben.
Und zur Sicherheit nochmal: Anonyme Unterklassen kann man von beliebigen nicht-finalen Klassen und Interfaces bilden. Allerdings kann sie nur von irgendeiner Klasse erben oder *genau* ein Interface implementieren.