Así que me encontré con esta prueba de examen donde tenemos que determinar si una parte del código es correcta o no. El execrise se centra en la implementación de interfaces y subclases.

Aquí está el código:

interface Figura {
    public void disegna();
    public boolean equals(Object obj);
}

class Ellisse implements Figura {
    public void disegna() {
        System.out.println("Cerchio");
    }
    public boolean equals(Object obj) {
        return (obj instanceof Ellisse);
    }
}

class Cerchio extends Ellisse {
    public void disegna() {
        super.disegna();
        System.out.println("Cerchio");
    }
    public boolean equals(Object obj) {
        return (obj instanceof Cerchio);
    }
}

Y la pregunta en el ejercicio es: "¿funcionaría el código si elimináramos el método equals? de la clase Ellisse? ¿Por qué?

La respuesta que daría es "no, porque dado que Ellisse hereda el método equals de la interfaz Figura, y dado que Ellisse no se declara abstract, tiene que implementar el método. Si no lo hiciera, heredaría un método abstracto y, por lo tanto, debería declararse abstract ".

Y sin embargo, el código funciona perfectamente. Entonces, ¿qué es lo que me estoy perdiendo?

¡Gracias de antemano por sus respuestas!

1
NoBeardNoParty 15 jun. 2020 a las 22:08

4 respuestas

La mejor respuesta

@user ha señalado correctamente que:

Un método igual con la misma firma también se hereda de la clase Object, por lo que funciona. Si no se hubiera definido en una superclase, no habría funcionado.

A la pregunta principal:

¿Es obligatoria la palabra clave "abstracta" en las clases que tienen al menos un método abstracto (Java)?

Si. Puedes ir hacia atrás para demostrarlo. Si algún método se declara como abstract, la clase también debe ser abstract.

Pero esta afirmación no funciona al revés. Una clase se puede declarar abstract sin abstract métodos. Eso es totalmente legal.

1
Jenea Vranceanu 15 jun. 2020 a las 19:23

Existe el método igual Creo que la interfaz comparable que implementa la clase de objeto que es la principal para todas las clases de objetos, por lo tanto, en resumen, el código de arriba simplemente sombrea el de la clase principal.

0
Tehillah kangamba 15 jun. 2020 a las 19:26

Figura es una interfaz y las interfaces son básicamente como contratos cuyos métodos DEBEN ser implementados por cualquier clase que los implemente. Sin embargo, en este caso, el método es igual a cuya implementación ya es proporcionada por la superclase de objetos, por lo que incluso si se elimina, aún está bien.

1
Mohammad Al-Huneidi 15 jun. 2020 a las 19:19

La clase java.lang.Object define un método con la misma firma exacta que el método equals() en la interfaz Figura, a saber:

public boolean equals(Object obj)

Y dado que cada clase se extiende java.lang.Object (ya sea directa o indirectamente), cada clase ya implementa uno de los métodos en la interfaz Figura. De hecho, la interfaz Comparator declara el método equals() también, pero cualquier clase que implemente Comparator solo necesita implementar su método compare() por la misma razón.

Por lo tanto, dado que la clase Ellisse hereda el método equals() de su clase principal, no tiene que implementar explícitamente ese método para que implemente la interfaz Figura.

1
Abra 15 jun. 2020 a las 19:23