質問: h2){ System.out.println("同じ内容です"); }else{ System.out.println("違う内容です"); //以下Heroクラス public class Hero { String name; int hp; } 【出力結果】 違う内容です 違う内容です ### 補足情報(言語/FW/ツール等のバージョンなど) ネットなどで確認する限りだと、 「==」はクラスに代入された値が同じであればtrueを表示。 「epuals」はメモリ上の保存位置まで同じであればtrueを表示。 と書いてあるように認識しました。 2つのインスタンスを使っているので、下がfalseになるのは分かるのですが、 全く同じ内容の上がfalseになるのはなぜでしょうか。 初歩的な内容で恐れ入りますが、ご教示頂けますでしょうか。
回答: まだ回答を理解していないようですね。 まず基本的な話として、Javaにおいてはint,longなどのプリミティブ型以外はすべて参照型です。 参照型の変数にはその実体のオブジェクトが置かれている場所を示す値(参照値)が代入され、その値を使って実体にアクセスします。 以下はこれを理解した上で読んで下さい。 まず`==`は、**両辺の変数が同じオブジェクトを指し示しているかどうかを判定する**演算子です。内容がどうとかは全く判定しません。最も、同じオブジェクトを指していれば必然的に中身も同じですが。 newすると使えないわけではありません。ただし、そのnewしたオブジェクトと同じものを指す変数がほとんどの状況において存在しえないので、だいたいfalseになります。 equalsメソッドは、**自分と引数として渡されたオブジェクトが「同じ」であるかどうかを判定する**ためのメソッドです。**何をもって「同じ」とするかはクラスの設計者が決める必要があります。**何も設計しなければ`==`での比較と全く同じ効果になります。設計に応じて、equalsメソッドをオーバーライドすることで、希望通りの比較ができるようになるのです。 例として出されたコードでは、2つのHeroオブジェクトを作り、名前をともに"ミナト"に設定し、HPを100に設定しました。しかしあくまで**これらのHeroは別個のオブジェクト**です。別々のHeroに、同じ名前、同じHPを設定しただけで、別のものなのです。なので`==`での比較もfalseになるし、「同じ」の定義を`==`と一緒にしているequalsメソッドでもfalseになるのです。