overriding predefined methods java
Este tutorial explica cómo anular métodos predefinidos como equals (), hashCode (), compareTo (), etc. en Java con ejemplos:
En nuestro tutorial anterior, discutimos el polimorfismo en tiempo de ejecución en Java. El polimorfismo en tiempo de ejecución en Java se implementa mediante la invalidación de métodos. La invalidación del método implica redefinir el método de la clase principal en la subclase.
Java tiene varios métodos predefinidos como equals (), hashCode (), compareTo (), toString (), etc. que se usan comúnmente para objetos generales independientemente de la clase a la que pertenezcan. Pero para que estos métodos funcionen para todos los objetos, necesitamos anular estos métodos o redefinir sus implementaciones para que puedan trabajar con los datos que queremos.
=> Visite aquí para aprender Java desde cero.
En este tutorial, discutiremos la anulación de todos estos métodos junto con las consecuencias si no anulamos estos métodos.
Lo que vas a aprender:
- Anulación de los métodos equals () y hashCode () en Java
- Anulación del método estático en Java
- Anulación de compareTo () en Java
- Anular el método toString () en Java
- Preguntas frecuentes
- Conclusión
- Lectura recomendada
Anulación de los métodos equals () y hashCode () en Java
Usamos el método equals () en Java para comparar dos objetos. Este método devuelve verdadero cuando los objetos son iguales y falso cuando no son iguales.
Se utilizan dos formas para comparar la igualdad de dos objetos.
# 1) Comparación superficial
La comparación superficial es la implementación predeterminada para el método equals () definido en la clase 'java.lang.Object'. Como parte de esta implementación, el método equals () verificará si dos objetos que se comparan tienen referencias que se refieren al mismo objeto.
Esto significa que si obj1 y obj2 son dos objetos, entonces la implementación predeterminada del método equals () (comparación superficial) solo verificará si las referencias de obj1 y obj2 son del mismo objeto.
En comparación superficial, no se compara ningún contenido de datos.
# 2) Comparación profunda
En una comparación profunda, comparamos los miembros de datos de cada objeto, es decir, los objetos se comparan con respecto al estado. Entonces comparamos los objetos a un nivel profundo, incluido su contenido.
Para comparar los objetos mediante una comparación profunda, normalmente anulamos el método equals ().
Ahora considere el siguiente programa Java.
|_+_|Producción:

Si vemos la salida del programa anterior, dice que los objetos no son iguales aunque el contenido de los dos objetos sea el mismo. Esto se debe a que, cuando se comprueba la igualdad, se determina si los dos objetos c1 y c2 se refieren al mismo objeto.
Como se ve en el programa, c1 y c2 son dos objetos diferentes, por lo que son referencias diferentes y, por lo tanto, resulta así.
Ahora creemos una tercera referencia c3 y equiparémosla a c1 de la siguiente manera:
Complejo c3 = c1;
En este caso, c3 y c1 se referirán al mismo objeto y, por lo tanto, (c3 == c1) devolverá verdadero.
Lo que hizo el programa anterior fue la comparación superficial. Entonces, ¿cómo comprobamos si dos objetos tienen el mismo contenido?
Aquí, buscamos una comparación profunda y, para este propósito, anulamos el método equals ().
arquitectura de computadora entrevista preguntas y respuestas pdf
El siguiente programa muestra la anulación del método equals (). Usamos la misma clase Complex.
|_+_|Producción:

Ahora que tenemos un método equals () anulado, cuando comparamos dos objetos, el resultado muestra que los dos objetos son iguales ya que sus contenidos son iguales. Tenga en cuenta el método equals () anulado. Aquí comprobamos si ambos objetos tienen la misma referencia. De lo contrario, verificamos individualmente el contenido de estos objetos.
En Java, siempre que anulamos el método equals (), es aconsejable anular también el método hashCode (). Esto se debe a que si no anulamos el método hashCode (), entonces cada objeto puede tener un hashCode diferente.
Es posible que esto no interfiera con los objetos generales, pero es posible que ciertas colecciones basadas en hash como HashTable, HashSet y HashMap no funcionen correctamente.
El siguiente programa muestra los métodos equals () y hashCode () anulados.
|_+_|Producción:

En este programa, usamos un hashMap. Hemos anulado los métodos equals () y hashCode (). Por lo tanto, cuando decimos map.put (e1, 'C ++'), utiliza un hash en la ubicación de algún depósito. A continuación, llamamos a map.put (e2, 'Python'). Esta vez hará un hash en el mismo depósito y reemplazará el valor anterior. Esto se debe a que hemos anulado el método hashCode ().
Anulación del método estático en Java
¿Podemos anular el método estático en Java?
En lo que respecta a anular el método estático en Java, la respuesta directa a esta pregunta es No, no podemos anular el método estático.
El método estático se invoca utilizando el nombre de la clase en sí. No necesitamos un objeto para llamar a un método estático. Entonces, incluso si declaramos un método con el mismo prototipo en una subclase, no podemos llamarlo anulado. En cambio, solo estamos ocultando la definición de clase principal del método estático.
El siguiente programa Java muestra el método estático y el método no estático en un sistema de herencia junto con su comportamiento en tiempo de ejecución.
|_+_|Producción:

De la salida del programa, podemos concluir lo siguiente.
- La llamada al método estático siempre se realiza en función del tipo de referencia. Por lo tanto, cuando llamamos a new_obj. display () en el programa anterior, como la referencia new_obj es de clase de tipo Parent, se llama al método display () de la clase Parent.
- Por otro lado, los métodos no estáticos se llaman en función del contenido del objeto de referencia con el que se llama al método. Por lo tanto, en el programa anterior, el método new_obj.print () llama al método print () de la clase secundaria, ya que los contenidos de new_obj son el objeto de la clase secundaria.
Esto explica la salida del programa anterior y debemos recordar los siguientes puntos también al tratar con métodos estáticos en el sistema OOP.
- Un método estático no puede ocultar un método de instancia no estático y un método de instancia no estático no puede anular un método estático.
- Podemos sobrecargar los métodos de la clase principal en una subclase, pero no anulan ni ocultan los métodos de la clase principal, sino que son métodos nuevos en la subclase.
Anulación de compareTo () en Java
Sabemos que la interfaz java.lang.Comparable proporciona un método 'compareTo ()' mediante el cual podemos clasificar los objetos en un orden natural como el orden léxico para los objetos String, el orden numérico para los enteros, etc.
Para implementar la clasificación en colecciones o objetos definidos por el usuario, necesitamos anular el método compareTo () para clasificar los elementos de la colección o los objetos definidos por el usuario.
Entonces, ¿qué hace un método compareTo ()?
Un método compareTo () debe devolver un valor positivo si el objeto actual es mayor que el objeto pasado en orden y el valor negativo del objeto actual es menor que el objeto pasado. Si ambos objetos son iguales, entonces el método compareTo () devolverá cero.
Otro punto a tener en cuenta es que el método equals () y compareTo () deben comportarse de manera coherente entre sí. Esto significa que si el método compareTo () devuelve que dos objetos son iguales (devuelve cero), entonces también deberíamos tener la misma salida del método equals ().
Implementemos un programa Java que anule el método compareTo (). En este programa, estamos usando una clase de color que tiene dos variables privadas, es decir, nombre e identificación. Hemos asociado el 'id' con cada color y anularemos el método compare () para organizar los colores según el id.
|_+_|Producción:

En la salida anterior, primero mostramos la lista de colores y luego la lista ordenada de colores. En el programa, hemos anulado los métodos compareTo () y compare ().
Anular el método toString () en Java
El método 'toString ()' devuelve la representación String de un objeto en Java. Pero cuando tenemos objetos definidos por el usuario, este método puede comportarse de manera diferente.
Por ejemplo,considere el siguiente programa.
|_+_|Producción:

Como se muestra en este programa, estamos mostrando el objeto de clase compleja que hemos definido anteriormente. Sin embargo, el resultado que se muestra no es el contenido, sino que es bastante críptico.
La salida muestra un nombre de clase Complex seguido del carácter '@' y luego el código hash del objeto. Esta es la salida predeterminada impresa por el método toString () de la clase Object.
Si queremos la salida adecuada, necesitamos anular el método toString () en nuestra aplicación.
El siguiente programa Java muestra cómo anular el método toString () para imprimir el contenido del objeto Complex.
|_+_|Producción:

El programa anterior muestra que el método toString () se anula para devolver el contenido del objeto Complejo en el formato dado (real + i * imaginario).
En general, cuando queremos mostrar el objeto de la clase usando print () o println (), siempre es aconsejable anular el método toString () para obtener la salida adecuada.
Preguntas frecuentes
P # 1) ¿Por qué usar .equals en lugar de == Java?
Responder: Usamos '==' para comparar tipos primitivos como int, char, boolean, etc. Usamos equals () para comparar objetos (predefinidos o definidos por el usuario). Por lo general, anulamos el método equals () para comparar dos objetos y el valor de retorno de equals () depende del código anulado.
P # 2) ¿Para qué se utilizan hashCode () y equals ()?
Responder: En Java, el método equals () se usa para comparar la igualdad de dos objetos. El método hashCode () devuelve el hashCode del objeto. Si bien el método equals () se usa con la mayoría de los objetos para probar su igualdad, hashCode se usa principalmente en colecciones hash como HashTable, HashMap, HashSet, etc.
P # 3) ¿Podemos cambiar la lista de argumentos del método anulado?
Responder: No. Cuando anulamos el método, mantenemos la firma del método o el prototipo del método igual en la subclase también. Por tanto, no podemos cambiar el número de parámetros en el método anulado.
P # 4) ¿Por qué anulamos toString ()?
Responder: Cuando se anula el método toString (), podemos devolver los valores del objeto para el que se anula el método toString () sin escribir demasiado código. Esto se debe a que el compilador de Java invoca el método toString () cuando imprimimos un objeto.
P # 5) ¿Qué pasaría si no anula el método toString ()?
Responder: Si no invalidamos el método toString (), no obtendremos ninguna información sobre las propiedades o el estado del objeto. No sabremos qué hay realmente dentro del objeto. Entonces, todas las clases deben anular el método toString ().
Esto se debe a que la implementación predeterminada del método toString () muestra la representación de cadena, pero cuando usamos la implementación predeterminada de toString () en el objeto, no obtendremos el contenido del objeto.
Conclusión
En este tutorial, discutimos sobre la invalidación de algunos métodos Java predefinidos y también vimos por qué necesitamos invalidarlos.
Cuando tratamos con objetos, las implementaciones predeterminadas de métodos como equals (), compareTo () y toString () pueden no dar la información correcta. Por lo tanto, optamos por anular.
=> Eche un vistazo a la guía para principiantes de Java aquí.
Lectura recomendada
- Tutorial de cadenas de Java | Métodos de cadena de Java con ejemplos
- Hilos de Java con métodos y ciclo de vida
- Método Java String length () con ejemplos
- Invertir una matriz en Java: 3 métodos con ejemplos
- ¿Cómo utilizar el método toString de Java?
- Método Java String indexOf con ejemplos de código
- Tutorial del método Java String contains () con ejemplos
- Método Java String Split () - Cómo dividir una cadena en Java