objetos - obtener datos de un jlist java
¿El método igual funciona con objetos? ¿Si es así, cómo? (3)
Tengo un programa que es zoológico y en el zoológico hay subgrupos ramificados de animales que son reptiles. Cuando hago un método igual, el programa principal se compila y se ejecuta. Estoy confundido, ¿cómo sabe Java utilizar el método equals si estoy comparando objetos y no específicamente int o 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...");
}
}
Cada clase hereda la clase Object
silenciosamente. Y la clase Object
tiene un método equals
. Entonces, si cualquier clase no anula el método equals entonces usará la implementación predeterminada de Object.equals.
Del doc
El método equals para la clase Object implementa la relación de equivalencia más discriminatoria posible en los objetos; es decir, para cualquier valor de referencia no nulo x e y, este método devuelve verdadero si y solo si xey se refieren al mismo objeto (x == y tiene el valor verdadero).
Del código fuente de Object.equals
public boolean equals(Object obj) {
return (this == obj);
}
Entonces, si algún objeto no tiene su propia implementación de iguales, entonces el método equals
simplemente comprobará si la referencia del objeto es igual o no.
Así que obtenga el resultado deseado de los iguales que necesita implementar por su cuenta, como ya se sugirió en otra respuesta
Para su pregunta sobre cómo sabe java cómo comparar objetos, debe anular el método de igualdad
public boolean equals(Object other){
// return true or false based on your logic
}
Mientras se compara, se usa el método igual. Puedes echar un vistazo a este buen tutorial que explica la importancia del método igual.
http://www.thejavageek.com/2013/06/26/what-is-the-significance-of-equals-method-in-java/
Además, solo anular equivalentes no es suficiente si está utilizando objetos en colecciones que usan hash. Encontrará un buen tutorial en
http://www.thejavageek.com/2013/06/28/significance-of-equals-and-hashcode/
No anula el método Object#equals
, pero lo sobrecarga. En su declaración de método, utiliza Animal
tipo Animal
lugar de Object
:
public boolean equals(Animal other)
Una buena anulación del método sería usar el operador instanceof
. Mostrando un ejemplo:
@Override
public boolean equals(Object other) {
if(other instanceof Animal) {
Animal otherAnimal = (Animal)other;
//comparison logic...
}
return false;
}
Más información sobre el tema:
- Las mejores prácticas con respecto a iguales: ¿sobrecargar o no sobrecargar?
- Overriding Object.equals VS Sobrecargándolo