Integerクラスの参照渡しを正しく行うには?
2023-09-28 05:49:16
質問
私は、誰かが私のためにここで起こっていることを明確にできることを期待しています。 整数クラスで少し調べてみましたが、整数は
をオーバーライドしているため
は
+
演算子をオーバーライドしても、何が間違っているのか分かりませんでした。 私の問題は、この行にあります。
Integer i = 0;
i = i + 1; // ← I think that this is somehow creating a new object!
以下は私の推論です。 私はjavaが値渡しであることを知っています( または参照の値で渡す ) であることを知っているので、次の例では、整数オブジェクトは毎回インクリメントされるべきだと思うのです。
public class PassByReference {
public static Integer inc(Integer i) {
i = i+1; // I think that this must be **sneakally** creating a new integer...
System.out.println("Inc: "+i);
return i;
}
public static void main(String[] args) {
Integer integer = new Integer(0);
for (int i =0; i<10; i++){
inc(integer);
System.out.println("main: "+integer);
}
}
}
これは私が期待する出力です。
株式会社: 1 main: 1 Inc: 2 メイン:2 株式会社:3 メイン 3 株式会社: 4 メイン 4 インク:5 メイン 5 インク:6 メイン:6 ...
これが実際の出力です。
株式会社: 1 main: 0 株式会社: 1 メイン 0 株式会社: 1 メイン 0 ...
なぜこのような挙動になるのでしょうか?
どのように解決するのですか?
2つの問題があります。
- Integerは参照ではなく値で渡される。メソッド内部で参照を変更しても、呼び出し側のメソッドで渡された参照には反映されません。
-
Integerはimmutableです。のようなメソッドはありません。
Integer#set(i)
. そうでなければ、それを利用すればいいのです。
これを動作させるためには、返り値を再代入する必要があります。
inc()
メソッドの戻り値を再割り当てする必要があります。
integer = inc(integer);
値で渡すことについてもう少し学ぶために、別の例を示します。
public static void main(String... args) {
String[] strings = new String[] { "foo", "bar" };
changeReference(strings);
System.out.println(Arrays.toString(strings)); // still [foo, bar]
changeValue(strings);
System.out.println(Arrays.toString(strings)); // [foo, foo]
}
public static void changeReference(String[] strings) {
strings = new String[] { "foo", "foo" };
}
public static void changeValue(String[] strings) {
strings[1] = "foo";
}
関連
-
型に解決できない エラー解決
-
unsigned char* から const jbyte* {aka const signed char*} への変換が無効です。
-
[解決済み] android.os.NetworkOnMainThreadException' を修正するにはどうすればよいですか?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] 変数を参照渡しする方法を教えてください。
-
[解決済み] プライベートメソッド、フィールド、インナークラスを持つクラスをテストするにはどうすればよいですか?
-
[解決済み] Mavenを使用して、依存関係を持つ実行可能なJARを作成するにはどうすればよいですか?
-
[解決済み] JavaScriptで文字列を整数に変換する方法は?
-
[解決済み] 整数の左側にゼロを埋め込むにはどうしたらいいですか?
-
[解決済み】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 実装 サイバーパンク風ボタン
おすすめ
-
Eclipseは、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
アクセス制限です。タイプ 'Application' は API ではない(必要なライブラリに制限がある)。
-
Collections.sortがdoubleでソートできない問題を完璧に解決する。
-
ajax コミット リソースの読み込みに失敗しました: サーバーはステータス 400 で応答しました ()
-
JAVA_HOME環境変数が正しく定義されていない問題を解決する
-
Javaジェネリックを1つの記事で
-
API の戻り値を処理するために ResponseEntity を使用する
-
eclipse 実行 Java、エラー: 選択を起動できず、レシーバーもありません。
-
ApiModel と @ApiModelProperty の使用法
-
[解決済み] JavaにはInteger, Float, Double, LongのMutable型がありますか?