Java 类对象的等于()和==

Java 类对象的等于()和==,java,Java,我有一节模拟课。主p和pp中的两个对象都通过了=和等于测试。在以下情况下,两项测试均通过: p = PacketType.None; pp = PacketType.None; 两个都不打印任何东西以防万一 p = PacketType.StartOfOperation; pp = PacketType.None; 方法等于和运算符==中实际调用的是什么?我认为==不应该是pas,因为它必须查看这些对象是否具有相同的指针。换句话说,它应该看起来是同一个对象(在我们的例子中不是) 他们有

我有一节模拟课。主p和pp中的两个对象都通过了
=
等于
测试。在以下情况下,两项测试均通过:

p = PacketType.None; 
pp = PacketType.None; 
两个都不打印任何东西以防万一

p = PacketType.StartOfOperation; 
pp = PacketType.None;
方法
等于
和运算符
==
中实际调用的是什么?我认为
==
不应该是pas,因为它必须查看这些对象是否具有相同的指针。换句话说,它应该看起来是同一个对象(在我们的例子中不是)


他们有点不同

equals()
方法出现在
java.lang.Object
类中,它应该检查对象状态的等价性。也就是说,对象的内容。然而,
=
操作符需要检查实际对象实例是否相同

另一个区别是可以重写
equals()
方法。这样,你可以改变它,让它像你所希望的那样

==不应pas,因为它必须查看这些对象是否具有相同的指针

如果两个引用指向同一内存对象,则==将通过

equals()
如果未被覆盖,也将通过,因为equals的默认实现还将使用
==
检查内存对象的相等性。
作为一个好的实践,我们应该重写equals,以便自定义类实际比较两个对象的属性。如果所有属性都相等,则逻辑上两个对象相等。

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

一个很好的例子是
String
当人们试图检查字符串是否相等时,通常会错误地使用
=
而不是
.equals(对象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)

可以找到
equals(Object o)
方法的完整解释,我找不到相等运算符
=
(是模糊的,指的是原语而不是对象)。

完全可以预期
无!=StartOfOperation
并且,由于您没有重写
equals
,因此您的类从
对象
类继承它,该类的实现是

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

正如您所看到的,这与您没有覆盖
等于
的检查完全相同,在这种情况下,
等于
的默认值将是
=

类对象的equals方法实现了对象上最有区别的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象(x==y的值为true)时,此方法才返回true


==始终用于检查引用的相等性,但等于()用于检查引用所指向的值。
阅读字符串类以深入理解它。(字符串池)

请。。请阅读命名约定。您不必使用“枚举模拟”类,Java使用混合大小写,变量以小写开头。
public boolean equals(Object o) { return this == o; }