インスタンス変数についての質問

このQ&Aのポイント
  • 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勉強中の方からの質問です。インスタンス変数についてわかりません。具体的なコードとして、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); } } このコードを実行すると、data1.dに100を代入し、data2をdata1に代入してからdata2.dに200を代入し、最後にdata1.dを表示すると200が表示されます。インスタンス変数のdはどのように設定されているのでしょうか?詳しい方教えてください。
  • 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); } }とあります。このコードを実行すると、data1.dに100を代入し、data2をdata1に代入してからdata2.dに200を代入し、最後にdata1.dを表示すると200が表示されます。インスタンス変数のdはどのようにメモリ上で設定されているのでしょうか?詳しい方に教えていただきたいです。
回答を見る
  • ベストアンサー

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

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
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • neko_noko
  • ベストアンサー率45% (146/319)
回答No.1

「new演算子によってできたオブジェクトの実体」にint dのメモリ領域が確保されています。 Data data1 =new Data(); Data data2 =new Data(); new Data();とする度に、オブジェクトの実体(インスタンス)はできるので、 「data1が参照しているインスタンス」と「data2が参照しているインスタンス」は(この段階では)別物です。 それぞれにint dのメモリ領域があります。 data1.d = 100;で、「data1が参照しているインスタンス」のint dのメモリ領域に値100がセットされます。 次にdata2 = data1;としているので、data2は「data1が参照しているインスタンス」を参照することになります。 つまり、data1とdata2は、同じインスタンスを参照するようになったわけです。 ※この時点で、「最初にdata2が参照していたインスタンス」は、どこからも参照されなくなっています。 なので、data2.d = 200;とした場合、 「data2が参照しているインスタンス」=「data1が参照しているインスタンス」 のint dに値200をセットした、とも言えるわけですね。 http://www.atmarkit.co.jp/fjava/rensai2/javaent02/javaent02.html http://www.atmarkit.co.jp/fjava/rensai2/javaent03/javaent03.html

tomojyuu
質問者

お礼

回答ありがとうございます。 よくわかりました。

関連するQ&A

  • クラス変数/メソッドとインスタンス変数/メソッドの見え方について

    Javaの言語仕様(?)についてお教え下さい。 参照変数の型がインスタンスのスーパークラスの型の時、クラス変数/メソッドとインスタンス変数/メソッドの見え方が納得いかずに困っています。 以下のような条件の時です。   ・クラスが2つあり、1つはもう1つのクラスを継承しています。     それぞれを「スーパー」「サブ」と以下で呼びます。   ・インスタンスは"サブ"の型です。   ・上記インスタンスへの参照変数は"スーパー"のクラスの型です。   ・"スーパー"、"サブ"ともに【同名】の「クラス」変数/メソッド、「インスタンス」変数/メソッドがあります。 この場合に、"サブ"のインスタンスを参照している"スーパー"の型の変数を介し、それらにアクセスしたらどれが見えるか?という疑問です。 実験結果では以下のようになりました。           [フィールド]  [メソッド]   [1.static ]  スーパーの   スーパーの   [2.非static]  スーパーの   サブの 納得いかないのは「2.非static」で「フィールド」が、「スーパーの」になるところです。 これも「サブの」になると思っていました。 なぜサブクラスのが見えないのでしょうか? 同名の変数なのでスーパークラスのはサブクラスので隠れされ、サブクラスのが見えると思っていたのですが。 参考書には以下のように書いてありました。   フィールドの場合、参照変数の型のものが見える。   メソッドの場合、インスタンスの型のものが見える。 私には不自然に感じられるのですが、「こういう仕様だから。」と納得するしか無いのでしょうか? 「なぜこうなるか」について説明がある文献、サイトなどありましたらお教えください。 参考までに以下が実験したサンプルコードと結果です。長くて申し訳ありません。 「サンプルコード」 public class Super { static int staticField = 10; int instanceField = 100; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class Sub extends Super { static int staticField = 90; int instanceField = 900; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class TestStatic { public static void main(String[] args) { // インスタンスはSub、参照変数もSub、という状態。 Sub sub = new Sub(); System.out.println( "実験1" ); System.out.println( "1.クラス変数      " + sub.staticField ); System.out.print( "2.クラスメソッド    " ); sub.staticMethod(); System.out.println( "3.インスタンス変数   " + sub.instanceField ); System.out.print( "4.インスタンスメソッド " ); sub.instanceMethod(); // インスタンスはSub、参照変数はSuper、という状態。 Super sup = new Sub(); System.out.println( "実験2" ); System.out.println( "5.クラス変数      " + sup.staticField ); System.out.print( "6.クラスメソッド    " ); sup.staticMethod(); System.out.println( "7.インスタンス変数   " + sup.instanceField ); System.out.print( "8.インスタンスメソッド " ); sup.instanceMethod(); } } 「結果」 実験1 1.クラス変数      90 2.クラスメソッド    staticField = 90 3.インスタンス変数   900 4.インスタンスメソッド instanceField = 900 実験2 5.クラス変数      10 6.クラスメソッド    staticField = 10 7.インスタンス変数   100 8.インスタンスメソッド instanceField = 900 納得が行かないのは7のところです。 以上よろしくお願いいたします。

    • ベストアンサー
    • Java
  • javaのインスタンス変数とクラス変数の意味がわからない。

    かなり初心者です。全然意味がわかりません。教えてください。よろしくおねがいします。 この意味すべてわからないです。 public class TestCount{ static int counterA; int counterB; public static void main(String []args){ TestCount testA=new TestCount(); TestCount testB=new TestCount(); testA.count(); testB.count(); } public void count(){ for(int i=0;i<5;i++){ counterA++; counterB++; } System.out.println("counterA="+counterA); System.out.println("counterB="+counterB); } } 実行結果 counterA=5 counterA=5 counterB=10 counterB=5 なんでこうなるのかが知りたいです。

    • ベストアンサー
    • Java
  • 継承について

    以下のような問題(SJC-P試験)があり、 解説では考え方として ●メンバがフィールドなら「変数の型」 ●インスタンスメソッドなら「実際のオブジェクトの型」 ●クラスメソッドなら「変数の型」 とありました。 できればなぜこのような考え方(法則)になるか理解したいと思っています。 #当方、Javaプログラミング経験ゼロで、実際に下記のようなコーディングをするかどうかもわかりませんが、 #丸暗記だと実際のコーディングで使えそうにないので、できれば理解したいと思ってます。 下記問題は解説の考え方さえ丸暗記すれば解けるのかもしれませんが (なぜ解説のような考え方になるのか含め)教えていただけませんでしょうか。 ----- 【問題1】 class Super{  int d = 10;  void meth()System.out.println(d); } class Sub extends Super{  double d = 20.0;  void meth()System.out.println(d); } class Sample1{  public static void main(String[] args){  Super s = new Sub();  System.out.println(s.d);  s.meth(); } 【答え】 10 20.0 ----- 【問題2】 class Super{  static int d = 10;  static void meth()System.out.println(d); } class Sub extends Super{  static double d = 20.0;  static void meth()System.out.println(d); } class Sample2{  public static void main(String[] args){  Super s = new Sub();  System.out.println(s.d);  s.meth(); } 【答え】 10 10 ----- よろしくお願い致します。

    • ベストアンサー
    • Java
  • javaのローカル変数について

    基本的なことの質問ですがよろしくお願いいたします。 下記の様なソースコードでint y ;はローカル変数にあたると思いますが 確かローカル変数は初期化されないとコンパイルエラーになるはずなのですが どうもコンパイルも実行もできます。 どうしてでしょうか? よろしくお願いいたします。 class Test1{ static int x = 0; } public class Test extends Test1{ public static void main(String args[]){ Test i = new Test(); int y ; y = ++x; System.out.println( y ) ; } }

    • ベストアンサー
    • Java
  • 変数の初期値

    へんてこな質問かもしれません・・・ class Syokika{   public static void main(String args[]){     int[] a = new int[1];     System.out.println(a[0]);   } } を実行するとどうなるかという問題なのですが、 「変数が初期化されていない」 というエラーが出ると思っていたのですが、 答えは「0と表示される」でした・・・ で、解説を見ると、「配列が生成されるときに初期値が生成される。intの場合は0だ」と書いてありました。 でも、たんにint a;とした場合にaを参照しようとすると初期化されてないですよね・・・? これはどういうことなのでしょうか・・・?

    • ベストアンサー
    • Java
  • インスタンス変数へのアクセスについて

    理論的な質問ですが・・ public class pra extends JFrame{ JLabel myj; public pra(){ ~初期化 } public static void main(String args[]){ pra p=new pra(); p.myj.setText("ready"); *1 p.jlset(); } private void jlset(){ myj.setText("go"); *2 } } *1では変数myjにアクセスするのに、オブジェクト参照 変数p が必要ですが、*2では、必要ありません。 この違いがよくわかりません。理屈では*2でもpを つけるべきだと思いますが(p.myj)、これをつけると エラーになってしまいます。 なにかアドバイスお願いします。

    • ベストアンサー
    • Java
  • Java 型指定を伴わないインスタンスの作成?

    問題集で以下のプログラム(一部)を見かけました。 class Test{ public static void main(String args[]){ new Animal("A"); } } Animalクラスのインスタンスを作成しているということなのですが、 これまでであれば、 Animal a = new Animal(); というようにイコールの左で インスタンスの型と変数を指定する形で学んで来ました。 型や変数を指定しないでインスタンスの作成をすることが できるのですか? 回答をお願いします。

    • ベストアンサー
    • Java
  • 参照・値渡しについて

    下記プログラム(ソース1)を実行すると「1」という値が出力されます。しかし、2行目をprivate static int a;とすると「0」という値が出力されます。 オブジェクトは参照渡しで基本データ型は値渡しと思ったのですが、2行目の値をString型で行ったところ全く変更されていない値が出力されました。(ソース2) 一体どういうことでしょうか? 回答のほどよろしくお願い致します。 (ソース1) public class X{ private static int a[] = new int[1]; public static void main(String []args){ modify(a); System.out.println(a[0]); } public static void modify(int a[]){ a[0]++; } } (ソース2) public class X{ static String a = "a"; public static void main(String []args){ modify(a); System.out.println(a); } public static void modify(String a){ a = "b"; } }

    • ベストアンサー
    • Java
  • JAVAコンストラクタについて

    JAVA のコンストラクタ定義の際に、下記のようにコンストラクタにvoidを付けた時と付けない時の処理結果が変わるのはなぜでしょうか。 (1) class O { protected int d; O(){ System.out.println("O = " + d); } } class Study_6_3main_void { public static void main(String args[]) { int i = 1; O OO = new O(); System.out.println("O = "); } } (2) class O { protected int d; void O(){ System.out.println("O = " + d); } } class Study_6_3main_void { public static void main(String args[]) { int i = 1; O OO = new O(); System.out.println("O = "); } } 実行結果 (1) O = 0 O = (2) O = 以上です。回答の程よろしくおねがいします。

    • ベストアンサー
    • Java
  • コンストラクタ内で定義したインスタンスの呼び出し。

    以下のようなソースを書いてみたのですが、 コンストラクタで定義したインスタンスehogeを set_vのところで使おうとすると”ehogeを解決できません” というエラーが出てしまいます。 初歩的な質問ですが、 ehogeをコンストラクタ外でも使えるようにするにはどうすればいいのでしょうか? public class sample { void sample(){ hoge ehoge=new hoge(); } public static void main(String[] args) { } void set_v(){ int num=ehoge.value(); } } class hoge{ int value=1; }

    • ベストアンサー
    • Java

専門家に質問してみよう