有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么字符串类中的equals方法定义为equals(Object anObject),而不是equals(String anObject)?

这是来自String类的equals()

public boolean equals(Object anObject)
{
    if (this == anObject)
    {
        return true;
    }
    else
    {
        if (anObject instanceof String)
        {
            String aString = (String) anObject;
            if (this.coder() == aString.coder())
            {
                return this.isLatin1() ? StringLatin1.equals(this.value, aString.value) : StringUTF16.equals(this.value, aString.value);
            }
        }
        return false;
    }
}
  1. 那么为什么它被定义为equals(Object anObject),而不是equals(String anObject)? 如果除String之外的任何其他对象返回false,那么有机会接收任何对象有什么意义
  2. 如果我创建了MyOwnClass,我应该将equals()方法重写为
    equals(Object obj)
    或作为
    equals(MyOwnClass obj)
    如果与第一个选项相同,那么为什么

注意:覆盖时协方差以返回类型工作。我认为,如果在重写时协方差在返回类型中起作用,那么它也必须在函数参数中起作用

{
    public A foo(A o)
    {
        return new A();
    }
}

class B extends A
{
    @Override // everything OK
    public B foo(A o)
    {
        return new B();
    }
}

共 (3) 个答案

  1. # 1 楼答案

    So why it is defined as equals(Object anObject) but not as equals(String anObject)?

    class String重写具有以下签名的^{}

    public boolean equals(Object obj)
    

    在重写的情况下,子类中的方法签名(名称和参数)必须与超类中的方法签名相同。如果更改参数的数量和/或类型,则该方法将重载,而不是重写

    If I create MyOwnClass should I override equals() method as equals(Object obj) or as equals(MyOwnClass obj)

    您应该将其覆盖为

    public boolean equals(Object obj)
    

    否则,它不会被覆盖;相反,它会像上面提到的那样过载

  2. # 2 楼答案

    What's the point of having an opportunity to receive any object if it's return false for any other objects than String?

    给定两个Object,您可以合法地询问它们是否相等,即使具体类型是IntegerString

    Object first = 0;   // first is an Integer
    Object second = ""; // second is a String
    
    boolean equal = second.equals(first);
    

    equals方法需要接受最通用的类型

    should I override equals() method as equals(Object obj) or as equals(MyOwnClass obj) If as in the first option then why?

    第一个。如果使用第二种方法,则仅当接收器和参数的类型都为MyOwnClass(如receiver.equals(parameter))时才会调用它。否则,将调用来自Objectequals(Object),因为方法重载由编译器解决,并且equals(Object)是编译器知道的唯一匹配接收方和参数的方法

  3. # 3 楼答案

    到目前为止,没有一个答案能够触及问题的核心

    Java的输入系统是协变的(直到您进入泛型,在这里您可以选择所需的协变)

    假设class Apple extends Fruitclass Fruit extends Object,那么所有苹果也是水果,所有水果也是对象,所有苹果也是对象

    对象,因为java.lang.Object这样说,所以它有一个equals(Object other)方法。这意味着苹果必须也有此方法:

    1. 所有的苹果都是实物
    2. 所有对象都有一个equals(Object)方法
    3. 因此,苹果有一种equals(Object)方法

    那么为什么对象有这种方法呢?因为它很有用。因为它使ArrayListcontains(Object other)方法滴答作响,所以它使java。util。开始工作。一旦您确定所有对象都有一个equals(Object other)方法,其余的(特别是,苹果有一个equals(Object other)方法,如果您询问它是否等于某个非苹果对象,它通常会返回false)被锁定;现在的情况就是这样,因为我们在这里设置的系统(这是一个协变类型系统,所有类型继承自的基类型都有一个equals(Object)方法)规定它必须如此

    是的,java语言规范实际上保证了这一点;无法从Apple中“删除”equals(Object)方法。然而,java的关键是它为什么会这样