Zurück   Entwickler-Forum > Java™ > Java™ Standard

Antwort
 
Themen-Optionen Ansicht

Cannot refer to a non-final variable...
Alt 18.03.2010, 12:33   #1
xkris
Zaungast
 
xkris ist offline
Registriert seit: 26.10.2009
Beiträge: 22
xkris befindet sich auf einem aufstrebenden Ast
Standard Cannot refer to a non-final variable...

Hallo,

Warum bekomme ich bei der oberen Variante die Fehlermeldung

"Cannot refer to a non-final variable f inside an inner class defined in a different method"

Bei der unteren Version ist f ebenfalls nicht final und trotzdem funktioniert sie.


Code:
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class FrameEndeBeispiel {
	public static void main(String[] args){
		Frame f = new Frame();
		f.setSize(200,100);
		f.setVisible(true); 
		f.addWindowListener( new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.out.println("Anwendung wird geschlossen");
				f.dispose();
			}
		}  );
	}

}
Code:
import java.awt.*;

public class FrameEndeBeispiel {
	public static void main(String[] args){
		Frame f = new Frame();
		Frame f1 = new Frame();
		f.setSize(200,100);
		f1.setSize(200,100);
		f.setVisible(true); 
		new FrameEnde1(f); 
	}
}

**********neue Klasse**************************

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


public class FrameEndeAnonym {
	Frame f;
	
	public FrameEndeAnonym(Frame f1){
		f=f1;
		f.addWindowListener( new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.out.println("Anwendung wird geschlossen");
				f.dispose();
			}
		}  );
	}
}
  Mit Zitat antworten

Anzeige

Alt 18.03.2010, 12:42   #2
Christian Marquardt
Forenheld
 
Christian Marquardt ist offline
Registriert seit: 26.02.2003
Beiträge: 9.278
Christian Marquardt befindet sich auf einem aufstrebenden Ast
Standard

http://java.sun.com/docs/books/jls/s...oc.html#262890
__________________
Christian

________________________________________
C-Ecke
  Mit Zitat antworten

Alt 18.03.2010, 13:56   #3
xkris
Zaungast
 
xkris ist offline
Registriert seit: 26.10.2009
Beiträge: 22
xkris befindet sich auf einem aufstrebenden Ast
Standard

ok, der interessante Satz ist wohl

Zitat:
Any local variable ... used but not declared in an inner class must be declared final, and must be definitely assigned (§16) before the body of the inner class.
Wenn ich das richtig verstehe soll vermieden werden, dass die Variable f, die ja als lokale Variable zur main() Methode gehört, in einer anderen Methode, in meinem Fall "WindowClosing", manipuliert wird.

Meine obere Variante funktioiert also, wenn ich Frame als final deklariere.
Was passiert, wenn ich das Object "Frame" als final deklariere? Wäre es ein primitiver Datentyp wäre es klar, aber Frame ist ein Objekt.
Interessanterweise habe ich das hier gefunden:

Zitat:
One may declare elemental types as final, but final references and final objects do not exist.
Demnach kann man Objekte nicht als final deklarieren. Aber es funktioniert. Sehr verwirrend
  Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu



Alle Zeitangaben in WEZ +2. Es ist jetzt 07:47 Uhr.



© 1995–2009 Software & Support Verlag GmbH. Vervielfältigung nur mit Genehmigung des Verlags.