假设我有两个类,在单独的文件中:
public class Text
{
public String _word;
public Text(String w)
{
_word = w;
}
public String getWord()
{
return _word;
}
public boolean equals (Text other)
{
return ((other!=null)&&(_word.equals(other._word)));
}
public boolean test (Text other)
{
return 1==1;
}
}
第二课:
public class Sentence
{
public String _word;
public Sentence(String w)
{
_word = w;
}
public String getWord()
{
return _word;
}
public boolean equals (Object other)
{
return ((other!=null) && (other instanceof Sentence)
&& (_word.equals(((Sentence) other)._word)));
}
}
以下主要内容:
public static void main(String[]args){
Text y1 = new Text("abc");
Sentence z1 = new Sentence ("abc");
**
}
让我们说我运行以下命令,其中**是:
System.out.println (y1.equals(z1));
一切都很好,它会输出" false"。
但是,如果我运行此命令:
System.out.println (y1.test(z1));
编译器尖叫" Sentence无法转换为Text"。
两个问题:
y1.equlas()
调用Text中的equlas()
,然后只将Text作为参数。谢谢!
答案 0 :(得分:3)
您已在equals(Text)
中定义了Text
方法。但是,它不会覆盖它从equals(Object)
继承的现有Object
方法。因此,您的equals(Text)
方法会重载equals(Object)
中的Object
方法。因此,您可以致电y1.equals(z1)
。由于z1
是Sentence
,因此equals(Object)
方法就是所谓的方法。 Sentence
对象与Object
匹配,但与Text
不匹配。 equals
method in Object
比较对象引用以查看它们是否相同。
类
equals
的{{1}}方法实现了对象上最具辨别力的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象(x == y具有值Object
)时,此方法才返回true
。 / p>
他们不是,所以它返回true
。
您已在false
中定义了test(Text)
方法。没有其他可用的重载,Text
根本不匹配Sentence
,因此编译器会抱怨。
顺便提一下,您在Text
中定义的equals(Object)
方法是Sentence
的正确覆盖,检查equals
和参数的类。
答案 1 :(得分:2)
根据Object类定义,您可以在所有类中继承它
public boolean equals(Object obj)
在您的情况下,y1.equals(z1)
实际上是y1.equals( (Object) z1)
执行的,因为所有对象都继承Object
,所以有效。然后,您可以使用上述方法。
答案 2 :(得分:0)
我认为在Text.java中你要覆盖Object.equals(Object other)
,但是不是覆盖你创建了一个具有相同名称(equals(Text other)
)但具有不同参数类型的其他方法。
这就是System.out.println (y1.equals(z1));
编译的原因:等于调用匹配签名equals(Object)
,Text从Object
继承的方法。
另一方面,System.out.println (y1.test(z1));
无法编译,因为Text
只有一个名为test
的方法,其形式参数类型为Text
,而不是Sentence
#39; t匹配实际参数的类型(var indexOf = Array.prototype.indexOf
)。