2010-01-23 24 views

Respuesta

33

No siempre:

  • una clase puede extender único clase
  • una clase puede implementar más de un interfaz

Sun docs hacer una comparación más detallada:

Clases abstractas frente a interfaces

A diferencia de las interfaces, las clases abstractas pueden contener campos que no son estáticos y finales, y pueden contener métodos implementados. Dichas clases abstractas son similares a las interfaces, excepto que proporcionan una implementación parcial, dejándola en subclases para completar la implementación. Si una clase abstracta contiene solo declaraciones de métodos abstractos, debe declararse como una interfaz.

Se pueden implementar múltiples interfaces por clases en cualquier parte de la jerarquía de clases, independientemente de si están relacionadas entre sí de alguna manera. Piense en Comparable o Cloneable, por ejemplo.

En comparación, las clases abstractas se subclasan más comúnmente para compartir piezas de implementación. Una clase abstracta única se subclasifica por clases similares que tienen mucho en común (las partes implementadas de la clase abstracta), pero también tienen algunas diferencias (los métodos abstractos).

11

En algunos casos, puede utilizar una clase abstracta en lugar de la interfaz. Sin embargo, casi nunca es una buena idea hacerlo. En general, debe usar la regla:

  1. Las interfaces especifican el comportamiento.
  2. Las clases abstractas especifican la implementación.

El otro "problema" con el uso de clases abstractas es que ya no puede implementar mixins, es decir, puede implementar múltiples interfaces, sin embargo, solo puede extender una clase abstracta.

+1

Pero ... al menos puede agregar un método a una clase abstracta sin romper todas las subclases que alguien haya creado. – Trejkaz

+0

@Trejkaz En Java v8 que (probablemente) también será el caso: http://www.javabeat.net/2012/05/virtual-extension-methods-in-java-8/ –

+0

Interesante, finalmente los rasgos entrarán en Java sí mismo, reduciendo la tentación de cambiar a Scala.:) (Por cierto, esquivo este problema en mis API basadas en interfaz al poner todos los métodos de extensión en una clase de utilidad separada ... pero se ve más feo cuando lo llamas). – Trejkaz

5

Para responder a su pregunta, sí podría utilizar una clase abstracta (siempre y cuando no aplicación) en lugar de una interfaz, pero me gustaría considerar esta mala práctica:

  • Usted ha utilizado su "uno -shot "en herencia (sin obtener ningún beneficio).
  • No puede heredar de múltiples clases abstractas, pero puede implementar múltiples interfaces.

Recomendaría el uso de clases abstractas más en situaciones en las que desee proporcionar una implementación parcial de una clase, posiblemente delegando algún comportamiento a implementaciones concretas de subclases.

4
  • Una clase en java puede heredar de múltiples interfaces, pero solo de una clase abstracta.

  • Una interfaz no puede definir cualquier código, en una clase abstracta, puede definir código (es decir, el comportamiento por defecto de los métodos)

4

clases abstractas e interfaces son complementarios.

Por ejemplo, al crear una API, deseará presentar interfaces para el cliente, de modo que siempre puede cambiar completamente la implementación mientras que no tiene que cambiar su código y el usuario no confía en la implementación cuando construye usando su API, pero solo en contratos de métodos.

, entonces tendrá clases abstractas se integra parcialmente estas interfaces, a fin de

  • cuota de un código común que podría ser utilizado en todas (o casi todas) las implementaciones de interfaz, lo cual es obvio
  • proporcionar un comportamiento predeterminado que podría anularse en implementaciones 'reales', por ejemplo, un método toString() utilizando métodos de interfaces para crear una representación textual de la implementación
  • preservar la compatibilidad de implementaciones después de los cambios de interfaz, por ejemplo cuando agrega un nuevo método en su interfaz, usted al por lo que añadir una implementación por defecto en la clase abstracta de modo que las implementaciones (por ejemplo, las realizadas por el usuario) que se extiende la clase abstracta siguen funcionando sin cambios
11

Uno de los puntos que faltan en las respuestas aquí es la idea de que se implementar la interfaz

Si el componente de retorno quiere instancias de tipos abstractos a sus llamadas, donde los tipos de hormigón son definido internamente y oculta a las personas que llaman, utilizar una interfaz. Por el contrario, si su componente consume o acepta instancias de tipos abstractos que sus llamadores debe implementar, clases abstractas son generalmente una mejor opción.

Anticipar la evolución y mantener la compatibilidad binaria da un puntaje a las escalas aquí. Con una clase abstracta, puede agregar métodos y, si proporciona una implementación base, las implementaciones existentes de de la clase abstracta continuarán funcionando bien. Con una interfaz, agregar un método rompe la compatibilidad binaria, ya que es posible que ninguna implementación existente continúe compilando correctamente sin cambiar para definir el nuevo método.

Apache Cactus project tiene a good discussion sobre cómo resolver estas obligaciones.

2

Las interfaces son mucho más limpias y livianas. Las clases abstractas te hacen depender mucho de él ya que no puedes extender ninguna otra clase.

1

Tenga una mirada en el interesante artículo "Why extends is evil" para tener una idea acerca de las diferencias entre la aplicación y la interfaz de la herencia de clases (al lado de las obvias restricciones múltiples individuales)

0

Las clases abstractas son la aplicación parcial de la abstracción mientras que las interfaces son la implementación completa de Abstraction.Means en clases abstractas podemos poner métodos de declaración, así como el cuerpo del método. No podemos crear un objeto de clases abstractas (asociación) y reutilizar la clase por herencia (no por asociación). Por defecto en las interfaces, todas las variables declaradas son estáticas finales y Todos los métodos son públicos.

Por ejemplo: En el JDK sólo hay pocas clases abstractas y HttpServlet es uno de ellos que se utiliza en Servlet.So no podemos crear el objeto de HttpServlet y puede ser utilizado sólo por sucesiones.

1

¿Cuál debería usar, clases abstractas o interfaces?

considerar el uso de clases abstractas si alguna de estas afirmaciones se pueden aplicar a su situación:

  • desea compartir código entre varias clases estrechamente relacionadas.
  • Espera que las clases que amplían su clase abstracta tengan muchos métodos o campos comunes, o que requieran modificadores de acceso que no sean públicos (como los protegidos y los privados).
  • Quiere declarar campos no estáticos o no finales. Esto le permite definir métodos que pueden acceder y modificar el estado del objeto al que pertenecen.

considerar el uso de interfaces de si alguna de estas afirmaciones se pueden aplicar a su situación:

  • Se espera que las clases no relacionadas podrían implementar su interfaz. Por ejemplo, las interfaces Comparable y Cloneable son implementadas por muchas clases no relacionadas.
  • Desea especificar el comportamiento de un tipo de datos en particular, pero no le preocupa quién implementa su comportamiento.
  • Desea aprovechar la herencia de tipo múltiple.

Consulte la documentación de Oracle para obtener más detalles link

0

El uso principal de la interfaz es cuando se crea la referencia de interfaz y llamar al método de la clase particular que se resuelve en tiempo de ejecución. Por lo tanto, siempre es mejor idea crear una referencia de interfaz para llamar al método.

-1

Las interfaces solo pueden contener el método abstracto, también las interfaces pueden implementar múltiples interfaces para cualquier clase. Pero un resumen contiene métodos abstractos y no abstractos, y los métodos abstractos no pueden extenderse a más de una clase.

Cuestiones relacionadas