インスタンスの作成タイミングについて質問です

このQ&Aのポイント
  • インスタンスとは、クラスを実体化して固有の情報を持たせるものです。
  • 同じクラスのインスタンスを作成し、別々のメソッド内で処理を行う場合には、一度作成したインスタンスを参照することができます。
  • このような場合、それぞれのメソッド内で異なる情報を持たせることができ、関連する情報を連携させることも可能です。
回答を見る
  • ベストアンサー

インスタンスの作成タイミング

インスタンスの作成タイミングについて質問です。 インスタンスとは、クラスを実体化して固有の情報を持たせるものだと思っています。 一度インスタンスを作成して、その中でもう一度同じインスタンスを作成することは、どのような場合が考えられるでしょうか? (ex) a.javaの中で b.javaのインスタンスbbを作成しました。bbでmethod()を実行してその中でもう一度b.javaのインスタンスccを作成して、今度はcc.の中でmethod2()を実行しています。bbではAテーブルに変更をかけ、ccではBテーブルに変更をかけていますが、AテーブルとBテーブルはXという列で関連を持たせています。 つたない質問ですが、どなたかご教授ください。

  • Java
  • 回答数2
  • ありがとう数0

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

  • ベストアンサー
  • deadlock
  • ベストアンサー率67% (59/87)
回答No.2

「同じクラスのインスタンスを生成している」という認識でいいですか? public class A { public void methodA() { B bb = new B(); bb.method(); B cc = new B(); bb.method2(); } } 上記のような状態をイメージしているのですが。 パッと考えられるのは、以下の3つでしょうか。 1.コンストラクタかほかのメソッドで値を設定されている。  設定された値が違っていて、動作が異なる 2.一度実行するとbbやccの情報が内部で書き換わる。  Aテーブル用にmethod()を呼ぶと、Bテーブル用にmethod2()を呼べない 3.特に強い理由はない  単純に対象テーブルが分かれているので別変数/別インスタンスに分けただけ >インスタンスとは、クラスを実体化して固有の情報を持たせるものだと思っています。 で書かれている「固有の情報」が共存できなかったんだと思いますが…

その他の回答 (1)

  • coQ
  • ベストアンサー率28% (15/52)
回答No.1

もう一度同じインスタンスを生成して…の意味が分かりません。 b.java(Javaの命名規則に反しているので以下B.javaとします)のインスタンスはどうやって生成していますか? 一度目の生成と二度目の生成と、どちらも new B() としていますか? new で生成した場合、できあがるインスタンスはそれぞれ別物ですので「もう一度同じインスタンスを生成して…」ということはできません。

関連するQ&A

  • インスタンスのハンドル

    Windowsプログラミングにおいて、 ウィンドウのハンドル等などはピンとくるのですがインスタンスのハンドルというのがいまいちピンときません。 いろいろ調べたのですが、インスタンスを「実体」と解説しているサイトが多かったのですが、(たとえばここ)http://ew.hitachi-system.co.jp/w/E382A4E383B3E382B9E382BFE383B3E382B9.html ただウィンドウを表示させるようなプログラムをつくったとき、何が「実体」で、インスタンスのハンドルとはどういった働きをするのでしょうか。。

  • おなじ名前のインスタンスを作成したらどうなる?

    javaを勉強しています。 あるコードを読んでいるのですが、そのコードの中でfor文の中で ImageLoader loader = new ImageLoader(); という文で、loaderインスタンスを何回も作っていると思うのですが、同じ名前のインスタンスを作成すると、どうなるのでしょうか?更新のような感じになるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • 別のクラスのインスタンスの作り方

    現在、javaからrubyに移行するために勉強しているのですが、別のファイルに定義したクラスのインスタンスが作成できなくて、困っています。 具体例をあげると require './B' class A end def initialize b = new B end end --別のファイル class B def initialize p 'hello' end  public : initalize end こんな2つのファイルがあったとして、Aのインスタンスを作成すると、 undefined method `B’ というエラーがでます。 私としてはこのエラーの原因がinitializeがデフォルトでprivate宣言なのが原因だと考えているのですが、publicと指定してもエラーとなることから、いくつか疑問が湧いたので質問させていただきます。 1、そもそもBクラスのインスタンスが作成できないのはinitializeがデフォルトでprivate宣言なのが原因なのか? 2、1があっていたと仮定するとBクラスのinitializeをpublic指定しているのになぜ呼び出せないのか? 3、rubyはなぜデフォルトでinitializeがprivateなのか?(javaではコンストラクタをprivateにするということは普通はしない。使うときはシングルトンやUtilのようなクラスを作るときに限る) 以上です。よろしくお願いします。

    • ベストアンサー
    • Ruby
  • SQLServerで別インスタンスのデータベースのテーブルの結合はできますか?

    [インスタンスA] UserID=sa PassWord=****** DataBase=DB01 で接続されるテーブルDB01.Table1 と [インスタンスB] UserID=HogeUser PassWord=@@@@@@ DataBase=DB02 で接続されるテーブルDB02.Table2 の2つのテーブルを結合してプログラムから処理を行いたいのですが、 可能なのでしょうか。 SQLのイメージは select * from [インスタンスA].[db01].[dbo].[Table1] tbl1 join [インスタンスB].[db02].[dbo].[Table2] tbl2 on tbl1.id=tbl2.id という感じです(もちろん動作しませんが) インスタンスAとインスタンスBは同一マシンにあり、SQLServer2008SP1とします。 開発環境はVS2008SP1でSqlClient.SqlConnectionを使用して接続し、 SqlCommandにてSQLを作成し、実行するような形です。 どうかよろしくお願いいたします。

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

    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
  • インスタンス化されているかの情報を 知るメソッド

    VisualStudioC#で Aというクラスがあり、それを B,Cというクラスでインスタンスで使用したとします。 A: { ?????? } B: { A a = new A(); } C: { A a = new A(); } Aクラスの中の処理でB,Cのどちらでインスタンス化されているのかという情報を 知るメソッドはあるのでしょうか? ちなみにインスタンス化するときにAに引数などを送り込まないこととします。

  • 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
  • AWSにて別VPCのNATインスタンスは使えるか?

    現在、AWSにて2つのVPCを作り、ペアリング接続して双方通信できる状態としています。説明上、VPC-A、VPC-Bとさせてください。 VPC-AにはNATインスタンスを作り、プライベートアドレスしか持たないVPC-A上のサーバーはNATインスタンス経由でインターネット接続を実現しています。VPC-B上のサーバーもこのNATインスタンスを経由させてインターネット接続を実現したいのですが、これは無理なことなのでしょうか?VPC-B上のルートテーブルでデフォルトルートは書くことができても、NextHopは作成したPeeringConnectionとしてしか指定できず、VPC-A上のNATインスタンスを指定できないため無理なのかなと・・・。

  • C#のインスタンスを参照渡ししたい

    メインのクラスAにウェブブラウザAがあります。 クラス A { メソッドA(){  ウェブブラウザA.Navigate(URL); } メソッドC(){  MessageBox.Show("これは成功"); } } クラス B {  メソッドB(ウェブブラウザA){   ウェブブラウザA.Navigate(URL);//成功  } A a = new A(); a.メソッドA();//失敗 a.メソッドC();//成功 } このようなプログラムを作っています。 クラスBをインスタンスして実行すると クラスBのメソッドBは成功しますが、クラスAの方で宣言しているa.メソッドAは失敗します しかし、a.メソッドC();は成功します。 これは、a.メソッドAは、その上のA a = new A();でつくられた新しいインスタンスのなかで処理がされていて起動時につくられたクラスAのインスタンスとは別のものになっているからだと思うのですが、まちがいないでしょうか? この処理を成功させたい場合、起動時に作られたクラスAのインスタンスをメソッドBの引数に参照渡しですれば、  メソッドB(ウェブブラウザA){   ウェブブラウザA.Navigate(URL);//成功   メソッドA();  } も可能なのではないかと考えているのですが、可能でしょうか?またそのインスタンスを引数にする方法はどのようなものでしょうか? ちなみに、クラスBはDLLに置いてあり、メソッドAは複数のDLLで使うので毎度書くのは面倒なのでクラスAの中で呼び出して使いたいと考えています。

  • インスタンスを同じ名前で作成できる?

    最近Javaの勉強を始めました。 入門書に従って進めているのですが、 例題に下記のようなプログラムが載っていました。 for文の中でインスタンスを作ってループさせているのですが、 下記のプログラムだと"fusen" "label"という同名のインスタンスが複数できることになると思います。 結果は複数の付箋がデスクトップに表示されるので参考書通りといえばそうなのですが、 同名のインスタンスが複数作成されてしまうというのは例えば同じ名前の変数が複数、しかも同じブロック内で作成されてしまうというのと同じような気がします。 後々3番目に作ったインスタンスのメソッドだけを使いたいとかと思った場合、 困るのではないかと思いますし、そもそも同じ名前のインスタンスを複数作れるというのは 有りなのでしょうか? 上手く説明できないのですが、何だか気持ち悪くてしょうがありません。 どなたかアドバイス頂けないでしょうか? (注) "Dodai"クラスは入門書付属の拡張ライブラリなのですが、 デスクトップに付箋を表示するためのクラスです。 "JLabel"クラスは"Java Platform Standard Edition 6"のものを使用しています。 ----------------------------------------------------------- public static void main(String[] args){ //外側の繰り返し for( int i = 1; i <= 9; i++ ){ //内側の繰り返し for( int k = 1; k <= 9; k++ ){ Dodai fusen = new Dodai(); JLabel label = new JLabel(); label.setText(i + "x" + k + "=" + ( i*k )); fusen.add(label); fusen.setSize(50, 30); fusen.setLocation(i * 60, k * 40); fusen.setVisible(true); } } }

    • ベストアンサー
    • Java

専門家に質問してみよう