So I have a class called Person which looks like this
public class Person {
private String personName;
public String toString(){
return personName;
}
public Person(String personName){
this.personName = personName;
}
}
and another class in which I am creating the object(s) person
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);
}
}
so far everything is fine and my print statement is
p1: Bob
p2: Joe
Now I want to create a new object, p3 and set it equal to p1 my class now looks like this:
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));
}
}
when I try to do this I get the following error message:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The constructor Person(Person) is undefined
at vehicleassignment.IdanJavaTask.main(IdanJavaTask.java:13)
I am thinking I will need to add a method to my main (Person) class, but I do not know why or what to add? why can't I just set the objects equal to eachother?
If the two objects have the same values, equals() will return true . In the second comparison, equals() checks to see whether the passed object is null, or if it's typed as a different class. If it's a different class then the objects are not equal. Finally, equals() compares the objects' fields.
Equality of objects means when two separate objects happen to have the same values/state. Whereas equality of references means when two object references point to the same object. The == operator can be used to check if two object references point to the same object.
The equals() method of java. util. Set class is used to verify the equality of an Object with a Set and compare them. The method returns true if the size of both the sets are equal and both contain the same elements.
Java equals() Method. The equals() method of the Object class compare the equality of two objects. The two objects will be equal if they share the same memory address.
There are two ways to interpret "set the objects equal to each other".
One is that you want p1
and p3
to refer to the same object. Like how Clark Kent and Superman are two names (references) for the same person. This would be accomplished by:
Person p1 = new Person("Jim");
Person p3 = p1;
In this scenario, if anything happens to p1
, that same thing has happened to p3
. If you kill Clark Kent, you have killed Superman (as they are one and the same). Java determines equality with the equals(Object o)
method - two objects a
and b
are equal iff a.equals(b)
and b.equals(a)
return true
. These two objects will be equal using the base Object
definition of equality, so you don't have to worry about that.
The other way to interpret your meaning is to create a new person object, which happens to be an exact copy of the first person. In order to do this, you'd have to add another constructor to your person class that takes a person as an argument:
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;
}
}
With this setup, you can do what you're doing in your main.
Person p1 = new Person("Bob");
Person p3 = new Person(p1); //Will have name Bob.
In order to make p1
and p3
equal, we have to teach the Person class to use its fields for checking equality. We can do this by overriding the equals
method in class person.
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);
}
Whenever we overwrite the equals
method, it is good practice to also overwrite the hashcode
method, which returns a unique int
for each Object. Since the only field that a Person
object has is its name, we can simply use that hashcode.
public int hashCode(){
return personName == null ? 0 : personName.hashCode();
}
So all together, our Person class looks like this:
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();
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With