我有枚举仿真类。主p和pp中的两个对象都通过了==equals测试。两种测试均通过,以防万一

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


两者都不打印任何内容

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


在方法equals和运算符==中实际上调用了什么?我认为==不应粘贴,因为必须查看那些对象是否具有相同的指针。换句话说,它应该看起来是同一对象(在我们的情况下不是)。

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");
        }
    }
}

最佳答案

与对象一起使用==来测试它们是否是对同一对象实例的引用。应该使用.equals(Object o)来检查它们是否具有相等的值(但是必须在自定义对象中手动实现此行为,否则默认为==行为)。

一个很好的例子是使用String时,人们通常会在尝试检查字符串是否等效时犯下在==上使用.equals(Object o)的错误。

String a = "my string";
String b = "my string";
String c = a;
//Each of these should then evaluate to true
a==c
b!=c
a.equals(b)
b.equals(c)


可以在here中找到对equals(Object o)方法的完整解释,我找不到等于运算符==的等效项(This one含糊不清,是指基元而不是对象)。

10-08 02:50
查看更多