Announcement

Collapse
No announcement yet.

Cannot refer to a non-final variable...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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();
    			}
    		}  );
    	}
    }

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

    Comment


    • #3
      ok, der interessante Satz ist wohl

      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:

      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

      Comment

      Working...
      X