Diferencia clave: la interfaz o un protocolo es una forma común que permite que los objetos no relacionados se comuniquen entre sí. Representa un comportamiento acordado que facilita la interacción entre los dos objetos. Una clase abstracta es una clase de objetos que no se pueden crear instancias o instancias de un objeto. Esta clase puede no tener implementación o puede tener implementación incompleta.

Java es un lenguaje de programación, que ha sido influenciado por el lenguaje C. Deriva gran parte de su sintaxis de C y C ++, sin embargo, tiene menos facilidades de bajo nivel que cualquiera de ellas. Java es un lenguaje de programación de propósito general que está diseñado para tener menos dependencias de implementación en comparación con los lenguajes anteriores. Es un lenguaje concurrente, basado en clases y orientado a objetos.
Java fue desarrollado por James Gosling en Sun Microsystems y se lanzó en 1995. Originalmente se lanzó como un componente central de la plataforma Java de Sun Microsystems. Sun ha vuelto a licenciar la mayoría de sus tecnologías Java bajo la Licencia Pública General de GNU. Esto significa que toda la tecnología licenciada bajo GNU General Public License es de código abierto y generalmente está disponible de forma gratuita. Sun Microsystems finalmente se fusionó con Oracle Corporation. A partir de 2012, Java se ha convertido en uno de los lenguajes de programación más populares para el uso. Esto es especialmente cierto para las aplicaciones web cliente-servidor. Muchos otros sistemas han desarrollado implementaciones alternativas de tecnologías Sun, como el compilador GNU para Java y Classpath de GNU.

Una clase abstracta es una clase de objetos que no se pueden crear instancias o instancias de un objeto. Esta clase puede no tener implementación o puede tener implementación incompleta. También puede tener métodos abstractos o propiedades compartidas por todas las subclases. En algunos lenguajes de programación, los tipos abstractos sin implementación se conocen como interfaces. En Java, se puede crear un tipo abstracto utilizando la palabra clave "abstracto" en la definición de clase. El propósito de tener una clase abstracta para colocar todos los métodos que no están implementados en la clase abstracta y dejar que la subclase determine cómo implementar estas clases. Si una clase tiene un solo método abstracto, la clase debe declararse como una clase abstracta, aunque no es necesario tener al menos un método único para declarar un resumen de clase.
Malliktalksjava.in enumera las principales diferencias entre la interfaz y el resumen como:
- La clase abstracta tiene el constructor, pero la interfaz no.
- Las clases abstractas pueden tener implementaciones para algunos de sus miembros (Métodos), pero la interfaz no puede tener implementación para ninguno de sus miembros.
- Las clases abstractas deben tener subclases que serán inútiles.
- Las interfaces deben tener implementaciones de otras clases que serán inútiles.
- Solo una interfaz puede extender otra, pero cualquier clase puede extender una clase abstracta.
- Todas las variables en las interfaces son finales por defecto
- Las interfaces proporcionan una forma de herencia múltiple. Una clase puede extender solo una clase más.
- Las interfaces están limitadas a métodos públicos y constantes sin implementación. Las clases abstractas pueden tener una implementación parcial, partes protegidas, métodos estáticos, etc.
- Una clase puede implementar varias interfaces. Pero en el caso de una clase abstracta, una clase puede extender solo una clase abstracta.
- Las interfaces son lentas, ya que requiere una dirección indirecta adicional para encontrar el método correspondiente en la clase real. Las clases abstractas son rápidas.
- Se permite el modificador de accesibilidad (Público / Privado / interno) para la clase abstracta. La interfaz no permite el modificador de accesibilidad
- Una clase abstracta puede contener métodos completos o incompletos. Las interfaces solo pueden contener la firma de un método, pero ningún cuerpo. Por lo tanto, una clase abstracta puede implementar métodos, pero una interfaz no puede implementar métodos.
- Una clase abstracta puede contener campos, constructores o destructores e implementar propiedades. Una interfaz no puede contener campos, constructores o destructores y solo tiene la firma de la propiedad pero no la implementación.
- Varios modificadores de acceso, como abstractos, protegidos, internos, públicos, virtuales, etc. son útiles en las clases abstractas pero no en las interfaces.
- El alcance abstracto depende de la clase derivada.
- El alcance de la interfaz está a cualquier nivel de su cadena de herencia.
La información para la tabla es cortesía de codeproject.com y mindprod.com
Interfaz | Clase abstracta | |
Herencia múltiple | Una clase puede heredar varias interfaces. | Una clase puede heredar solo una clase abstracta. |
Implementación por defecto | Una interfaz no puede proporcionar ningún código, solo la firma. | Una clase abstracta puede proporcionar un código completo, predeterminado y / o solo los detalles que deben anularse. |
Modificadores de acceso | Una interfaz no puede tener modificadores de acceso para las subs, funciones, propiedades, etc., todo se asume como público. | Una clase abstracta puede contener modificadores de acceso para las subs, funciones, propiedades. |
Núcleo vs. Periférico | Las interfaces se utilizan para definir las habilidades periféricas de una clase. En otras palabras, tanto el Humano como el Vehículo pueden heredar de una interfaz IMvable. | Una clase abstracta define la identidad central de una clase y allí se usa para objetos del mismo tipo. |
Homogeneidad | Si varias implementaciones solo comparten firmas de métodos, entonces es mejor usar interfaces. | Si varias implementaciones son del mismo tipo y usan un comportamiento o estado común, es mejor usar la clase abstracta. |
Velocidad | Requiere más tiempo para encontrar el método real en las clases correspondientes. | Rápido |
Añadiendo funcionalidad | Si agregamos un nuevo método a una Interfaz, entonces tenemos que rastrear todas las implementaciones de la interfaz y definir la implementación para el nuevo método. | Si agregamos un nuevo método a una clase abstracta, tenemos la opción de proporcionar una implementación predeterminada y, por lo tanto, todo el código existente podría funcionar correctamente. |
Campos y constantes | No se pueden definir campos en las interfaces. | Una clase abstracta puede tener campos y constantes definidos. |
Brevedad | Las constantes declaraciones en una interfaz son todas presuntas públicas estáticas finales. | El código compartido se puede agregar a una clase abstracta. |
Constantes | Solo las constantes finales estáticas, se pueden usar sin calificación en las clases que implementan la interfaz. | Tanto las constantes de instancia como las estáticas son posibles. Tanto el código estático como el código de instancia de instancia también son posibles para calcular las constantes. |
Conveniencia de terceros | Se puede agregar una implementación de interfaz a cualquier clase de tercero existente. | Una clase de terceros debe reescribirse para extenderse solo desde la clase abstracta. |
is-a vs. -able o can-do | Las interfaces a menudo se usan para describir las habilidades periféricas de una clase, no su identidad central, por ejemplo, una clase Automóvil podría implementar la interfaz Reciclable, que podría aplicarse a muchos objetos que no están relacionados en absoluto. | Una clase abstracta define la identidad central de sus descendientes. Las interfaces implementadas enumeran las cosas generales que puede hacer una clase, no las cosas que es una clase. En un contexto de Java, los usuarios normalmente deben implementar la interfaz Runnable en lugar de extender Thread, ya que no están realmente interesados en proporcionar alguna nueva funcionalidad de Thread, normalmente solo quieren que un código tenga la capacidad de ejecutarse de forma independiente. Quieren crear algo que pueda ejecutarse en un hilo, no un nuevo tipo de hilo. El debate similar is-a vs. has-a surge cuando usted decide heredar o delegar. |
Enchufar | El usuario puede escribir un nuevo módulo de reemplazo para una interfaz que no contenga un solo código de código en común con las implementaciones existentes. Cuando el usuario implementa la interfaz, comienza desde cero sin ninguna implementación predeterminada. El usuario tiene que obtener herramientas de otras clases; nada viene con la interfaz más que unas pocas constantes. Esto le da al usuario la libertad de implementar un diseño interno radicalmente diferente. | El usuario debe usar la clase abstracta tal como está para el código base, con todo el equipaje que lo acompaña, bueno o malo. El autor de la clase abstracta ha impuesto estructura al usuario. |
Mantenimiento | Si el código del cliente habla solo en términos de una interfaz, puede cambiar fácilmente la implementación concreta detrás de él, utilizando un método de fábrica. | Si el código del cliente habla solo en términos de una clase abstracta, puede cambiar fácilmente la implementación concreta detrás de él, utilizando un método de fábrica. |