- ベストアンサー
参照型変数で受け取らないnew
ふつうは A a; a=new A(); というふうにnew A();を参照型変数aで受け取りますよね? しかしこの前見たのは メインメソッドにいきなり new A(); とだけ書いてあるのです。 参照型変数で受け取ってないんです。 こんなことゆるされるんでしょうか? これですと、Aというオブジェクトはnewされて生成されたわけですが、 どこからも参照されていないのでガーベッジコレクションの対象に なってしまうのではないのでしょうか? よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
よくあると思う。例えば、こんなもの。 public class Hoge extends JFrame { public Hoge(){ // 初期化処理 setVisible(true); } public static void main(String[] args){ new Hoge(); } } 例えばSwingのコンポーネント継承クラスの場合、newするとSwingのGUIイベントを管理するイベントディスパッチスレッドが起動し、そこでイベント処理のループがエンドレスで実行される。つまり、new JFrameしてsetVisibleし画面に表示した段階で、常にスレッドが実行され続ける状態になるわけで、使用中のインスタンスがガーベージコレクションの対象になることはないためインスタンスは(ウインドウが閉じられSwingのイベントディスパッチスレッドが終了するまで)消されることはない。従って、ただnewするだけで何も問題は起こらない。 同様に、newしたときにコンストラクタ内から何かの処理を呼び出し実行するようなクラスであれば、newするだけですべて事足りることもある。従って、ただnewするだけで何も変数に代入しないやり方というのは、別に特殊なものなく、普通にあり得る。
その他の回答 (2)
- choconamacream
- ベストアンサー率44% (152/338)
>こんなことゆるされるんでしょうか? Javaを勉強し始めたばかりの人などには、あまり見慣れない記法かもしれませんが、コンパイルエラーも起きず、ちゃんとしたJavaのコードです。 以下のサイト内にある「テストプログラムの例」でも、同様の記述がありますので、どこにそのような記述があり、実際にmainメソッド内でどのような処理がされていくのかを、頭の中でトレースしていってみてください。 Java言語規定 15.8 クラスインスタンス生成式 15.8.2 例:評価順序とメモリ不足の検出 http://www.y-adagio.com/public/standards/tr_javalang/15.doc.htm#41147
- no_name33
- ベストアンサー率0% (0/3)
a=new A(); はここで生成したインスタンスを後で使いたいから代入するわけですよね。 後で使う必要がなければ代入は不要であり、ガーベジコレクションの対象になっても問題ないと思います。 つまり、必要な処理はすべてコンストラクタで完結していたのではないでしょうか。 いずれにしろ普通じゃないですね。