2013-08-23 8 views
5

に同じオブジェクトを指す参照変数は、私は機能によって、クラス、そのクラスタのActionListenerにしてきたGUIプログラムを、開発しています。私の質問は、JVMがjButtonをどのように処理し、同じActionListenerが追加されたかに関するものです。ジャワ、メモリ

まず、 JVMは、メモリ内の同じ文字列オブジェクトを指す、同じ文字列(たとえば)を指す2つの参照変数を渡すことによって、メモリを節約できることを認識しています。今

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

、私の質問はこれです:私は、たとえば、5つのJButtonがを持っている場合。すべてのボタンには、同じActionListenerが追加されています。プログラムを実行すると、同じクラスの5つの別々の同一のスタイリストが追加されますか?あるいは、JVMは(上記と同様の)何かをするでしょうか?事前に

  • 感謝:)
+0

のためにそれをテスト示唆しています。または、自分でテストすることもできます。あなたの質問は混乱しています。同じActionListenerオブジェクトを5つの異なるボタンに渡すと、なぜ5つのオブジェクトに分割されると思いますか? –

+0

お返事ありがとうございます。私の例では、私は意味しました。 5つの異なるオブジェクトに5つの異なるオブジェクトを明示的に追加すると、JVMはメモリ空間を最適化し、同じオブジェクトを共有させます。 –

+0

その場合、いいえ。 JVMはそのようなオブジェクトをマージしません。文字列は特殊なケースです。ただし、複数のボタンに対して同じActionListenerを使用できます。 –

答えて

4

まあ、それは本当にあなたがActionListenersを作成した方法によって異なります。あなたは真の、最初のケースで

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

それとも

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

をした場合は、5種類のアクションリスナーを持っています。しかし、2番目には1つしかありません。いつあなたは1つしか持てませんか?それがまったく同じで、同じオブジェクト上にあるとき。

+0

最初のオブジェクトは別のオブジェクトで、2番目のオブジェクトは同じオブジェクトです。 – shieldgenerator7

+0

お返事ありがとうございます。 私はあなたの最初の例で言及していることをやってきました。そして最後の例を挙げましたが、私はそれをしなかったことに驚いています。 しかし、私の質問の例に示すように、私の考えは主に、JVMがピックアップできるかどうか、多くのjButtonに同じオブジェクトが与えられているかどうか、そしてそれらを共有するかどうかということでした。 –

+0

これは非常に良い質問です。そして、その答えは簡単ではありません。おそらくちょうど十分スマートではない?私たちのためにいくつかの仕事を残していますか? –

3

それは依存します。

これは、彼らに同じインスタンスを提供します。

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

これにより、独自の効果が得られます。

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

私はそれがすべての5つのボタンに同じのActionListenerオブジェクトを渡すと考えています。 あなたは真実を知りたい場合は、私はあなたが私たちは何が起こるかを伝えることができますやっている私たちを見るならば、あなた自身