2013-08-23 10 views
5

Ich entwickle ein GUI-Programm, in dem ich Klassen, die ActionListeners zusammenfassen, nach Funktionalität erstellt habe. Meine Frage bezieht sich darauf, wie die JVM jButtons behandelt, denen derselbe ActionListener hinzugefügt wurde.Java, Referenzvariablen, die auf das gleiche Objekt im Speicher verweisen

Zuerst; Ich bin mir bewusst, dass die JVM Speicher sparen kann, indem zwei Referenzvariablen, die auf eine identische Zeichenfolge verweisen (zum Beispiel), auf dasselbe Zeichenfolgenobjekt im Speicher zeigen.

public class Example { 
    String str1 = "SomeString"; 
    String str2 = "SomeString"; 
} 

Jetzt ist meine Frage: Wenn ich sage, sagen wir 5 jButtons. Allen Schaltflächen wurde der gleiche ActionListener hinzugefügt. Wenn das Programm ausgeführt wird, werden ihnen 5 separate, identische Instanzen derselben Klasse hinzugefügt? Oder wird die JVM etwas Ähnliches tun (wie oben erwähnt)?

  • Vielen Dank im Voraus :)
+0

Wenn Sie uns zeigen, was Sie tun, können wir Ihnen sagen, was passieren wird. Oder Sie können es selbst ausprobieren. Ihre Frage ist verwirrend - wenn Sie das gleiche ActionListener-Objekt an fünf verschiedene Schaltflächen übergeben, warum sollten Sie dann denken, es würde sich in fünf Objekte aufteilen? –

+0

Danke für Ihre Antwort. In meinem Beispiel meinte ich; Wenn ich explizit fünf verschiedene Objekte zu fünf verschiedenen Schaltflächen hinzufüge - optimiert die JVM den Speicherplatz und lässt sie dasselbe Objekt teilen. –

+0

In diesem Fall, nein. Die JVM führt solche Objekte nicht zusammen. Strings sind ein Sonderfall. Sie könnten jedoch denselben ActionListener für mehrere Schaltflächen verwenden. –

Antwort

4

Nun, es hängt wirklich davon ab, wie Sie die ActionListeners erstellt. Wenn Sie

tun
button1.addActionListener(new ActionListener() { 
    .... 
}); 
.... 
button5.addActionListener(new ActionListener() { 
    .... 
}); 

Oder

ActionListener al= new ActionListener() { 
    .... 
}; 
button1.addActionListener(al); 
.... 
button5.addActionListener(al); 

Im ersten Fall Sie, wahr, haben 5 verschiedene Aktion Hörer. Aber in der Sekunde hast du nur einen. Wann kannst du nur einen haben? Wenn es genau das Gleiche und auf den gleichen Objekten tut.

+0

Die erste wäre getrennte Objekte, und die zweite wäre das gleiche Objekt, richtig? – shieldgenerator7

+0

Danke für die Antwort. Ich habe getan, was Sie in Ihrem ersten Beispiel erwähnen - und jetzt, wo Sie das letzte Beispiel erwähnen, bin ich überrascht, dass ich das nicht getan habe. Aber wie in meinem Frage-Beispiel gezeigt; Meine Gedanken waren hauptsächlich, ob die JVM aufheben könnte, dass eine Anzahl von jButtons identische Objekte bekommen haben und sie sich daher dasselbe teilen lassen. –

+0

Das ist eine sehr gute Frage. Und die Antwort ist nicht einfach. Vielleicht einfach nicht schlau genug? Etwas Arbeit für uns erledigen? –

3

Es hängt davon ab.

Dies wird ihnen die gleiche Instanz geben.

ActionListener al = new ActionListener() { ... }; 
button.addActionListener(al); 
button2.addActionListener(al); 
... 

während dies ihnen ihre eigenen geben wird.

button.addActionListener(new ActionListener() { ... }); 
button2.addActionListener(new ActionListener() { ... }); 
1

Ich glaube, es würde das gleiche ActionListener-Objekt an alle 5 Tasten übergeben. Wenn Sie die Wahrheit wissen wollen, schlage ich vor, dass Sie es selbst testen

Verwandte Themen