为什么object1等于方法的调用实例而不是声明对象类型

时间:2013-11-25 05:33:32

标签: java

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

5 个答案:

答案 0 :(得分:1)

那是因为您已覆盖equals()中的TestEqual方法。

Object object1=new TestEqual();

由于equals()中的Object TestEqualobject1 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()方法。现在,由于对象相同,被调用的方法也是相同的。