1

私は列挙エミュレーションクラスを持っています。メインの p と pp の両方のオブジェクトが合格==し、equalsテストされています。次の場合、両方のテストに合格します。

p = PacketType.None; 
pp = PacketType.None; 

場合に備えて、両方とも何も出力しません

p = PacketType.StartOfOperation; 
pp = PacketType.None;

equalsmethodと operatorで実際に呼び出されるのは何==ですか? ==それらのオブジェクトが同じポインターを持っているかどうかを確認する必要があるため、それはパスすべきではないと思います。言い換えると、同じオブジェクトに見えるはずです (この場合はそうではありません)。

public class PacketType {

    String Name = "9";

    public static final PacketType None = new PacketType("9");
    public static final PacketType StartOfOperation = new PacketType("1");

    PacketType(String Name) {
        this.Name = Name;
    }

    public String toString() {
        return Name;
    }

    public static void main(String[] args) {

        PacketType p = PacketType.None;

        PacketType pp = PacketType.StartOfOperation;

        if (p == pp) {
            System.out.print("==");
        }

        if (p.equals(pp)) {
            System.out.print("equals");
        }
    }
}
4

7 に答える 7

1

しませんでしoverride equalsた。この場合、のデフォルトはequalsになります==

于 2013-08-13T09:12:11.140 に答える
0

None != StartOfOperationオーバーライドしていないためequals、クラスはそれをクラスから継承しObject、その実装は

public boolean equals(Object o) { return this == o; }

ご覧のとおり、これは とまったく同じチェックです==

于 2013-08-13T09:12:04.817 に答える
0

equls のドキュメントが表示された場合

クラス Object の equals メソッドは、オブジェクトに対して最も識別可能な等価関係を実装します。つまり、null 以外の参照値 x と y の場合、このメソッドは、x と y が同じオブジェクトを参照している (x == y の値が true である) 場合にのみ true を返します。

于 2013-08-13T09:13:45.053 に答える
0

== は常に参照の等価性をチェックするために使用しますが、equals() は参照が指す値をチェックするために使用します。Stringクラスを読んで深く理解する(String Pool)

于 2013-08-13T09:13:53.247 に答える