Ordenador con código fuente rodeado de infinidad de objetos.

Clase Object en Java: el origen de las demás

Guía de programación en Java > Object

Introducción

En Java, todas las clases heredan de una clase base llamada Object. Esta clase es la raíz de la jerarquía de clases en Java. Object proporciona métodos esenciales que todas las clases heredan automáticamente. Comprender cómo funciona Object y cómo sobrescribir sus métodos de manera adecuada es fundamental para escribir código robusto y reutilizable.


Características de la Clase Object

  1. Raíz de la jerarquía: Todas las clases heredan de Object, directa o indirectamente.
  2. Métodos comunes: Proporciona métodos útiles como toString(), equals(), hashCode(), entre otros.
  3. Facilita el polimorfismo: Un objeto de cualquier clase puede ser tratado como un objeto de tipo Object.

Métodos Principales de la Clase Object

1. toString()

Propósito

Devuelve una representación en forma de cadena (String) del objeto. El valor predeterminado es el nombre de la clase seguido de un código hash.

Ejemplo sin sobrescribir:

class Persona {
    String nombre;
    int edad;

    Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }
}

public class Main {
    public static void main(String[] args) {
        Persona persona = new Persona("Ana", 25);
        System.out.println(persona.toString());
    }
}

Salida:

Persona@15db9742

Ejemplo sobrescribiendo toString():

class Persona {
    String nombre;
    int edad;

    Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }

    @Override
    public String toString() {
        return "Nombre: " + nombre + ", Edad: " + edad;
    }
}

public class Main {
    public static void main(String[] args) {
        Persona persona = new Persona("Ana", 25);
        System.out.println(persona.toString());
    }
}

Salida:

Nombre: Ana, Edad: 25

Buenas Prácticas:

  • Siempre sobrescribe toString() para facilitar la depuración y el registro.
  • Incluye información relevante del objeto.

2. equals(Object obj)

Propósito

Compara si dos objetos son «iguales». El método por defecto compara referencias de memoria.

Ejemplo sin sobrescribir:

class Persona {
    String nombre;
    int edad;

    Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }
}

public class Main {
    public static void main(String[] args) {
        Persona persona1 = new Persona("Ana", 25);
        Persona persona2 = new Persona("Ana", 25);

        System.out.println(persona1.equals(persona2));
    }
}

Salida:

false

Ejemplo sobrescribiendo equals():

class Persona {
    String nombre;
    int edad;

    Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Persona persona = (Persona) obj;
        return edad == persona.edad && nombre.equals(persona.nombre);
    }
}

public class Main {
    public static void main(String[] args) {
        Persona persona1 = new Persona("Ana", 25);
        Persona persona2 = new Persona("Ana", 25);

        System.out.println(persona1.equals(persona2));
    }
}

Salida:

true

Buenas Prácticas:

  • Compara atributos relevantes del objeto.
  • Usa la anotación @Override para evitar errores tipográficos.

3. hashCode()

Propósito

Devuelve un valor entero que representa el código hash del objeto. Es esencial para el correcto funcionamiento de estructuras como HashMap y HashSet.

Ejemplo sin sobrescribir:

class Persona {
    String nombre;
    int edad;

    Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }
}

public class Main {
    public static void main(String[] args) {
        Persona persona = new Persona("Ana", 25);
        System.out.println(persona.hashCode());
    }
}

Salida (varía en cada ejecución):

356573597

Ejemplo sobrescribiendo hashCode():

class Persona {
    String nombre;
    int edad;

    Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }

    @Override
    public int hashCode() {
        return nombre.hashCode() + edad;
    }
}

public class Main {
    public static void main(String[] args) {
        Persona persona = new Persona("Ana", 25);
        System.out.println(persona.hashCode());
    }
}

Salida:

66773

Buenas Prácticas:

  • Usa atributos relevantes para calcular el código hash.
  • Si sobrescribes equals(), también sobrescribe hashCode().

4. clone()

Propósito

Crea una copia exacta del objeto. Se utiliza con el patrón prototipo.

Ejemplo sobrescribiendo clone():

class Persona implements Cloneable {
    String nombre;
    int edad;

    Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Persona persona1 = new Persona("Ana", 25);
        Persona persona2 = (Persona) persona1.clone();

        System.out.println(persona1.nombre + " - " + persona1.edad);
        System.out.println(persona2.nombre + " - " + persona2.edad);
    }
}

Salida:

Ana - 25
Ana - 25


Resumen

  • La clase Object proporciona métodos fundamentales para la gestión de objetos.
  • Sobrescribir estos métodos mejora la funcionalidad y la claridad del código.
  • Siguiendo buenas prácticas, se garantiza que el código sea eficiente y más comprensible.

Ejercicio Propuesto

  1. Crea una clase Producto con los atributos nombre (String) y precio (double).
  2. Sobrescribe los métodos toString(), equals() y hashCode().
  3. En una clase Main, crea varios objetos Producto y prueba los métodos sobrescritos.

Salida esperada:

Producto: Pan - 1.5
true
23456789

Practica con estos conceptos para dominar la clase Object y sus métodos esenciales. ¡Tú puedes! 🚀


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.