JavaRush /Blog Java /Random-ES /Diez preguntas de la entrevista Java sobre interfaces y c...

Diez preguntas de la entrevista Java sobre interfaces y clases abstractas

Publicado en el grupo Random-ES
Las clases e interfaces abstractas son muy populares en todos los lenguajes de programación orientados a objetos. Y en casi todas las entrevistas sobre Java te encuentras con al menos una pregunta sobre este tema. Las interfaces se mencionan con más frecuencia debido a su popularidad entre los diseñadores de software, pero de vez en cuando también surgen preguntas sobre las clases abstractas. Estas últimas se preguntan con mayor frecuencia a los solicitantes para el puesto de desarrolladores junior, digamos, con no más de dos años de experiencia en el desarrollo de Java, mientras que las preguntas sobre interfaces se encuentran con mayor frecuencia durante las entrevistas con aquellos cuya experiencia ya ha superado los cuatro años. Generalmente se formulan junto con otras preguntas sobre los patrones de diseño de Java, como los patrones Decorator o Factory. 10 preguntas de la entrevista Java sobre interfaces y clases abstractas - 1En este artículo, veremos preguntas comunes sobre clases e interfaces abstractas que se formularon en varios niveles de entrevistas sobre Java. La mayoría de ellos no deberían ser difíciles ni siquiera para un programador Java novato. En su mayoría son preguntas de conocimiento puro, pero algunas de ellas, como las diferencias entre clases abstractas e interfaces en Java, o cuándo elegir una clase abstracta en lugar de una interfaz , pueden ser bastante complicadas. Le ofrecemos una docena de preguntas interesantes sobre el tema.
Si alguna vez le hicieron una pregunta en una entrevista o tuvo que hacer alguna pregunta valiosa sobre clases e interfaces abstractas, pero no está en esta lista, compártala en los comentarios.

1. ¿Puede una clase abstracta tener constructores en Java?

Sí, en una clase abstracta en Java puedes declarar y definir constructores. Dado que es imposible crear instancias de clases abstractas, dicho constructor sólo se puede llamar cuando se forma una cadena de constructores, es decir, cuando se crea una instancia de una clase de implementación específica. Pero imagina que el entrevistador luego hace la pregunta: ¿de qué sirve un constructor si de todos modos no puedes crear una instancia de una clase abstracta? El punto es que todavía se puede usar para establecer los valores iniciales de variables comunes declaradas en una clase abstracta y utilizadas por varias implementaciones. Incluso si no declara ningún constructor, el compilador agregará un constructor predeterminado sin argumentos a la clase abstracta. Sin él, su subclase no se compilará porque la primera declaración en cualquier constructor es una llamada implícita super()al constructor de superclase predeterminado en Java.

2. ¿Pueden las clases abstractas en Java implementar interfaces? ¿Tienen que implementar todos los métodos?

Sí, las clases abstractas pueden implementar interfaces usando implements. Como son abstractos, no es necesario que implementen todos los métodos. Tener una clase base abstracta y una interfaz para declarar el tipo es una práctica recomendada. Un ejemplo es una interfaz java.util.Listy la clase abstracta correspondiente java.util.AbstractList. Debido a AbstractListque implementa todos los métodos comunes, las implementaciones específicas (como LinkedListy ArrayList) no tienen que implementar todos los métodos, como sería el caso si implementaran la interfaz Listdirectamente. Esta solución combina el beneficio de utilizar una interfaz para declarar un tipo con la flexibilidad de una clase abstracta para implementar todo el comportamiento común en un solo lugar. En el libro de Joshua Bloch "Java. Programación efectiva” tiene un excelente capítulo sobre el tema del uso de interfaces y clases abstractas en Java, para una mejor comprensión tiene sentido estudiarlo.

3. ¿Puede una clase abstracta ser definitiva?

No, no puede. La palabra clave finalsignifica que la clase está en la cima de la jerarquía y no puede tener descendientes. Y una clase abstracta sin herederos es un caballo esférico en el vacío, ya que es imposible crear una instancia abstract class. Por lo tanto, si una clase es a la vez abstracty final, entonces no tiene descendientes y no se puede crear una instancia. El compilador de Java arrojará un error si crea una clase abstracty final.

4. ¿Puede una clase abstracta en Java tener métodos estáticos?

Sí, las clases abstractas pueden declarar y definir métodos estáticos. Solo es necesario seguir los principios generales de creación de métodos estáticos en Java, ya que no son deseables en el diseño orientado a objetos, porque no es posible anular métodos estáticos en Java. Los métodos estáticos en una clase abstracta son muy raros, pero si hay buenas razones para ello, no hay nada que le impida usarlos.

5. ¿Es posible crear una instancia de una clase abstracta?

No, no puedes hacer esto. La esencia de una clase abstracta es que no está completa y debe completarse en sus clases descendientes. Es decir, esta clase no está lista para su uso. Por ejemplo, puede que le falte la implementación de algunos métodos. Como una clase no está lista para su uso, su objeto no se puede crear. Pero puedes crear instancias de herederos de una clase abstracta. El compilador de Java arrojará un error si un programa intenta crear una instancia de una clase abstracta.

6. ¿Es necesario que una clase abstracta tenga métodos abstractos?

No, una clase abstracta no puede tener ningún método abstracto. Puede hacer que una clase sea abstracta en Java simplemente usando una palabra clave abstracten su declaración. El compilador aplicará cualquier restricción estructural, como no permitir la creación de instancias de esta clase. Por cierto, la cuestión de si debería haber métodos abstractos en una clase o interfaz abstracta es controvertida. Me parece que una clase abstracta debería tener métodos abstractos, ya que esto es lo primero en lo que piensa un programador cuando ve una clase abstracta. Esto encaja bien con el principio de minimizar las sorpresas.

7. ¿Cuáles son las diferencias entre una clase abstracta y una interfaz en Java?

Esta es la pregunta de entrevista Java más importante y una de las más clásicas. No puedo contar cuántas veces he visto esta pregunta en entrevistas de Java en todos los niveles. Lo que hace interesante esta pregunta es, en particular, la posibilidad que tiene el solicitante de dar un ejemplo. Responder preguntas sobre los conceptos básicos de la programación orientada a objetos, como la abstracción, la encapsulación, el polimorfismo y la herencia, es fácil, pero cuando se trata de matices tan sutiles, los solicitantes de empleo a menudo se confunden y dicen lo primero que les viene a la mente. La respuesta a esta pregunta merece un artículo aparte (especialmente después de los cambios en Java 8), pero en resumen:
  • Una interfaz describe sólo el comportamiento (métodos) de un objeto, pero no tiene estados (campos) (excepto public static final), mientras que una clase abstracta puede tenerlos.

  • Una clase abstracta se hereda (se extiende) y se implementa una interfaz (implementa). Podemos heredar sólo una clase, pero implementar tantas interfaces como queramos. Una interfaz puede extender (extender) otra(s) interfaz(es) otra(s).

  • Las clases abstractas se utilizan cuando existe una relación "es-a", es decir, la subclase extiende la clase abstracta base y las interfaces pueden ser implementadas por diferentes clases que no están relacionadas entre sí.

8. ¿Cuándo tiene sentido preferir una clase abstracta a una interfaz y viceversa?

Esta es una continuación de preguntas anteriores sobre clases e interfaces abstractas. Si sabes cuáles son sus diferencias sintácticas, entonces responder a esta pregunta no te causará problemas, ya que son el factor determinante a la hora de tomar una decisión. Dado que es casi imposible agregar un nuevo método a una interfaz publicada, es mejor utilizar una clase abstracta en caso de que sea necesario un mayor desarrollo. Desarrollar clases abstractas en Java es más fácil que desarrollar interfaces. Asimismo, si una interfaz tiene demasiados métodos e implementarlos todos se convierte en un verdadero dolor de cabeza, es mejor crear una clase abstracta para la implementación predeterminada. Este patrón se sigue en el paquete de colecciones de Java; la clase abstracta AbstractListproporciona la implementación predeterminada para List. Utilice clases abstractas si:
  • Quiere compartir código entre varias clases estrechamente relacionadas.

  • Es de esperar que las clases que amplían su clase abstracta tengan muchos métodos o campos en común, o que requieran modificadores de acceso distintos de public(por ejemplo, protectedy private).

  • Quiere declarar не-finalcampos o no estáticos. Esto le permite definir métodos que pueden acceder y cambiar el estado del objeto al que pertenecen.
Utilice interfaces si:
  • Espera que clases no relacionadas implementen su interfaz. Por ejemplo, las interfaces Comparabley Cloneableson implementadas por muchas clases no relacionadas.

  • Quiere definir el comportamiento de un tipo de datos en particular, pero no le importa quién lo implementa.

  • Quiere utilizar herencia de tipos múltiples.

9. ¿Qué es un método abstracto en Java?

Un método abstracto es un método sin cuerpo. Simplemente declaras un método sin definirlo, usando una palabra clave abstracten la declaración del método. Todos los métodos declarados dentro de una interfaz en lenguaje Java son abstractos por defecto. A continuación se muestra un ejemplo de un método abstracto en Java:
public void abstract printVersion();
Ahora, para implementar este método, necesita extender la clase abstracta y anular este método.

10. ¿Puede una clase abstracta en Java contener un método main?

Sí, una clase abstracta en Java puede contener un método main, porque es simplemente otro método estático, y una clase abstracta se puede ejecutar usando el método main, siempre y cuando no se cree una instancia de ella. Eso es todo lo que quería decirte. Y recuerde: las clases e interfaces abstractas son decisiones de diseño clave en el proceso de diseño y análisis orientado a objetos y, por supuesto, deben usarse con la debida precaución si desea crear un sistema flexible.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION