Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does the equals method work with objects? If so, how?

I have a program that is zoo and in the zoo there are branched subgroups of animals that are reptiles. When I do an equals method the main program compiles and it runs. I'm confused how does java know to use the equals method if I'm comparing objects and not specifically int or String?

public class Zoo {

    public static void main(String[]args) {
        Animal a=new Animal("Bob");
        Reptile komodo= new Reptile("Snakey");
        komodo.bask();
        a.size=3;
        komodo.size=5;
        System.out.println(a);
        System.out.println(komodo);
        Turtle t= new Turtle("Slowy");
        t.hide();
        t.size=6;
        t.numlegs=4;
        System.out.println(t);
        System.out.println(t.equals(komodo));
    }
}

public class Animal {
    public String name;

    public boolean equals(Animal other) {
        return other.size==this.size;
    }

    public Animal(String s) {
        name=s;
    }
    public void setName(String n) {
        this.name=n;
    }
    public void eat(String meal) {
        System.out.println("chump chump yummy "+meal);
    }
    public int size;

    public String toString() {
        return "I am "+name+" and I'm "+size+" cm long";
    }

}

public class Reptile extends Animal {

    public Reptile(String n) {
        super(n);
        numlegs=0;
    }
    public Reptile(String n, int l) {
        super(n);
        numlegs=l;
    }

    public void bask() {
        System.out.println("basking...");
    }
    public String toString() {
        return super.toString()+numlegs+" legs";
    }

    public int numlegs;
}
public class Turtle extends Reptile {

    public Turtle(String n) {
        super (n,4);
        shellColor="Brown";
    }
    public void hide() {
        System.out.println("you cant see me");
    }
    public String toString() {
        return super.toString()+" and my shell is"+ shellColor;
    }
    public String shellColor;

    public void bask() {
        super.bask();
        System.out.println("turtle is basking...");
    }

}
like image 890
Ivan_Stepul Avatar asked Jul 09 '13 14:07

Ivan_Stepul


People also ask

Can we use equals method for Object?

The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).

How does equals work in Object?

In the first comparison, equals() compares the current object instance with the object that has been passed. 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.

Can you use == with objects?

We can use == operators for reference comparison (address comparison) and . equals() method for content comparison. In simple words, == checks if both objects point to the same memory location whereas . equals() evaluates to the comparison of values in the objects.

How does equals () method work What does it do?

The equals() method compares two strings, and returns true if the strings are equal, and false if not. Tip: Use the compareTo() method to compare two strings lexicographically.


2 Answers

You're not overriding the Object#equals method, but overloading it. In your method declaration you use Animal type instead of Object:

public boolean equals(Animal other)

A good overriding of the method would be using the instanceof operator. Showing an example:

@Override
public boolean equals(Object other) {
    if(other instanceof Animal) {
        Animal otherAnimal = (Animal)other;
        //comparison logic...
    }
    return false;
}

More info on the subject:

  • Best practices regarding equals: to overload or not to overload?
  • Overriding Object.equals VS Overloading it
like image 172
Luiggi Mendoza Avatar answered Oct 20 '22 19:10

Luiggi Mendoza


For your question on how java knows how to compare objects, you need to override the equals method

 public boolean equals(Object other){
    // return true or false based on your logic

  }

While comparing, equals method is used. You can have a look at this good tutorial which explains the significance of the equals method.

http://www.thejavageek.com/2013/06/26/what-is-the-significance-of-equals-method-in-java/

Also, only overriding equals is not enough if you are using objects into collections those use hashing. You will find a good tutorial at

http://www.thejavageek.com/2013/06/28/significance-of-equals-and-hashcode/

like image 2
Prasad Kharkar Avatar answered Oct 20 '22 19:10

Prasad Kharkar