Java代入演算子の実行
2023-09-11 08:22:33
質問
Javaでは、代入は右オペランドの値で評価されると理解しているので、次のようなステートメントがあります。
x == (y = x)
は次のように評価されます。
true
.
しかし、このコードでは
false
.
public static void main(String[]args){
String x = "hello";
String y = "goodbye";
System.out.println(x.equals(x = y));
}
これはなぜでしょうか?私の理解では、最初に評価されるのは
(x = y)
を評価し、それが
x
の値を
y
の値を返し、次に
y
. 次に
x.equals(y)
が評価され、本来なら
true
であるべきなので
x
であり
y
は同じ参照を共有するはずなのですが、その代わりに
false
.
ここで何が起こっているのでしょうか?
どのように解決するのですか?
まず第一に、それは興味深い質問ですが、quot;実際のコード"では決して出てこないはずです。まさに同じ行で呼び出した変数に代入すると、それがどのように機能するかを知っていても混乱します。
ここで起こることは、以下の3つのステップです。
-
どのオブジェクトに対してメソッドを呼び出すかを決定する (つまり、最初の
x
を評価し、その結果、文字列 "hello" への参照が得られます)。 -
パラメータを把握する(例えば
x = y
を評価し、それによってx
を文字列 "goodbye" を指すように変更し、その文字列への参照も返します) -
メソッドを呼び出す
equals
を呼び出します(それぞれ文字列 "hello" と "goodbye" への参照となります)。
そのメソッドのために生成されたバイトコードを見てみると、(あなたがJavaバイトコードに堪能であると仮定して)明らかになります。
0: ldc #2 // String hello
2: astore_1
3: ldc #3 // String goodbye
5: astore_2
6: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
9: aload_1
10: aload_2
11: dup
12: astore_1
13: invokevirtual #5 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
16: invokevirtual #6 // Method java/io/PrintStream.println:(Z)V
19: return
9行目は、上記のステップ1(すなわち
x
を評価し、その値を記憶しています)。
10-12行目がステップ2です。これは
y
をロードし、それを複製して (一度は代入、一度は代入式の戻り値)、それを
x
.
13行目では
equals
を呼び出します。
関連
-
Eclipseは、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
Java の switch case 文で必要な定数式の問題の解決法
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み】なぜJavaの+=, -=, *=, /=複合代入演算子はキャスティングを必要としないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
mvn' は、内部または外部のコマンド、操作可能なプログラムまたはバッチファイルとして認識されません。
-
Eclipse の問題 アクセス制限。タイプ 'jfxrt' はAPI解決されていません。
-
アクセス制限です。タイプ 'JPEGCodec' は API ではない ☞My Blog Github ☜ ホームページを見る
-
名前 'XXX' を持つ Bean の作成に失敗しました。自動依存関係の注入に失敗しました 解決方法
-
無効な文字定数
-
java -jarコマンドでパッケージを実行すると、無効または破損したjarfile xxxx.jarが表示される。
-
List list = new ArrayList(); Error: ArrayList は型に解決できません。
-
春ブート複数のデータソースの管理(atomikos)同じサーバーホスト上の複数のプロジェクトを開始する複数のJava - jarのエラーソリューション
-
java 365*1000*60*60*24 計算問題
-
switch case文のcaseの後の列挙定数は列挙型なし