• ベストアンサー

二段階でインスタンス化する必要、メリットって何?

JAVAについての質問です。 オブジェクトを宣言しても、NEWしない(インスタンス化しない)とメモリにはその領域が確保されないと参考書には 書かれていますが、このようにわざわざ二段階にわけてインスタンス化する必要、メリットって一体何なんでしょうか。 確かにインスタンス化されるまでは、メモリの節約にはなるでしょうが、宣言とインスタンス化する時間的なズレは わずかなもので、増してPCにとっては、もっと大した時間ではないでしょう。 それほどまでにしても、メモリの節約が大事なのでしょうか。 このように二段階にする意味は他に何か理由はあるような気がして仕方ないのですが。 このような疑問を持つのは私だけでしょうか。

  • htgo
  • お礼率33% (407/1224)
  • Java
  • 回答数3
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • mibusys
  • ベストアンサー率60% (18/30)
回答No.3

Calendarクラスは(基本的には)自分でnewできません。 どのように使うかというと Calendar c = Calendar.getInstance(); と書きます。 これはデザインパターンのシングルトンパターンというのですが 「今の日付のオブジェクト」を使いたい場合はよくあるわけです。 その際に使う場所ごとに別のオブジェクトを新規作成していたら 領域が無駄に使われますよね。なので、1つのVM上で動いている間は 同じオブジェクトを再利用するためにそのような仕組みを使います。 この辺はJavaを1年くらい勉強したあとによりよいコードを書くために 勉強すべき点なので少し難しいかもしれません。 また、ある変数に具体的にどんなクラスのオブジェクトを格納するのか 決まっていない場合もあります。極端な話 Object o; としておけば、StringでもDateでもどんなオブジェクトでも入れられます。 最近の流行はSpringなどのフレームワークでabstractとかのクラスを 受け側にして実体化するオブジェクトはそれを継承した実装クラスを使用し どの実装クラスを使うかはXMLに記述し実行時にDIするという方法です。 つまり「車」クラスを受け皿にし、その実体に「ベンツ」オブジェクトを入れるか 「トヨタ車」オブジェクトを入れるかは決まってないし、Javaのソース上にすら 書かないこともあるよということです。これは少し難しいかもしれませんが。 まぁとにかく大人の事情で毎回newするわけじゃないよ違う場合もあるよ ということです。

その他の回答 (2)

  • spieder
  • ベストアンサー率59% (13/22)
回答No.2

メモリやCPUを節約するためになぜオブジェクトの宣言とインスタンス化を分けるのかという意味なら、そのオブジェクトを使うか使わないか、プログラムの記述時には判らないから、必要な場合だけインスタンス化してメモリとCPU時間を節約します。そうすることで、普通のディスクトップアプリだと起動時間やレスポンスの向上、サーバーアプリなら同時処理能力の向上が見込めます。 たとえば、アプリケーションの一部の機能として画像のサムネイル一覧表示をする場合、起動時にPCの中のすべての画像に対してサムネイル画像を作成するのは無駄です。表示する1つのディレクトリ分のサムネイル表示する場合でも、画面のサイズ的にサムネイルが全て収まらない場合、表示しないサムネイルを作成しないほうが早く処理ができます。特に処理する数が多くなればなるほど効果が出てきます。 "遅延初期化"という単語で検索すればいろいろ情報は出てきますよ 単純に"オブジェクトの宣言とインスタンス化を別に記述する必要があるのか?"なら、宣言したオブジェクトに対して必ず新しいインスタンスを生成する必要が無いからというのが答えです。メソッドを呼び出した結果を宣言したオブジェクトに代入して後の処理で同じインスタンスを使うためです。 (Javaは同じインスタンスのメソッド呼び出し結果が、必ず同じインスタンスを返すことは言語仕様上保障されていない Ex Iterator.next)

参考URL:
http://www.sgnet.co.jp/java/chapter0302.html
htgo
質問者

お礼

spiederさん、有難うございます。 >宣言したオブジェクトに対して必ず新しいインスタンスを生成する必要が無いからというのが答えです。メソッドを呼び出した結果を宣言したオブジェクトに代入して後の処理で同じインスタンスを使うためです。 ⇒新しいインスタンスを生成する必要が無いのなら、オブジェクトを宣言する必要が無いと思うのですが。

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.1

変数宣言とインスタンス化は全く別の作業だから 別々になっているだけです。 変数宣言したら必ずnewするわけでもないですし。 例えば、既に作成済みのインスタンスを代入したり、 インスタンスを返すメソッドの返り値を代入したりすることもあるでしょ?

関連するQ&A

  • マルチプルインスタンスのメリット

    100%の自信をもって回答できる方のみ回答をお願いします。 Java等のオブジェクト指向プログラミング技術において、クラスからインスタンスを たくさん作れるというのが特徴の一つとなっていますが、クラスからインスタンスを たくさんつくれるメリットはなんでしょうか。 クラスからインスタンスをたくさん作れなくても、1つ作れば動くプログラムはたくさんありますし、 そういうプログラムであれば、staticなアクセスにすればよいですよね。 クラスからインスタンスがつくれることを説明した本やサイトは山ほどありますが、 インスタンスがたくさん作れることのメリットを説明した本をみたことがなく、 「なぜオブジェクト指向でつくるのか」という本を買って読みましたが、 納得がいくメリットを感じられませんでした。 また世の中のソースをみると、みんな、すぐにクラスを作ってオブジェクトを作っていますが、 みなさんがどうして、オブジェクトを作らなくてもコーディングできるケースのプログラムを オブジェクトを作るのか不思議でしかたありません。 どうしてオブジェクトを作らなくてもいいケースでもオブジェクトを作るのか、 またたくさんオブジェクトを作れるメリットはなんなのか、教えてください。

  • インスタンスオブジェクトとは何かについて教えて!!

    下記内容はあるサイトのインスタンスについての説明文です。 画像は、自分なりに理解したものです。 (1)メモリ上には記憶場所(=ポインタ)はない (2)var Aa = new Bb("13" , "smole");とscript内に追加されたことにより メモリ上に記憶場所(=ポインタ)が作成され、 BbオブジェクトつまりBb("13" , "smole");がその記憶場所(=ポインタ)に入る (3)そしてBb("13" , "smole");が入った 記憶場所(=ポインタ)にAaという名前を付ける。 考え方に間違いがあるでしょうか? ---------------------------------------------------- var Aa = new Bb("13" , "smole"); これは、BbクラスオブジェクトのBbコンストラクタをnew演算子を利用して起動しています。 new演算子は、メモリ上に記憶場所を確保して、Bbオブジェクトを作成した後、そのポインタを返す演算子です。 new演算子から返されたポインタは、Aaへ格納されます。この場合のAaをBbオブジェクトのインスタンスといいます。 また、new演算子でメモリ上に記憶場所を確保して作られたオブジェクトをインスタンスオブジェクトといいます。 つまり、 オブジェクト == インスタンスオブジェクト で、 インスタンス != インスタンスオブジェクト インスタンス != オブジェクト です。 ----------------------------------------------------

  • オブジェクト指向コンパイラのインスタンスの構造について

    インタプリタやコンパイラの中身について興味があり勉強しています。といってもまだ簡単な字句解析や構文解析のレベルです。 読んだ本にはオブジェクト指向言語については書かれていませんでした、そこで一つ疑問に思ったこと点について質問させてください。 簡単な言語の場合、使用する変数が宣言されると、その領域がスタックやヒープ空間に確保されるという風に理解しました。 一方オブジェクト指向言語にて、あるクラスのインスタンスを生成した場合を考えます。インスタンスには変数の他に関数やメソッドといった処理手続きが含まれていますよね。その手続きをコンパイルしたコードは何処に置かれているのでしょうか? 手続きのコードもヒープ空間に確保された各インスタンスの領域にコピー(?)されて実行されるのでしょうか。それとも処理手続きの実体は実行プログラムに含まれていて全インスタンスで共通で利用するようになっているのでしょうか。 初心者の素朴な疑問です、ご回答いただければ幸いです。

  • インスタンス変数について

    JAVA勉強中のものです。 インスタンス変数についてわからないのですが、 class Data{int d;} classSample{ public static void main(String[] args){ Data data1 =new Data(); Data data2 =new Data(); data1.d = 100; data2 = data1; data2.d = 200; System.out.println(data1.d); } } 実行すると200が表示されますが、new演算子によってできたオブジェクトの実体を参照する ID がdata1およびdata2に入るのは理解できるのですが、 インスタンス変数のdはメモリ上でどう設定されているかイメージがわきません。 わかる方どうぞ教えて下さい。

    • ベストアンサー
    • Java
  • インスタンスとオブジェクト 生成

    クラスのオブジェクトを生成するときに(newをつかって) ●インスタンスを生成する。 ●オブジェクトを生成する。 と参考書に書いてありますが、言い方はどちらでもいいそうです。 でも、2種類の言い方がるということは厳密には意味が違うような気がするのですが、皆さんはどう思いますか? またどちらの言い方を使っていますか? どちらが正しいのでしょうか?

    • ベストアンサー
    • Java
  • newしないオブジェクトについて

    C++で オブジェクト生成時、NEW しない場合、 どこにメモリ領域が作られているのでしょうか? また、newはmallocと同じで、動的にメモリを確保ということはわかるのですが、 では、newしない場合、静的ということになるのでしょうか? そうだとすると、静的なオブジェクトとは一体どのようなものをいうのでしょうか? よろしくおねがいします。

  • Javaにおけるメモリーの使い方についての質問です。

    Javaにおけるメモリーの使い方についての質問です。 以下のサイトには、Javaの継承は、スーパークラスのメモリ領域に、 サブクラスで使うメモリ領域を追加することなんだということが記載されています。 この説明(継承ではスーパークラスのメモリ領域にサブクラスでのメモリ領域を追加する)は、 インスタンスを作成したときの話でしょうか? もしインスタンスを作成したときの話であれば、例えば、GeographicInfo型のインスタンスを 1つ作り、その後にGeographicInfo3D型のインスタンスを1つ作ると、普通に考えれば それぞれで別のメモリ領域が確保されますが思いますが、この説明が正しいとすると、latitude、longitudeの領域は、それぞれで共通であるというように見受けられます。 そんなバカなことはありえないと思いますから、インスタンスを生成したときの話ではないと 思いますが、では、なんの時の話でしょうか。 http://www.atmarkit.co.jp/fjava/rensai2/javaent04/javaent04.html#ap02

    • ベストアンサー
    • Java
  • newしないインスタンス?実体化しなくてもいいの?

    JAVAについて教えて下さい。 ServletContext application = getServletContext(); の成り立ちの意味なのですが、newがなぜないのか教えて下さい。 ~自身の考え~ (1)サーブレットコンテキストというクラスをインスタンス化して (サーブレットコンテキスト 変数A = new サーブレットコンテキスト();)     ↑                         ↑   クラス                       クラス (2)変数Aドットメソッド()によって、代入変数Bを作り上げる (サーブレットコンテキスト 代入変数B = 変数A . メソッド();) (3)のはずが、上記の式にはnewがありません。 なんで?? ~~ ~疑問点~ もしかしたらHttpServletでimportしているからそこでnewインスタンス化宣言している? だとするならどのような式になっているのでしょうか。 もしくはメソッドのF3キーとして上位をたどったときに出てきた public abstract class GenericServlet implements Servlet, ServletConfig, Serializable { public ServletContext getServletContext() { return getServletConfig().getServletContext(); } } として抽象クラスが出てきましたが、どこにもnew実体化していません。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Javaプログラミング インスタンス生成時の疑問

    現在Javaを学習中の者です。 一通り入門編を終えたところで、テトリス自作に挑戦している最中です。 // 利用クラスのインスタンス生成 block = new Block(); field = new Field(); gui = new GUI(field); proc = new Proc(gui, field, block); 本体Tetrisクラスのコンストラクタ内でこのような記述をしております。 ここで疑問に感じたのですが、例えばFieldクラスにguiオブジェクトを渡したいとなった場合、どう対処するのでしょうか。 field = new Field(gui); gui = new GUI(field); これではおそらくguiインスタンス生成前にオブジェクトを渡しているためおかしな事になってしまいますよね? 実際にやりたい訳ではなく、「こうしたいときどうすればいいんだろう」と思っただけなのですが、気になったので質問させて頂きました。 模索しながら作成中のため、記述自体に突っ込みどころがあるかもしれません…。

    • ベストアンサー
    • Java
  • クラスインスタンスとクラス型変数の配列

    C++からシフトしてきた若輩JAVAプログラマですが、微妙に理解しきれない部分があるため、お知恵をお借りしにきました。 最初にC++のサンプルを書かせていただきます。 ----- C++ ----- class Hoge {  /* 実装省略 */ } int main( void ) {  Hoge *hoge = new Hoge ;  Hoge *hoge = new Hoge[10] ; } --------------- これをJAVAで実装した場合、以下のようになると思います。 ----- JAVA ----- class Hoge {  /* 実装省略 */ } class Test {  public static void main( String[] args )  {   Hoge hoge = new Hoge() ; /* 1 */   Hoge[] hoge = new Hoge[10] ; /* 2 */  } } --------------- JAVAの場合、2ではクラスのインスタンスが確保されていないことを知りました。C++ではnewの役割が「何かをメモリ上に確保する(malloc)」という意味合いであったのに対し、JAVAの場合は考え方が違うものだということでしょうか。 そうすると、 int[] a = new int[10] ; と、 Hoge[] hoge = new Hoge[10] ; のnewは、意味が違うという認識にたどり着いてしまうのですが、そうなると『妙な』気持ちがしてしまいます。そんな面倒な言語仕様では無い気もしますし。 私の考え方が間違っている可能性が高いと思いますので、教唆していただけると助かります。 よろしくお願いします。

    • ベストアンサー
    • Java