Verständnisfrage

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hey,

sry für den ungenauen Titel, kann's aber nicht so knapp zusammenfassen.

Die Frage stammt ursprünglich aus einem anderen Thread, dessen Frage eigentlich schon
lange gelöst ist. (Da schaut wohl keiner mehr rein) Jetz hatte der Ersteller mich aber noch eine Sache gefragt, und beim Versuch, ihm das zu erklären, habe ich gemerkt, dass ich es selber nicht so wirklich weiss..

Es ging um folgendes, der User hatte Probleme mit - sinngemäß - diesem Code:
Code:
for(int i = 0; i<10; i++){
     // ...
     something.addActionListener(new ActionListener(){
          @Override 
          public void actionPerformed(ActionEvent e){
                   doStuff (i);
          }
      }
}

Weil er i nicht in der doStuff() Methode übergeben kann, ohne es final zu machen. Und das geht ja
nicht, denn man inkrementiert i ja in der Schleife. So, ich hab ihm gesagt er soll sich einfach ne final
Variable innerhalb der Schleife machen und der den Wert i zuweisen, hab das wohl eher schwammig erklärt, warum
das so ist usw. ich muss das ja jetz nicht alles wiederholen.

Was ich jetzt wissen will:

1) erzeugt man mit
Code:
something.addActionListener(new ActionListener(){})
eine anonyme Klasse? Also nicht nur eine Instanz einer Klasse, sondern man definiert hier ne neue Klasse, oder?
Die halt dann das ActionListener Interface implementiert?

2) Wieso muss man eigentlich final Variablen übergeben? Wenn man sich ne eigene Klasse schreibt, die
das ActionListener Interface implementiert, mit nem Konstruktor dem man das i übergeben kann, geht
es ja auch ohne final:

Code:
for(int i = 0; i<10; i++){
     // ...
     something.addActionListener(new MyListener( i ));
}

Wieso also genau muss das final sein bei der ersten Variante? Bitte nur Antworten von echten Cracks,
die es komplett verstehen, und nicht nur Rumgerate ;) Das hab ich selber schon gemacht als ich dem User
geantwortet hab, ich will's aber mal so richtig genau verstehen!

Danke
 

Wildcard

Top Contributor
1. ja, man erzeugt eine anonyme innere Klasse die ActionListener implementiert.
2. Das ist so nicht richtig. Die innere Klasse hat Zugriff auf den kompletten Variablen Stack (sprich Member der Klasse können zB verwendet werden und müssen auch nicht final sein).
Bei lokalen Variablen ist die Sache aber anders. Beispiel an diesem Code Fragment:
Code:
int i = 5;
InnerClass c = new InnerClass(){
   public doSomethingWithI(){
        System.out.println(i);
   }
} 
i = 16;
c.doSomethingWithI();
Was soll ausgegeben werden? 5, oder 16? I zum Zeitpunkt der Erstellung, oder zum Zeitpunkt des Aufrufs?
Du vergleichst mit einem Konstruktor. Im Konstruktorfall wäre es 5, sieht man sich jedoch die Codereihenfolge an, wäre eher mit 16 zu rechnen.
Man umgeht dieses fehleranfällige Konstrukt in dem man final Variablen erzwingt.
Womöglich gibt es auch einen technischen Hintergrund, aber alleine schon von der Sprachdefinition wäre das eine sehr gefährliche Code Konstellation.
 

hdi

Top Contributor
Soweit hatte ich mir das auch gedacht, und du hast das jetzt bestätigt. Aber ich dachte ich irre mich
in dieser Annahme, denn:

Wenn diese neu erstellte anonyme Klasse sich wirklich auf die übergebenen Variable bezieht,
macht es zwar in der Tat Sinn, diese Variable als final zu erzwingen, aber wieso funktioniert dann folgendes:

Code:
for(int i = 0; i<10; i++){
     button = new JButton(); // angenommen der Button ist als statische Klassen-Variable deklariert o.ä.
     final int a = i;
     button.addActionListener(new ActionListener(){
          @Override
          public void actionPerformed(ActionEvent e){
                   doStuff (a);
          }
      }
}

... und wenn ich das Programm starte und klick, passiert doStuff(). Gedanke: auch die final Variable "a" ist
doch nur innerhalb der Schleife sichtbar, und nach der for-Schleife weg! Aber es funzt trotzdem! Ergo:
Die Klasse erstellt sich ne Kopie der Variablen, aaaaaber dann wären wir wieder bei der Frage:
Wenn die Klasse sich den Wert eh in ner eigenen Variablen speichert, wofür dann überhaupt erst umständlich
ne final aus i ziehen, die dann kopiert wird, statt gleich ne Kopie von i zu machen?

:autsch:
 

Wildcard

Top Contributor
Wie gesagt, durch das final ist klar definiert auf welchen Wert sich die innere Klasse bezieht.
 

hdi

Top Contributor
Hm... okay dann nehm ich das einfach so hin. Ich versteh aber noch immer nich ganz, wie diese inner class
sich die Variable abspeichert, weil sie ja eben eigentlich nach der for-schleife weg ist. Anscheinend ist final
die Bedingung dafür, dass er sie überhaupt speichern kann. Naja ok, danke
 

musiKk

Top Contributor
Diese anonyme innere Klasse ist ein Ersatz für Closures, die es in verschiedenen anderen (vor allem funktionalen) Sprachen gibt. Eine Closure erhält Zugriff auf die Variablen, die im Moment der Definition im Scope sind.

Hier wird das auch nochmal im Zusammenhang erläutert.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
A Verständnisfrage Java Basics - Anfänger-Themen 12
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
P Verständnisfrage: PageFactory.initElements Java Basics - Anfänger-Themen 2
R do while Schleife Verständnisfrage Java Basics - Anfänger-Themen 2
G while.next() Verständnisfrage Java Basics - Anfänger-Themen 16
Vivien Kurze Verständnisfrage zu Java Point aus java.awt.* Java Basics - Anfänger-Themen 5
C Erste Schritte Anfänger Verständnisfrage zum Compiler Java Basics - Anfänger-Themen 31
T Verständnisfrage Objekt Getter Setter Java Basics - Anfänger-Themen 102
K Verständnisfrage Server/Client BufferedReader, PrintWriter Java Basics - Anfänger-Themen 2
Der Grütz Verständnisfrage zu Übung aus Java Kurs - Schaltjahr bestimmen Java Basics - Anfänger-Themen 2
J Verständnisfrage zu throws neben Funktionen Java Basics - Anfänger-Themen 2
TimoN11 Verständnisfrage bei Aufgabe Java Basics - Anfänger-Themen 2
P Verständnisfrage zum Mapping Java Basics - Anfänger-Themen 3
M Java Version Verständnisfrage Java Basics - Anfänger-Themen 16
M Verständnisfrage zu eine Online Aufgabe Java Basics - Anfänger-Themen 7
T Verständnisfrage zur Konsolenausgabe Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
D Verständnisfrage zur Modellierung einer HDD Java Basics - Anfänger-Themen 17
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
S Verständnisfrage lokale Ordnerpfade Java Basics - Anfänger-Themen 1
T Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 7
J Java Starthilfe Verständnisfrage Aufgabe Java Basics - Anfänger-Themen 2
O Anfänger, Verständnisfrage Java Basics - Anfänger-Themen 3
C Verständnisfrage zu Modulo Java Basics - Anfänger-Themen 6
C Verständnisfrage bezüglich der Do-While Schleife Java Basics - Anfänger-Themen 9
L Verständnisfrage - Speicherabbild Java Basics - Anfänger-Themen 4
melly_ Verständnisfrage zu args Java Basics - Anfänger-Themen 3
A Variablen Verständnisfrage bzgl. Variablen/Referenzen Java Basics - Anfänger-Themen 3
K Verständnisfrage eines Abschnitts Java Basics - Anfänger-Themen 6
K Rekursion Verständnisfrage Java Basics - Anfänger-Themen 19
S Modell View Controller Verständnisfrage Java Basics - Anfänger-Themen 24
J Superklassen Konstruktor Verständnisfrage Java Basics - Anfänger-Themen 1
JavaTalksToMe Erste Schritte Println-Frage (Verständnisfrage) Java Basics - Anfänger-Themen 1
R Verständnisfrage zu Objekten u. Übergabeparameter Java Basics - Anfänger-Themen 8
G Collections Verständnisfrage zur For-Each-Schleife Java Basics - Anfänger-Themen 7
b1ck Interface Verständnisfrage zum GUI mit "swing" Java Basics - Anfänger-Themen 1
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
G Verständnisfrage zu for-each Java Basics - Anfänger-Themen 4
DontFeedTheTroll Erste Schritte Verständnisfrage zu If-Anweisung Java Basics - Anfänger-Themen 7
K Rekursion-Verständnisfrage Java Basics - Anfänger-Themen 4
J Java Server Pages - Verständnisfrage Java Basics - Anfänger-Themen 2
Z Verständnisfrage Anfängerprogramm Java Basics - Anfänger-Themen 0
T Verständnisfrage Zuweisungs-/arithmet. Operatoren Java Basics - Anfänger-Themen 2
G Methoden Verständnisfrage zur Methoden Java Basics - Anfänger-Themen 7
LionAge Kapselung, Verständnisfrage zur Objekterzeugung Java Basics - Anfänger-Themen 4
Z Verständnisfrage zum Multithreading Java Basics - Anfänger-Themen 3
R OOP / Verständnisfrage zum Konstuktor (siehe code) Java Basics - Anfänger-Themen 7
gamebreiti Verständnisfrage zu contains() Java Basics - Anfänger-Themen 10
A Verständnisfrage - Koordinatenumrechnung Java Basics - Anfänger-Themen 9
J Erste Schritte Verständnisfrage im Bezug auf das (richtige) Programmieren Java Basics - Anfänger-Themen 5
M Verständnisfrage zu JUnit Tests und private Methoden Java Basics - Anfänger-Themen 3
H Verständnisfrage Array Java Basics - Anfänger-Themen 2
I Interface Verständnisfrage Interfaces (Bsp.: Enumeration) Java Basics - Anfänger-Themen 2
I Verständnisfrage zu BridgePattern, Verwedung von super() Java Basics - Anfänger-Themen 4
P Verständnisfrage Java Basics - Anfänger-Themen 3
kaoZ Best Practice Verständnisfrage Listener bei lokalen Objekten Java Basics - Anfänger-Themen 8
D Input/Output Verständnisfrage Verzeichnis-/Dateiliste erstellen & Dateikonvertierung Java Basics - Anfänger-Themen 1
S Verständnisfrage zu Anweisungen und deren Wirkung Java Basics - Anfänger-Themen 7
H Verständnisfrage für oder Anweisung Java Basics - Anfänger-Themen 8
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
T Erste Schritte Verständnisfrage: Getter und Setter Methoden Java Basics - Anfänger-Themen 3
H Verständnisfrage zu Java-Ausgabe Java Basics - Anfänger-Themen 3
S Verständnisfrage Java Basics - Anfänger-Themen 2
N Verständnisfrage Code Java Basics - Anfänger-Themen 8
B Verständnisfrage Java Basics - Anfänger-Themen 2
H Interface Comparable Verständnisfrage Java Basics - Anfänger-Themen 6
B Verständnisfrage Codezeile Java Basics - Anfänger-Themen 7
B Verständnisfrage:Beispielprogramm BlueJ Java Basics - Anfänger-Themen 3
M Kurze Verständnisfrage zu einer Java Aufgabe Java Basics - Anfänger-Themen 12
K Erste Schritte Kleine Verständnisfrage Java Basics - Anfänger-Themen 12
R Verständnisfrage Referenzvariablen in array Java Basics - Anfänger-Themen 3
M Verständnisfrage: Objekt erzeugen u. zuweisen Java Basics - Anfänger-Themen 16
I OOP Verständnisfrage zu Singelton Pattern Java Basics - Anfänger-Themen 21
M Verständnisfrage zu JPanel Java Basics - Anfänger-Themen 3
S Verständnisfrage: Exception Gebrauch Java Basics - Anfänger-Themen 2
R Verständnisfrage NPE Java Basics - Anfänger-Themen 5
M Verständnisfrage zur Zahlenumwandlung (Dezimal-->Dual) Java Basics - Anfänger-Themen 25
P Java Objekte - Verständnisfrage Java Basics - Anfänger-Themen 9
N Verständnisfrage zu folgendem Programm Java Basics - Anfänger-Themen 2
L Grundlegende Verständnisfrage Hasmap Referenzen Java Basics - Anfänger-Themen 4
S Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 2
VfL_Freak Verständnisfrage zur Klasse "TIMER" Java Basics - Anfänger-Themen 7
P Verständnisfrage zu Instanzen/Objekten Java Basics - Anfänger-Themen 9
M Verständnisfrage im Umgang mit Map Java Basics - Anfänger-Themen 10
K Verständnisfrage zu int.length und String.length() Java Basics - Anfänger-Themen 4
G 2D Array gleichsetzen verständnisfrage Java Basics - Anfänger-Themen 2
M kleine und einfache Verständnisfrage Java Basics - Anfänger-Themen 3
N verständnisfrage java.util.Calendar Java Basics - Anfänger-Themen 4
G Datentypen bits, bytes, chars - Verständnisfrage Java Basics - Anfänger-Themen 5
E Verständnisfrage zu Shutdownhook Java Basics - Anfänger-Themen 5
D Verständnisfrage: Java und MySql Java Basics - Anfänger-Themen 3
F Rekursion Verständnisfrage Java Basics - Anfänger-Themen 6
A Exception Verständnisfrage: Exceptions während, einer Statischenzuweisung abfangen Java Basics - Anfänger-Themen 10
Z Comparator Verständnisfrage Java Basics - Anfänger-Themen 5
D Verständnisfrage zu Funktionen Java Basics - Anfänger-Themen 6
H Verständnisfrage Persistenz Java Basics - Anfänger-Themen 10
neurox Verständnisfrage zu Threads Java Basics - Anfänger-Themen 4
E Verständnisfrage Syntax: frame.getContentPane().add(button) Java Basics - Anfänger-Themen 11
Y Kleine Verständnisfrage zum Thema dynamische Polymorphie Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben