Java 为什么object1等于方法的调用实例而不是声明对象类型
为什么object1等于方法的调用实例而不是声明对象类型 我已经写了下面的代码。与Java 为什么object1等于方法的调用实例而不是声明对象类型,java,Java,为什么object1等于方法的调用实例而不是声明对象类型 我已经写了下面的代码。与相等对象的混淆 public class TestEqual { @Override public boolean equals(Object obj) { return true; } public static void main(String[] args) { TestEqual test1
相等对象的混淆
public class TestEqual {
@Override
public boolean equals(Object obj) {
return true;
}
public static void main(String[] args) {
TestEqual test1=new TestEqual();
TestEqual test2=new TestEqual();
if(test1.equals(test2))
{
System.out.println("EQUAL");
}
Object object1=new TestEqual();
Object object2=new TestEqual();
if(object1.equals(object2))
{
System.out.println("EQUAL object");
}
}
}
输出:
EQUAL
EQUAL object
这是因为您在
TestEqual
中重写了equals()
方法
Object object1=new TestEqual();
由于equals()
(属于对象的类)在TestEqual
中,因此即使object1
也会调用它
如果您对该语句有疑问,objectobject2=newtestequal()
,这是因为,即使引用类型为Object
,分配给引用的实际实例仅为TestEqual()
,因此调用TestEqual
的equals()
如果您想调用对象
类的equals()
方法,您可以尝试以下方法
Object object3=new Object();
if(object3.equals(object2)) {
System.out.println("EQUAL 1 object"); // this won't get printed.
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
return true;
}
这是正确的行为,也是继承的工作方式。要了解它的工作原理,请阅读您的equals(objectobj
)方法需要如下
Object object3=new Object();
if(object3.equals(object2)) {
System.out.println("EQUAL 1 object"); // this won't get printed.
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
return true;
}
默认情况下,java中的所有方法都是虚拟的。因此,它们是在运行时确定的。
当您在类中重写了equals方法时,编译器会看到对象类有一个equals方法,因此它可以很好地编译。但在运行时,它看到对象类引用引用的是TestEqual类对象,因此它调用TestEqual类的equals方法
这种行为在java中称为动态多态性。请记住,实例方法的调用基于“对象”的类型,而不是对象的“引用”类型。就你而言
TestEqual test1=new TestEqual();
TestEqual test2=new TestEqual();
及
正在创建TestEqual类的实例。因此,只调用对象(而不是引用)的equals()方法。现在,由于对象是相同的,因此被调用的方法也将是相同的。为什么它引用对象的相等方法的TestEqual方法instad?“默认情况下”意味着有一种方法可以更改此行为;没有。实例方法在Java中总是虚拟的。(静态方法从来都不是。)