una sirve resueltos que para interfaz interfaces entre ejercicios ejemplo diferencia clases clase abstractas abstracta java interface abstract-class

sirve - ejercicios resueltos de clases abstractas en java



¿La clase abstracta extiende el objeto? (10)

Cada clase extiende el objeto. Incluso una clase abstract extiende el Objeto, pero una clase abstracta está incompleta . No se le permite crear una instancia de una clase abstracta, y cualquier clase que extienda una clase abstracta debe proporcionar todos los métodos faltantes, o también debe ser declarada abstracta.

¿Esto daría lugar a un error de compilación?

Pruébalo y verás!

He leído sobre la diferencia entre interfaces y clases abstractas, pero esta es confusa. Considera esta interfaz y clase.

interface I { public int hashCode(); public boolean equals(Object obj); } class B implements I { // Works Fine }

Aquí funciona bien y no necesito anular los métodos de interfaz porque Object es una súper clase de B y esos métodos se implementan en ella.

Ahora considera estos

abstract class A { public abstract int hashCode(); public abstract boolean equals(Object obj); } class C extends A { // Compile error because methods are not overridden }

¿Por qué esto resultaría en un error de compilación? ¿Significa esto que el objeto no es una súper clase para la clase abstracta? ¿O me estoy perdiendo algún punto?


Cada vez que extienda una clase abstracta, debe asegurarse de que TODOS los métodos de la clase abstracta deben implementarse en la subclase o, de lo contrario, se producirá un error de compilación.


Como ya lo mencionaron otros, la clase A reemplaza esos métodos en Object al declararlos de nuevo como abstractos, por lo que obliga a las subclases a implementarlos.

Como aclaración de su situación, intente definir A siguiente manera:

abstract class A { //public abstract int hashCode(); //public abstract boolean equals(Object obj); } class C extends A { // no compile error because no abstract methods have to be overridden }

En este caso, tanto A como C heredan la implementación de esos métodos de Object y no se produce ningún error de compilación.


Da como resultado un error de compilación porque, por definición, las funciones abstractas deben implementarse en la cadena de herencia. Ha creado el requisito de que deben implementarse en una subclase de A

La clase C no implementa esos métodos, así que falla la compilación.

Object es una superclase de clases abstractas ... pero no es una subclase , y las subclases son responsables de implementar funciones abstractas.

En contraste, si una clase implementa una interfaz, la implementación puede vivir en cualquier lugar de la jerarquía de herencia de esa clase. Es menos común que esas implementaciones se encuentren en una superclase, porque generalmente declararías la interfaz en la superclase.

Hay casos de uso en los que puede que no, como el diseño deficiente o degenerado, o ejemplos como este, mientras revisa las características del idioma.


El objeto es una super clase de todas las clases, abstractas o no.

Creo que cuando declara una clase como abstracta y declara en sus métodos abstractos, obliga a cualquier subclase a implementarlas, independientemente de si una superclase de la clase abstracta ya los implementa.

Esto no tiene nada que ver con la clase Objeto. Obtendrá el mismo comportamiento si crea todas las clases usted mismo:

public class A { public int someMethod () { return 1; } } public abstract class B extends A { public abstract int someMethod (); } public class C extends B { }

Esto dará el error de compilación. The type C must implement the inherited abstract method B.someMethod() , aunque A ya lo implemente.


Este es un caso extraño, realmente a primera vista puede esperarse que sea un error del compilador para declarar la clase A abstracta de esa manera.

De hecho, hay algunas razones (poco comunes) que podrías querer. Por ejemplo, si desea asegurarse de que todos los que usen la clase A hayan implementado sus iguales y hashcode en lugar de confiar en la versión del Objeto, entonces podrían hacerlo.

La explicación real del comportamiento es que para ampliar la clase A, debe cumplir con todos los requisitos que la clase A le presenta.

En este caso particular, la clase A está diciendo que las subclases necesitan implementar estos métodos, el hecho de que una súper clase los haya implementado es irrelevante, está agregando un requisito más específico en sí mismo.

No hay nada especial sobre Objeto aquí:

abstract class A { public abstract int hashCode(); public abstract boolean equals(Object obj); public void test() { } } abstract class B extends A { public abstract void test(); }

Ahora si intentas definir:

class C extends B { public int hashCode() { return 1; } public boolean equals(Object ob) { return false; } }

Entonces fallará diciendo que C is not abstract and does not override abstract method test() in B


Sí, el objeto es una super clase de clase abstracta. Puede probar que usa la anotación @Override para ayudarlo.

Ver, no hay error en el siguiente código:

abstract class A { @Override public abstract int hashCode(); @Override public abstract boolean equals(Object obj); }


Sí, la clase abstracta amplía la clase de objeto. Y hereda las propiedades de la clase de objeto. No deberíamos estar confundidos aquí que la clase abstracta no puede ser instanciada. Eso sucederá en la subclase de la clase abstracta, pero en la clase abstracta podemos instanciar la clase de objeto y podemos anular la implementación básica. Así que la clase de objeto puede ser heredada de una clase abstracta.


Su clase abstracta tiene métodos virtuales (métodos sin implementación) solamente. Esto significa que existen en la interfaz de la clase, por lo que alguien podría llamarlos. Tal llamada, en su caso contra hashCode o equals , resultaría en un error de tiempo de ejecución ya que estos métodos no están implementados. El compilador evita que esto suceda al generar un error de compilador.


Cada clase extiende el objeto . (padre de todas las clases) es un error de compilación porque debes proporcionar el cuerpo de una clase abstracta. Y tu clase abstracta tiene métodos pero sin cuerpo.