Autor Tema: Sobreescribir métodos toString y equals en Java para qué sirven métodos CU00694B  (Leído 5098 veces)

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenas tardes. Aquí propongo una solución del ejercicio CU00694B del curso Java desde cero.

Citar
EJERCICIO

Define una clase Figura de la que hereden otras dos clases denominadas Cuadrado y Círculo. La clase figura debe tener al menos el campo dimensionPrincipal. Las clases Cuadrado y Círculo deben tener al menos un método calcularArea que permita calcular el área a partir de la dimensión principal, utilizando la fórmula matemática correspondiente. Además, sobreescribe el método equals para que dos cuadrados sean iguales si tienen igual dimensión principal, y dos círculos idem. A continuación crea un programa test donde crees varios círculos y cuadrados y hagas comprobaciones de igualdad usando el método equals.

El código de la clase "Figura":

Código: [Seleccionar]
public class Figura{
   
    private float dimensionPrincipal;
   
    public Figura(){
        this.dimensionPrincipal = 0;
    }
   
    public Figura(float dimensionPrincipal){
        this.dimensionPrincipal = dimensionPrincipal;
    }
   
    public void setDimensionPrincipal(float dimensionPrincipal){
        this.dimensionPrincipal = dimensionPrincipal;
    }
   
    public float getDimensionPrincipal(){return dimensionPrincipal;}
   
}

El código de la clase "Cuadrado":

Código: [Seleccionar]
public class Cuadrado extends Figura{
   
    public Cuadrado(float dimensionPrincipal){
        super(dimensionPrincipal);
    }
   
    public float calcularArea(){
        float area;
        area = getDimensionPrincipal()*getDimensionPrincipal();
        return area;
    }
   
    public boolean equals(Object obj){
        if(obj instanceof Cuadrado){
            Cuadrado tmpCuadrado = (Cuadrado) obj;
            if(getDimensionPrincipal()==tmpCuadrado.getDimensionPrincipal()){
            return true;}else{return false;}
        }else{return false;}
    }
}

El código de la clase "Circulo":

Código: [Seleccionar]
public class Circulo extends Figura{
       
    private final float Pi = 3.14f;
   
    public Circulo(float dimensionPrincipal){
        super(dimensionPrincipal);
    }
   
    public float calcularArea(){
        float area;
        area = Pi*((getDimensionPrincipal()/2)*(getDimensionPrincipal()/2));
        return area;
    }
   
    public boolean equals(Object obj){
        if(obj instanceof Circulo){
            Circulo tmpCirculo = (Circulo) obj;
            if(getDimensionPrincipal()==tmpCirculo.getDimensionPrincipal()){
            return true;}else{return false;}
        }else{return false;}
    }
}

El código de la clase "TestSobreescribirMetodos":

Código: [Seleccionar]
public class TestSobreescribirMetodos{
    public static void main(String []Args){
        //Crear los objetos
        Cuadrado cuadrado1 = new Cuadrado(20);
        Cuadrado cuadrado2 = new Cuadrado(30);
        Cuadrado cuadrado3 = new Cuadrado(20);
        Circulo circulo1 = new Circulo(40);
        Circulo circulo2 = new Circulo(40);
        Circulo circulo3 = new Circulo(50);
        //Comparar los objetos
        System.out.println("Son iguales el objeto cuadrado1 y el objeto cuadrado3: "+(cuadrado1.equals(cuadrado3)));
        System.out.println("Son iguales el objeto cuadrado1 y el objeto cuadrado2: "+(cuadrado1.equals(cuadrado2)));
        System.out.println("Son iguales el objeto cuadrado2 y el objeto cuadrado3: "+(cuadrado2.equals(cuadrado3)));
        System.out.println("Son idénticos el objeto cuadrado1 y el objeto cuadrado3: "+(cuadrado1==cuadrado3));
        System.out.println();
        System.out.println("Son iguales el objeto circulo1 y el objeto circulo3: "+(circulo1.equals(circulo3)));
        System.out.println("Son iguales el objeto circulo1 y el objeto circulo2: "+(circulo1.equals(circulo2)));
        System.out.println("Son iguales el objeto circulo2 y el objeto circulo3: "+(circulo2.equals(circulo3)));
        System.out.println("Son idénticos el objeto circulo1 y el objeto circulo2: "+(circulo1==circulo2));
    }
}

He intentado sobreescribir también el método "toString" de la siguiente manera:

Código: [Seleccionar]
public String toString(){
        return getDimensionPrincipal();
    }

Pero me da el siguiente error:

Citar
incompatible types: float cannot be converted to java.lang.String

vamos, que no puede convertir un tipo "float" en un objeto "String". Pero en el tutorial ponía de ejemplo:

Citar
Supongamos que en nuestra clase Persona redefinimos toString() de la siguiente manera:

public String toString() { return nombre.concat(" "). concat(apellidos); }

 

En la clase profesor, que hereda de Persona, podríamos tener:

public String toString() { return super.toString().concat(" con Id de profesor: ").concat ( getIdProfesor() ); }

public void mostrarDatos() { System.out.println ("Los datos disponibles son: " + this.toString() ); }

y el método "getIdprofesor()" devuelve tipo "int". No entiendo por qué en el ejemplo funciona con "int" y en mi código con "float" no.

Gracias.
« Última modificación: 18 de Marzo 2016, 09:43 por Mario R. Rancel »

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Re:CU00694B Sobreescribir métodos toString y equals en Java
« Respuesta #1 en: 16 de Marzo 2016, 14:15 »
Misterio resuelt, chicos y chicas.

Sobre lo del método "toString()" se tenía que reinscribir así:

Código: [Seleccionar]
public String toString(){
        Float datosDimension = getDimensionPrincipal();
        return datosDimension.toString();
    }

intuyo que el método "toString" sólo se puede invocar sobre objetos y no sobre tipos primitivos.

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Buenos días el ejercicio está correcto

El programa funciona igual si escribes en el test

Código: [Seleccionar]
Figura cuadrado1 = new Cuadrado(20);
Figura cuadrado2 = new Cuadrado(30);
Figura cuadrado3 = new Cuadrado(20);
Figura circulo1 = new Circulo(40);
Figura circulo2 = new Circulo(40);
Figura circulo3 = new Circulo(50);

Creo que ya debes entender por qué funciona igual.

Sobre el toString: en determinadas situaciones el compilador realiza conversiones automáticas, digamos que en situaciones "evidentes".

Por ejemplo si varMiNumero es un tipo numérico

System.out.println ("El valor es " + varMiNumero);

el compilador se encarga de la conversión.

Pero en un return getDimensionPrincipal(); no se encarga de la conversión porque no es una situación evidente. Lo que hace es decirte que hay un fallo de tipos porque debes devolver un tipo y estás devolviendo otro.

Puedes resolverlo como has indicado, o así:

    public String toString() {
        return ""+getDimensionPrincipal(); //El compilador entenderá que quieres devolver una cadena
    }

O también de otras maneras.

Los tipos primitivos carecen de métodos por no ser objetos.

Saludos.

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenas, Mario.

Gracias por revisar otro código más.

Sí entiendo porque funcinará igual si escribes:

Código: [Seleccionar]
Figura cuadrado1 = new Cuadrado(20);
que

Código: [Seleccionar]
Cuadrado cuadrado1 = new Cuadrado(20);
porque el compilador esperará un objeto de la clase abstracta "Figura", y que el tipo "Cuadrado" dinámicamente es "Figura" también.

Sobre la segunda parte de la explicación, no lo sabía. Pensaba que si no escribías "getDimensionPrincipal().toString" en un método que devuelve "String" te devolvería el tipo del que era "getDimensionPrincipal()". Por eso antes convertía lo que devuelve el método "getDimensionPrincipal()" en un objeto. Ahora veo que no es necesario y que si la función que devuelve un tipo primitivo si la metes en una función que devuelve "String" lo devolverá sin invocar sobre el método anidado el método ".toString()".

Saludos.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".