[解決済み] なぜJavaには演算子のオーバーローディングがないのですか?
質問
C++からJavaに移ってきて、明らかに答えのない疑問は、なぜJavaには演算子のオーバーローディングがなかったのか、ということです。
はないでしょうか。
Complex a, b, c; a = b + c;
よりもはるかにシンプルです。
Complex a, b, c; a = b.add(c);
?
の有効な引数、既知の理由はあるのでしょうか? ではなく 演算子のオーバーロードを許可していますか?その理由は恣意的なものなのか、それとも時間の経過とともに失われたものなのでしょうか?
解決方法は?
で参照されているオブジェクトの以前の値を上書きしたいと仮定します。
a
その場合、メンバ関数を呼び出す必要があります。
Complex a, b, c;
// ...
a = b.add(c);
C++では、この式はコンパイラに、スタック上に3つのオブジェクトを作成し、加算を実行し
コピー
その結果、一時的なオブジェクトから既存のオブジェクトに値が移動します。
a
.
しかし、Javaでは
operator=
は参照型に対して値のコピーを実行しません。また、ユーザーが作成できるのは新しい参照型だけで、値型は作成できません。そのため、ユーザー定義型の
Complex
というのは、代入とは、既存の値への参照をコピーすることだからです。
代わりに考えてみましょう。
b.set(1, 0); // initialize to real number '1'
a = b;
b.set(2, 0);
assert( !a.equals(b) ); // this assertion will fail
C++では、これは値をコピーするので、比較の結果はnot-equalとなる。Javaでは
operator=
は参照コピーを行うので
a
と
b
は同じ値を参照するようになりました。その結果、オブジェクトはそれ自身と等しく比較されるため、比較は「等しい」を生成します。
コピーと参照の違いは、演算子のオーバーロードの混乱に拍車をかけるだけです。セバスチャンが言ったように、JavaとC#は値の等価性と参照の等価性を別々に扱わなければならない --。
operator+
は値やオブジェクトを扱うと思われますが
operator=
は、参照を扱うためにすでに実装されています。
C++では、一度に一種類の比較しか扱わない方が混乱が少なくて済みます。例えば
Complex
,
operator=
と
operator==
はどちらも値に関する作業で、それぞれ値のコピーと値の比較を行っています。
関連
-
Java Exceptionが発生しました エラー解決
-
アクセス制限です。タイプ 'Application' は API ではありません。
-
Eclipseで "XXXX "の解決策を(型に)解決することができない
-
java 例外。Javaツールの初期化
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み】なぜ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 実装 サイバーパンク風ボタン
おすすめ
-
スレッド "main "での例外をEclipseで解決 java.lang.Error: 未解決のコンパイル問題、コンパイラとパッケージの不整合
-
SpringBootApplication を型解決できない。
-
JavaMailのメール送信が失敗するケースとその説明の分析
-
Intellij IDEAのエラー「CreateProcess error=2, system could not find specified file」に対する完璧な解決策です。
-
マスキング このリソースにアクセスするには、完全な認証が必要です。
-
javaコンパイル時のエラー:不正な文字 '\ufeff' に対する解決策です。
-
Eclipse起動エラー:javaは起動したが、終了コード=1を返した(ネット上の様々な落とし穴)
-
Error: java.lang.NoClassDefFoundError: クラス XXXX を初期化できませんでした
-
[解決済み] ArrayListの初期化を1行で行う。
-
[解決済み] Javaにおける演算子のオーバーローディング