为什么object1等于方法的调用实例而不是声明对象类型
我在下面写了代码。用EQUAL object
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
答案 0 :(得分:1)
那是因为您已覆盖equals()
中的TestEqual
方法。
Object object1=new TestEqual();
由于equals()
中的Object
TestEqual
类object1
Object object2=new TestEqual();
,Object
即使TestEqual()
也会调用它。
如果您对此声明equals()
有疑问,那么这是因为,即使引用的类型为TestEqual
,分配给引用的实际实例也是Object
只有equals()
Object object3=new Object();
if(object3.equals(object2)) {
System.out.println("EQUAL 1 object"); // this won't get printed.
}
被调用。
如果您想调用{{1}}班级的{{1}}方法,可以尝试这样的方法
{{1}}
答案 1 :(得分:1)
这是正确的行为,以及继承的工作原理。要详细了解其工作原理,请阅读http://docs.oracle.com/javase/tutorial/java/IandI/override.html
答案 2 :(得分:0)
您的equals(Object obj
)方法需要像这样
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
return true;
}
答案 3 :(得分:0)
默认情况下,java中的所有方法都是虚拟的。所以他们在运行时确定。 当您在类中重写equals方法时,编译器会看到Object类具有equals方法,因此编译正常。但是在运行时,它看到Object类引用引用了TestEqual类对象,因此它调用了TestEqual类的equals方法。
这种行为在java中被称为动态多态。
答案 4 :(得分:0)
永远记住,实例方法是根据“OBJECT”的类型而不是对象的“REFERENCE”类型调用的。在你的情况下,
TestEqual test1=new TestEqual();
TestEqual test2=new TestEqual();
和
Object object1=new TestEqual();
Object object2=new TestEqual();
正在创建TestEqual类的实例。因此,只调用对象(而不是引用)的equals()方法。现在,由于对象相同,被调用的方法也是相同的。