我正在学习==与equals()并做各种例子。对于这个,我理解为什么r == s是假的,但是如果它们现在都具有相同的内容,为什么r.equals(s)是假的?
public class StringProgram{
public static void main(String[] args) {
Person r = new Person("A");
Person s = new Person("J");
s.setName("A");
System.out.println(r.getName());//A
System.out.println(s.getName());//A
System.out.println(r==s);//false
System.out.println(r.equals(s));//false
}
}
以下是Person
的代码:
public class Person{
private String name;
public Person(String d){
name=d;
}
public void setName(String a){
name=a;
}
public String getName(){
return name;
}
}
编辑:我发现我现在必须覆盖它,但我仍然不明白下面的例子中的作业是如何工作的。我只是不明白为什么如果将t分配给你,t.getName()就是Keen。
public class StringProgram { public static void main(String [] args){
Person t = new Person("Gene");
Person u = t;
u.setName("Keen");
System.out.println(t.getName());//Keen
System.out.println(t.equals(u));//true
} }
答案 0 :(得分:0)
equals()
只是一种方法,没有什么特别之处。特别是,它不会自动知道如何比较两个对象的内容。
类equals()
的{{1}}方法与Object
的方法相同。如果您未覆盖班级==
中的equals()
方法,则它不会自动比较Person
个对象的内容。
您必须覆盖班级Person
中的equals()
方法,以便按照您希望的方式进行比较。
Person
答案 1 :(得分:0)
java中的所有类都继承自Object类。当您执行r.equals(s)
时,它使用Object类中定义的.equals()方法。要使它按照您的意愿工作,您需要通过重写.equals()方法为Person类定义.equals()方法。
EG。在Person类中添加:
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
注意:我使用eclipse为我生成了equals和hashcode方法。您可以阅读this thread以了解为什么需要覆盖hashcode()。
答案 2 :(得分:0)
Java无法猜测你想做什么,你必须告诉它两个人如果有相同的名字就是一样的。您必须覆盖equals
:
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (o == null) return false;
if (!(o instanceof Person)) return false;
Person that = (Person) o;
if (name == null && that.name == null) return true;
if (name == null || that.name == null) return false;
return that.name.equals(name);
}
答案 3 :(得分:0)
所有java类都继承自Object,为了正确地比较你的类,你应该覆盖equals()
方法。
public Person(String d){
name=d;
}
public void setName(String a){
name=a;
}
public String getName(){
return name;
}
@Override
public boolean equals(Object obj) {
return obj instanceof Person &&
this.getName().equals(((Person)obj).getName());
}