Autor Tema: Sobreescribir métodos toString y equals en Java. Comparación de objetos CU00694B  (Leído 3026 veces)

LuisM

  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 131
    • Ver Perfil
Hola a todos !! Dejo a continuación las clases en respuesta al ejercicio propuesto CU00694B del tutorial de programación Java pdf. Desde ya muchas gracias.
Saludos, Luis

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.

Clase Figura
Código: [Seleccionar]
public class Figura
{
    private float dimensionPrincipal;

    public Figura(float dimensionPrincipal)  {   }

}

Clase Cuadrado
Código: [Seleccionar]
public class Cuadrado extends Figura
{
    protected float superficie;
    protected float lado;
    public Cuadrado(float lado){
    super(lado);
    this.lado = lado;
    calcularArea(lado);
    }

    public void calcularArea(float lado) {
    superficie = lado*lado;
    }

    public boolean equals (Object obj) {
        if (obj instanceof Cuadrado) {
            Cuadrado tmpCuadrado = (Cuadrado) obj;
            if (this.lado==tmpCuadrado.lado) {
                return true; } else { return false; }
        }  else { return false; }
    }
}

Clase Circulo
Código: [Seleccionar]
public class Circulo extends Figura
{
    protected float radio;
    protected double superficie;
    public Circulo(float radio) {
    super(radio);
    this.radio=radio;
    calcularArea(radio);   
    }

    public void calcularArea(float radio) {
        superficie=3.14*radio*radio;
    }
    public boolean equals (Object obj) {
        if (obj instanceof Circulo) {
            Circulo tmpCirculo = (Circulo) obj;
            if (this.radio==tmpCirculo.radio ) {
                return true; } else { return false; }
        }  else { return false; }
    }
}

Clase TestFiguras
Código: [Seleccionar]
public class TestFiguras{
    public static void main (String [ ] Args) {
        Cuadrado cuadrado1 = new Cuadrado(3);
        System.out.println("cuadrado 1 de lado:"+cuadrado1.lado+" y superficie:"+cuadrado1.superficie);
        Cuadrado cuadrado2 = new Cuadrado(3);
        System.out.println("cuadrado 2 de lado:"+cuadrado2.lado+" y superficie:"+cuadrado2.superficie);
        Cuadrado cuadrado3 = new Cuadrado(5);
        System.out.println("cuadrado 3 de lado:"+cuadrado3.lado+" y superficie:"+cuadrado3.superficie);
        System.out.println ("¿Son iguales cuadrado1 y cuadrado2? " + cuadrado1.equals(cuadrado2) );
        System.out.println ("¿Son el mismo objeto cuadrado1 y cuadrado2? " + (cuadrado1 == cuadrado2) );
        System.out.println ("¿Son iguales cuadrado1 y cuadrado3? " + cuadrado1.equals(cuadrado3) ); 
        Circulo circulo1 = new Circulo(2);
        System.out.println("circulo 1 de radio:"+circulo1.radio+" y superficie:"+circulo1.superficie);
        Circulo circulo2 = new Circulo(3);
        System.out.println("circulo 2 de radio:"+circulo2.radio+" y superficie:"+circulo2.superficie);
        Circulo circulo3 = new Circulo(2);
        System.out.println("circulo 3 de radio:"+circulo3.radio+" y superficie:"+circulo3.superficie);
        System.out.println ("¿Son iguales circulo1 y circulo2? " + circulo1.equals(circulo2) );
        System.out.println ("¿Son el mismo objeto circulo1 y circulo2? " + (circulo1 == circulo2) );
        System.out.println ("¿Son iguales circulo1 y circulo3? " + circulo1.equals(circulo3) ); 
    } //Cierre del main
} //Cierre de la clase

Resultado de la ejecución
Citar
cuadrado 1 de lado:3.0 y superficie:9.0
cuadrado 2 de lado:3.0 y superficie:9.0
cuadrado 3 de lado:5.0 y superficie:25.0
¿Son iguales cuadrado1 y cuadrado2? true
¿Son el mismo objeto cuadrado1 y cuadrado2? false
¿Son iguales cuadrado1 y cuadrado3? false
circulo 1 de radio:2.0 y superficie:12.56
circulo 2 de radio:3.0 y superficie:28.259999999999998
circulo 3 de radio:2.0 y superficie:12.56
¿Son iguales circulo1 y circulo2? false
¿Son el mismo objeto circulo1 y circulo2? false
¿Son iguales circulo1 y circulo3? true
« Última modificación: 18 de Noviembre 2017, 19:04 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola, hay algo a lo que no le veo mucho sentido, y es que dentro del constructor de Cuadrado se realice el cálculo del área (idem para el círculo). Los constructores se usan principalmente para inicializar objetos y por ello no parece muy adecuado meter el cálculo del área dentro de un constructor.

Por otro lado, el ejercicio pide que se calcule el área a partir de la dimensión principal. Tú lo has hecho indirectamente, pero en realidad parece que no estás usando la dimensión principal.

Por otro lado, fíjate cómo has duplicado el código del equals en las clases cuadrado y circulo. La idea de usar herencia es evitar repetición de código. Para evitar repetición de código el método equals debería estar en la clase Figura (superclase) en lugar de en las subclases

Puedes ver un ejemplo de solución donde se usa la dimensión principal (para calcular el área, para el método equals dentro de la superclase) en https://www.aprenderaprogramar.com/foros/index.php?topic=2973.msg13450#msg13450

Saludos

LuisM

  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 131
    • Ver Perfil
Hola Alex !! Muchas gracias por tus correcciones que intenté (espero que si) aplicar.  Con respecto a la comparación, primero compara en la clase "hijo" si son la misma figura y en caso de serlo compara en la clase "padre" Figura si tienen la misma dimensiónPrincipal. Además, hay 2 métodos que sobreescriben de la clase "padre" : el cálculo del área y la publicación de la superficie. Paso a dejar el código.
Un saludo,
Luis
Clase TestFiguras - método main
Código: [Seleccionar]
public class TestFiguras{
    public static void main (String [ ] Args) {
        Figura cuadrado1 = new Cuadrado(1); cuadrado1.calcularArea();
        Figura cuadrado2 = new Cuadrado(3); cuadrado2.calcularArea();
        Figura cuadrado3 = new Cuadrado(5); cuadrado3.calcularArea();
        Figura cuadrado4 = new Cuadrado(3); cuadrado4.calcularArea();
        Figura circulo1 = new Circulo(2); circulo1.calcularArea();
        Figura circulo2 = new Circulo(3); circulo2.calcularArea();
        Figura circulo3 = new Circulo(2); circulo3.calcularArea();
        System.out.println("cuadrado 1 de lado:"+cuadrado1.getDimensionPrincipal()+" y superficie:"+cuadrado1.getArea());
        System.out.println("cuadrado 2 de lado:"+cuadrado2.getDimensionPrincipal()+" y superficie:"+cuadrado2.getArea());
        System.out.println("cuadrado 3 de lado:"+cuadrado3.getDimensionPrincipal()+" y superficie:"+cuadrado3.getArea());
        System.out.println("cuadrado 4 de lado:"+cuadrado4.getDimensionPrincipal()+" y superficie:"+cuadrado4.getArea());
        System.out.println(" ");
        System.out.println ("¿Son iguales cuadrado1 y cuadrado2? " + cuadrado1.equals(cuadrado2) );
        System.out.println ("¿Son iguales cuadrado1 y cuadrado3? " + cuadrado1.equals(cuadrado3) ); 
        System.out.println ("¿Son iguales cuadrado4 y cuadrado2? " + cuadrado4.equals(cuadrado2) );
        System.out.println ("¿Son el mismo objeto cuadrado4 y cuadrado2?? " + (cuadrado4 == cuadrado2) );
        System.out.println ("¿Son iguales cuadrado4 y cuadrado3? " + cuadrado4.equals(cuadrado3) );
        System.out.println("----------------------------------------------");
        System.out.println("circulo 1 de radio:"+circulo1.getDimensionPrincipal()+" y superficie:"+circulo1.getArea());
        System.out.println("circulo 2 de radio:"+circulo2.getDimensionPrincipal()+" y superficie:"+circulo2.getArea());
        System.out.println("circulo 3 de radio:"+circulo3.getDimensionPrincipal()+" y superficie:"+circulo3.getArea());
        System.out.println(" ");
        System.out.println ("¿Son iguales circulo1 y circulo2? " + circulo1.equals(circulo2) );
        System.out.println ("¿Son iguales circulo1 y circulo3? " + circulo1.equals(circulo3) );
        System.out.println ("¿Son el mismo objeto circulo1 y circulo3? " + (circulo1 == circulo3) );
        System.out.println("==============================================");
        System.out.println ("¿Son iguales cuadrado2 y circulo2? " + cuadrado2.equals(circulo2) );
    } //Cierre del main
} //Cierre de la clase

Clase "padre" Figura
Código: [Seleccionar]
public class Figura
{
    private float dimensionPrincipal;

    public Figura(float dimensionPrincipal)  {
    this.dimensionPrincipal = dimensionPrincipal;
    }
    public void calcularArea(){
    }
    public double getArea(){
        return 0;
    }
    public float getDimensionPrincipal(){
    return dimensionPrincipal;
    }
    public boolean equals (Object obj) {
           Figura tmpFigura = (Figura) obj;
           if (this.dimensionPrincipal==tmpFigura.dimensionPrincipal) {
                return true; } else { return false; }
    }
}

Clase Cuadrado
Código: [Seleccionar]
public class Cuadrado extends Figura
{
    public float dimensionPrincipal;
    public double superficie;
    public Cuadrado(float dimensionPrincipal){
    super(dimensionPrincipal);
    this.dimensionPrincipal = dimensionPrincipal;
    }

    public void calcularArea() {
    superficie = dimensionPrincipal*dimensionPrincipal;
    }
    public double getArea(){
    return superficie;
    }
    public boolean equals(Object obj){
        if (obj instanceof Cuadrado){
            return super.equals(obj);
        } else {
            return false;
        }
    }
}

Clase Circulo
Código: [Seleccionar]
import java.lang.Math;
public class Circulo extends Figura
{
    public float dimensionPrincipal;
    public double superficie;
    public Circulo(float dimensionPrincipal) {
    super(dimensionPrincipal);
    this.dimensionPrincipal=dimensionPrincipal;
    }

    public void calcularArea() {
        superficie=Math.PI*dimensionPrincipal*dimensionPrincipal;
    }
    public double getArea(){
    return superficie;
    }
    public boolean equals(Object obj){
        if (obj instanceof Circulo){
            return super.equals(obj);
        } else {
            return false;
        }
    }
}

 

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".