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を指すのだと思うのです。
よろしくお願い致します。
No.3ベストアンサー
- 回答日時:
メソッド内部の引数や変数は、外部の変数とはまったくの別物です。
たとえ同じ名前であっても混同されることはありません。
というわけで、静的メソッド operate の挙動は
「引数を二つ取り、最初の引数の中身を返す」
以外の何者でもありませんので、
以下の二つは同じ意味になります。
ojb2 = operate(ojb1, ojb2);
ojb2 = ojb1;
なので
ojb1 == ojb2 // 両方とも最初に生成されたインスタンスなので true
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;
}
}
No.1
- 回答日時:
>ojb2 = operate(ojb1, ojb2);
>最終的に変数obj2とobj3は、最初に生成されたインスタンスTestを指し示し、
ここまであってます。
>System.out.print(" " + (ojb1 == ojb2));
>変数obj1は2番めに生成されたインスタンスTestを指すのだと思うのです。
ここはあっていません。オブジェクトをメソッドの引数にすると、参照渡しになります。
ですから、operateメソッド内で
>ojb1 = ojb2;
してもmainメソッドには反映されません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java final 1 2022/06/10 22:49
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- PHP $_SESSIONについて教えて下さい。 2 2023/03/02 09:18
- ドライブ・ストレージ HDDのチェック方法 6 2022/05/04 09:49
- Excel(エクセル) VBA ワークシート指定の1行目を選択をしたい 2 2022/08/20 18:10
- その他(学校・勉強) Japanese schools tests 1 2022/08/19 14:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインターに関する警告
-
[JAVA]try 内の変数を外で!?
-
JSPやサーブレットでSystem.out...
-
JAVAのDouble型の小数点以下の...
-
構文解析中にファイルの終わり...
-
java教えてください。
-
EclipseでJava
-
「続行するには何かキーを押し...
-
IPアドレスから組織やプロバイ...
-
曜日の取得方法を教えて下さい!
-
JAVAのエラーの意味が分かりま...
-
改行の判定方法
-
ファイル名に変数を使う(Java)
-
JAVA 三角形の判定
-
DOMで要素の値がNULL
-
データベースに接続できません。
-
JAVA 文字色変更
-
java int integer
-
掛け算九九の表示の仕方。
-
LC発振回路-ループ利得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
[JAVA]try 内の変数を外で!?
-
JSPやサーブレットでSystem.out...
-
C言語のポインターに関する警告
-
改行の判定方法
-
EclipseでJava
-
JAVAのDouble型の小数点以下の...
-
Javaでカレントディレクトリを...
-
文字列の引き算
-
JAVA 文字色変更
-
Javaのプログラムがどうしても...
-
エクセルマクロ文で、赤文字セ...
-
java シンボルが見つかりません...
-
java int integer
-
配列を後ろから数えるには?
-
java.util.zipで作成したアーカ...
-
JAVAのエラーの意味が分かりま...
-
会員情報登録プログラムの作成...
-
nullcline
-
コマンドプロンプトでひらがな...
-
NaNではなく、0と表示させたい
おすすめ情報