# Anonyme Klasse - Button ansprechen - Warum muss Button final sein?



## Jack159 (5. Jun 2012)

Hallo,

Ich versuche grad ein Programm zu schreiben, in dem meine GUI lediglich aus 1 Frame und 1 Button besteht. Beim klick auf den Button soll das Fenster geschlossen werden. (Es soll nur das Fenster geschlossen werden, nicht das Programm beendet werden, daher setvisible(false) ).

Das ganze versuche ich mit einer anonymen inneren Klasse zu lösen. Für das Beispiel hier vielleicht nicht unbedingt nötig, aber ich möchte es trozdem darüber machen, damit ich den Umgang mit den anonymen Klassen lerne.

Das ganze funktioniert auch, aber ich frage mich, warum er fordert, dass der Button b final sein soll, sobald ich in der actionPerformed() auf den Button mit b.tueirgendwas() zugreifen will?!



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

import javax.swing.*;

public class App {
	
	public static void main(String[] args) {
		
		final JFrame f = new JFrame();
		f.setSize(300, 300);
		f.setVisible(true);
		JButton b = new JButton("Button");
		f.add(b);	
		
		ActionListener a = new ActionListener(){
			public void actionPerformed(ActionEvent e)  {
				f.setVisible(false);
			}
		};
		b.addActionListener(a);
		
	}

}
```


----------



## jgh (5. Jun 2012)

Daran, dass du deinem Button auch noch den ActionListener adden musst.

[edit]also bei mir funzt dein prog[/edit]

[edit]weil du dich innerhalb einer Methode (main-Methode) befindest[/edit]


----------



## SlaterB (5. Jun 2012)

anonyme Klassen wollen eben nur mit finalen lokalen Variablen von außerhalb sprechen, so ist eben in Java, 
eine Regel und gut ist,

grundsätzlich kann man ja Java diese Sicherheit, dass das Objekt eindeutig ist, nicht mehr wechselt zugestehen,
wobei es auch klar ersichtlich ist, dass der Compiler genausogut ohne Fehler funktionieren könnten,

eine ganz klar funktionierende Variante ohne denkbare Probleme wäre z.B., wenn der Compiler für derart verwendete Variablen im Stillen das final bei der Deklaration dazudenkt,
gibt es Probleme, und sei es wegen Variablen-Deklaration erst in der nächsten Zeile, könnte immer noch gemeckert werden,
für dieses Beispiel würde es aber reichen

von komplexeren Untersuchungen, wo und wie oft neue Werte zugewiesen werden ganz zu schweigen,
selbst veränderliche Variablen könnten eigentlich zugelassen sein,
aber was solls, der Compiler muss hier nicht im Geheimen agieren oder ähnlich verrenken, 
die Regel ist nicht zuviel zugemutet


----------



## Jack159 (5. Jun 2012)

Na gut, dann ist alles klar, danke euch beiden 

@ jgh:
Dass ich dem Button den ActionListener adden muss, ist mir 5 Sekunden nach Thread eröffnung eingefallen, habs dann noch schnell umeditiert (leider nicht schnell genug  ), da mir die final-Sache zu dem Zeitpunkt auch unklar war, trozdem danke


----------



## HimBromBeere (5. Jun 2012)

> Das ganze funktioniert auch, aber ich frage mich, warum er fordert, dass der Button b final sein soll, sobald ich in der actionPerformed() auf den Button mit b.tueirgendwas() zugreifen will?!


Ohne das jetzt mit aboluter Sicherheit sagen zu können: final ist dafür da, dass du die Referenz einer Variablen nicht ändern kannst (Methodenaufrufe der Form b.tuIrgendwas() dagegen gehen natürlich trotzdem). Wenn du nun mit b einen anderen Button referenzieren würdest, dann würdest du die actionPerformed ja quasi ihre Daseinsberechtigung nehmen, da das Objekt, auf das sich diese Funktion eigentlich bezieht, jetzt nicht mehr ansprechbar wäre (denn b referenziert ja schließlich ein anderes Objekt).

Stell dir einfach folgendes vor:

```
public static void main(String[] args) {
        
        final JFrame f = new JFrame();
        f.setSize(300, 300);
        f.setVisible(true);
        JButton b = new JButton("Button");
        f.add(b);   
        
        ActionListener a = new ActionListener(){
            public void actionPerformed(ActionEvent e)  {
                b = new JButton(); // wir setzen die Referenz auf ein neues Objekt
               // wie wollen wir jetzt unser ursprüngliches Objekt (auf das sich dieser Listener schließlich bezieht) ansprechen und verändern? Gar nicht
            }
        };
        b.addActionListener(a);
        
    }
```
Welchem Button soll der Listener nun hinzugefügt werden? Dem alten oder dem neuen? Ich denke, das war der Gedanke hinter dem final...


----------

