Ida*_*ber 4 java methods compiler-errors equals
所以我有一个名为Person的类,看起来像这样
public class Person {
private String personName;
public String toString(){
return personName;
}
public Person(String personName){
this.personName = personName;
}
}
Run Code Online (Sandbox Code Playgroud)
和另一个我正在创建对象的类
public class IdanJavaTask {
public static void main(String[] args) {
Person p1 = new Person("Bob");
System.out.println("p1 : " + p1);
Person p2 = new Person("Joe");
System.out.println("p2 :" + p2);
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都很好,我的打印声明是
p1:Bob
p2:Joe
现在我想创建一个新对象,p3并将其设置为p1,我的类现在看起来像这样:
public class IdanJavaTask {
public static void main(String[] args) {
Person p1 = new Person("Bob");
System.out.println("p1 : " + p1);
Person p2 = new Person("Joe");
System.out.println("p2 :" + p2);
Person p3 = new Person (p1);
System.out.println("p3 equal to p1:" + p3.equals(p1));
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试这样做时,我收到以下错误消息:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The constructor Person(Person) is undefined
at vehicleassignment.IdanJavaTask.main(IdanJavaTask.java:13)
Run Code Online (Sandbox Code Playgroud)
我想我需要在main(Person)类中添加一个方法,但我不知道为什么或要添加什么?为什么我不能把对象设置为彼此相等?
有两种方法可以解释"将对象设置为彼此相等".
一个是你想要p1并p3引用同一个对象.就像Clark Kent和Superman是同一个人的两个名字(参考)一样.这将通过以下方式实现:
Person p1 = new Person("Jim");
Person p3 = p1;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果发生任何事情p1,同样的事情发生了p3.如果你杀死克拉克肯特,你已经杀死了超人(因为他们是同一个人).Java确定与equals(Object o)方法的相等性- 两个对象a并且b等于iff a.equals(b)并b.equals(a)返回true.使用相等的基本Object定义,这两个对象将是相同的,因此您不必担心这一点.
解释你的意思的另一种方法是创建一个新的人物对象,恰好是第一个人的精确副本.为了做到这一点,你必须在你的person类中添加另一个构造函数,该构造函数将一个人作为参数:
public class Person {
private String personName;
public String toString(){
return personName;
}
public Person(String personName){
this.personName = personName;
}
public Person(Person personToCopy){
this.personName = personToCopy.personName;
}
}
Run Code Online (Sandbox Code Playgroud)
通过此设置,您可以执行主要操作.
Person p1 = new Person("Bob");
Person p3 = new Person(p1); //Will have name Bob.
Run Code Online (Sandbox Code Playgroud)
为了使p1和p3平等的,我们要教Person类使用其字段检查平等.我们可以通过覆盖equals类人的方法来做到这一点.
public boolean equals(Object o){
if(! (o instanceof Person)) return false; //a Person can't be equal to a non-person
Person p = (Person) o;
return personName == null && p.personName == null || personName.equals(p.personName);
}
Run Code Online (Sandbox Code Playgroud)
每当我们覆盖该equals方法时,最好还要覆盖该hashcode方法,该方法int为每个Object 返回唯一的方法.由于Person对象具有的唯一字段是其名称,因此我们可以简单地使用该哈希码.
public int hashCode(){
return personName == null ? 0 : personName.hashCode();
}
Run Code Online (Sandbox Code Playgroud)
总而言之,我们的Person类看起来像这样:
public class Person {
private String personName;
public String toString(){
return personName;
}
public Person(String personName){
this.personName = personName;
}
public Person(Person personToCopy){
this.personName = personToCopy.personName;
}
public boolean equals(Object o){
if(! (o instanceof Person)) return false; //a Person can't be equal to a non-person
Person p = (Person) o;
return personName == null && p.personName == null || personName.equals(p.personName);
}
public int hashCode(){
return personName == null ? 0 : personName.hashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24635 次 |
| 最近记录: |