Javaプログラムの実行結果は?

このQ&Aのポイント
  • Javaのプログラムの実行結果が分からない方へ。インスタンスの操作によって変数がどのように変化するかを解説。
  • 「false true」ではなく「false false」となる理由について解説します。
  • 変数の参照を理解していないと、意図しない結果になることがあります。詳しくはこちら。
回答を見る
  • ベストアンサー

Javaのプログラムがどうしても分かりません。

public class Test { public static void main(String[] args) { Test ojb1 = new Test(); Test ojb2 = new Test(); System.out.print(ojb1 == ojb2); ojb2 = operate(ojb1, ojb2); System.out.print(" " + (ojb1 == ojb2)); } static Test operate(Test ojb1, Test ojb2) { Test ojb3 = ojb1; ojb1 = ojb2; return ojb3; } } 実行すると「false true」となります。 しかし私は「false false」だと思うのですが、どこが間違っているかが分かりません。 最終的に変数obj2とobj3は、最初に生成されたインスタンスTestを指し示し、 変数obj1は2番めに生成されたインスタンスTestを指すのだと思うのです。 よろしくお願い致します。

  • Java
  • 回答数3
  • ありがとう数14

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

  • ベストアンサー
  • Ogre7077
  • ベストアンサー率65% (170/258)
回答No.3

メソッド内部の引数や変数は、外部の変数とはまったくの別物です。 たとえ同じ名前であっても混同されることはありません。 というわけで、静的メソッド operate の挙動は 「引数を二つ取り、最初の引数の中身を返す」 以外の何者でもありませんので、 以下の二つは同じ意味になります。 ojb2 = operate(ojb1, ojb2); ojb2 = ojb1; なので ojb1 == ojb2 // 両方とも最初に生成されたインスタンスなので true

taro_11
質問者

お礼

回答ありがとうございます。 要点を簡潔に解説して頂き、とても分かりやすかったです。

その他の回答 (2)

回答No.2

operate内で、 ojb1 = ojb2 ・・・つまり、ojb1の参照はojb2と同一を見るように変更された。 return ojb3 ・・・呼び元のojb2は、ojb3になる。 という流れから、returnされた時点で、ojb1 = ojb3 = ojb2でしょう。 そもそも先述したとおり、ojb1はojb2と同じアドレスを参照していますから、 return値をojb2で受け取った瞬間、ojb1もojb3になります。 ojb3は、元々呼び元でインスタンス化されたojb1です。 例えばこんなロジックで確認してみては。 public class Test { public String hoge = ""; public static void main(String[] args) { Test ojb1 = new Test(); ojb1.hoge = "1"; Test ojb2 = new Test(); ojb2.hoge = "2"; System.out.println((ojb1 == ojb2) +", ojb1.hoge=" + ojb1.hoge + ", ojb2.hoge=" + ojb2.hoge); ojb2 = operate(ojb1, ojb2); System.out.println(" " + (ojb1 == ojb2) + ", ojb1.hoge=" + ojb1.hoge + ", ojb2.hoge=" + ojb2.hoge); } static Test operate(Test ojb1, Test ojb2) { System.out.println("--------in operate--------"); Test ojb3 = ojb1; ojb3.hoge = "3"; System.out.println("<<before>>"); System.out.println("ojb1.hoge=" + ojb1.hoge); System.out.println("ojb2.hoge=" + ojb2.hoge); System.out.println("ojb3.hoge=" + ojb3.hoge); ojb1 = ojb2; System.out.println("<<after>>"); System.out.println("ojb1.hoge=" + ojb1.hoge); System.out.println("ojb2.hoge=" + ojb2.hoge); System.out.println("ojb3.hoge=" + ojb3.hoge); System.out.println("--------out operate--------"); return ojb3; } }

taro_11
質問者

お礼

回答ありがとうございます。 具体的な例まで挙げて頂き、より深く理解できるようになりました。

  • teketon
  • ベストアンサー率65% (141/215)
回答No.1

>ojb2 = operate(ojb1, ojb2); >最終的に変数obj2とobj3は、最初に生成されたインスタンスTestを指し示し、 ここまであってます。 >System.out.print(" " + (ojb1 == ojb2)); >変数obj1は2番めに生成されたインスタンスTestを指すのだと思うのです。 ここはあっていません。オブジェクトをメソッドの引数にすると、参照渡しになります。 ですから、operateメソッド内で >ojb1 = ojb2; してもmainメソッドには反映されません。

taro_11
質問者

お礼

回答ありがとうございます。 基礎的な概念が理解不足でした。

関連するQ&A

  • javaの質問です。

    明日JavaのBronze試験を受けに行くのですが、全然わからずに困っています。 紫色のJavaプログラマBronzr[SE7]という本を使用しています。 本の模試の問題です。 37 Class Super{ static void method(){ System.out.println("Super"); } } Class Sub extends Super{ static void method(){ System.out.println("Sub"); } } Class Test { public static void main(String[] args){ Super obj = new Sub(); obj.method(); } } この問題はSuperが表示されるらしいのですが、理由がわかりません。 サブクラスをインスタンス化しているので、Subが表示されるというのなら理解できます。staticが関係あるのはなんとなくわかるのですが、、、、、、なぜSuperなのかがわかりません。 解答ではスーパークラスの型にサブクラスを入れているからと簡単に書いてあります。 詳しく説明していただけると助かります。

    • ベストアンサー
    • Java
  • Javaのプログラムについて教えてください。

    class SampleA implements Runnable { int tmp1 = 0; int tmp2 = 0; public synchronized void run(){ try{ if(tmp1 == 1){ System.out.print("は"); System.out.print("め"); else if (tmp1 == 2){ System.out.print("じ"); System.out.print("て");          } if(tmp2 == 0) tmp2 = tmp2 + 1; System.out.print("ま"); } System.out.print("。"); }catch(InterrupedException e){ System.out.print("し"); } } } //Sample2.java class Sample2{ public static void main(String[] args){ Sample1 sp = new Sample1(); Thread th1 = new Thread(sp); Thread th2 = new Thread(sp); th1.start(); th2.start(); } } wait(),notify(),throwを使って例外を生じさせるところまではわかったのですが このプログラムを「はじめまして。」と順番に出力するにはどうすればいいですか?

  • javaプログラム 合ってるかお願いします

    プログラムは非常に苦手なため合ってないと思いますが、合ってないのは何が正解かを教えてください。 よろしくお願いします 1 ローカル変数を全て答えよ args,num 2 インスタンス変数を全て答えよ num 3 インスタンスメソッド名を答えよ Example2 4インスタンスメソッドを呼び出している行 public class Example2{ int num; public static viod main(String[] args){ Example2 ex2 = new Example2(5); int a = ex2.getNum(); System.out.println(a); } Example2(int num){ this.num=num; } int getNum(){ return this.num; } }

    • ベストアンサー
    • Java
  • 下記のようなjavaのプログラムで、* や / を入力しても,

    下記のようなjavaのプログラムで、* や / を入力しても, 必ず判定がfalseのほうになるんですけど、どうすれば良いですか? あまりjavaには詳しくないので、分かりやすく教えていただければ幸いです。お願いします。 import java.io.*; public class test{ public static void main(String[] args) throws IOException{ BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); String a; a = input.readLine(); if((a == "*") ^ (a == "/")){ System.out.println("OK"); }else{ System.out.println("エラー"); } } }

    • ベストアンサー
    • Java
  • javaの質問です 合ってるかをお願いします

    間違ってる場合は何が正解かを教えてください。 よろしくお願いします 1 変数strには何が入っているか test 2 dataとstrの関係 わからないです。 public class Example5 { public static void main( String[] args ) { String data = "test."; hyouji( data ); } static void hyouji( String str ) { System.out.println( str ); } }

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

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

    • ベストアンサー
    • Java
  • javaのプログラムについての質問です。

    /* * 引数、パラメータ、戻り値を使用して * SubTest19クラスでフィールド変数を使用しないよう、 * 修正して下さい。 * * * また、SubTest19クラスのput()で行っている出力はfor文を使用する事。 * */ class Test19 {   public static void main(String[] args) {   // SubTest19クラスのインスタンス化   SubTest19 st19 = new SubTest19();   // setメソッド呼び出し:戻り値&引数無し   st19.set();   // putメソッド呼び出し:戻り値&引数無し   st19.put();   } } // SubTest19クラス class SubTest19 {   public Test19data t19d[] = null;       // setメソッド    public void set(){     t19d = new Test19data[3];     t19d[0] = new Test19data();     t19d[1] = new Test19data();     t19d[2] = new Test19data();     t19d[0].px = "K-0963";     t19d[0].ct = 23;     t19d[1].px = "T-523363";     t19d[1].ct = 517;     t19d[2].px = "J-97553";     t19d[2].ct = 5;   }     // putメソッド   public void put(){      System.out.println(t19d[0].px);     System.out.println(t19d[0].ct);     System.out.println(t19d[1].px);     System.out.println(t19d[1].ct);     System.out.println(t19d[2].px);     System.out.println(t19d[2].ct);   } } class Test19data{   // フィールド変数の宣言:String,int    public String px;    public int ct;    public Test19data(){       px = "";      ct = 0;    } } このような問題なのですが、どうしても出来ずに手詰まり状態です。丸投げで非常に申し訳ないのですが、どなたか途中までコードを書いて頂けないでしょうか?よろしくお願い致します。

  • 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
  • 動的に変数をセット後他クラスから参照する場合

    コンストラクタで変数にセットした後 他のクラスでインスタンスを生成することなく セットした変数を参照したいのですが、 staticにすると、他クラスで変数を変更することも できてしまいます。他の方法がありますでしょうか? 変数はprivateにして、getterで取得するという方法も 考えられますが、static finalな変数として扱う方法が あるか、お分かりの方いらっしゃいましたら教えてください。 Javaを初めて1ヶ月なので、見当違いの質問でしたらご指摘ください。 例) Class A{  static final String aaa; A(String paraStr){ aaa = paraStr; } } Class B{ static void main(String[] args){ new A("test"); } } Class C{ void chStr(){ System.out.println(A.aaa); A.aaa = "changeStr" System.out.println(A.aaa); } } 期待する値 test test もしくは、実行時にfinalの値は変更できない等のException 宜しくお願いします。

    • ベストアンサー
    • Java
  • javaプログラムについて

    mainメソッド内の指定された部分の処理を、 別のメソッドに分けてください。 mainメソッド内から作成した別メソッドを呼び出して 実行できるようにしてください。 ※分ける前と分けた後で処理結果が変わらないこと (入力された文字が"A"の場合true, それ以外の場合falseを返すように) */ class MethodAdd1{ public static void main(String[] args){ /* // ★ここから if("A".equals(args[0])){ judge = true; }else{ judge = false; } // ★ここまで */ boolean judge; if("A".equals(args[0])){ System.out.println("true"); }else{ System.out.println("false"); } } /* **戻り値:boolean **引数:String */ //ここにメソッドを作成 public static boolean equals(String a){ String str="A"; if("A".equals(str)){ return true; }else{ return false; } } } これで一応trueかfalseと表示されるのですが、合っているのか分かりません。 お時間のある方で、手直しをして頂ける方お願い致します。