Java 为什么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

为什么object1等于方法的调用实例而不是声明对象类型 我已经写了下面的代码。与
相等对象的混淆

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中总是虚拟的。(静态方法从来都不是。)