Las clases e interfaces abstractas se utilizan para la abstracción en Java. La abstracción en la programación orientada a objetos se refiere a ocultar los detalles de implementación a los usuarios finales.
En abstracción, puede saber cuáles son las funcionalidades, pero no puede saber cómo se implementaron.
Veamos cada uno de ellos y tratemos de entender por qué se usan.
Abstract Class
Una clase que no se puede instanciar como un objeto y que puede tener o no métodos abstractos se denomina clase abstracta en Java. Un método abstracto es un método que no tiene un cuerpo de implementación cuando se declara.

Puede crear una clase abstracta especificando el abstract
palabra clave antes de la class
palabra clave.
abstract class abstractClass {
void run() {
System.out.println("ran");
}
}
Una clase abstracta puede ser extendida por otras clases. En otras palabras, también se puede subclasificar.
abstract class AbstractClass {
void run() {
System.out.println("ran");
}
}
class ExtendingAbstractClass extends AbstractClass {
void newMethod() {
System.out.println("new");
}
@Override
void run() {
System.out.println("override");
}
}
Las clases abstractas se utilizan para implementar métodos comunes entre varias clases que amplían una clase abstracta determinada. Además, la capacidad de definir métodos abstractos dentro de clases abstractas los hace increíblemente útiles para las clases que tienen métodos similares pero con diferentes implementaciones. Tomemos un ejemplo.
Considere un automóvil que tiene algunas funcionalidades, como arranque, parada, marcha atrás, etc. Estas funcionalidades son comunes entre todos los tipos de automóviles.
Pero, ¿qué pasa con las funcionalidades de automatización como la conducción autónoma? La implementación de esas funcionalidades puede diferir para diferentes tipos de automóviles. Veamos cómo puede crear un programa orientado a objetos relacionado con él.
En primer lugar, cree un Car
clase que se ampliará con múltiples clases de diferentes tipos de automóviles.
abstract class Car {
void start() {
// implementation
System.out.println("runs car");
}
void stop() {
// implementation
System.out.println("engine stops");
}
void reverse() {
// implementation
System.out.println("reverse mode enabled");
}
abstract void selfDrive();
}
El método start()
, stop()
y reverse()
son métodos que son comunes en todos los coches. Por lo tanto, su implementación ya está definida dentro de la propia clase Car. Sin embargo, un determinado tipo de automóvil puede tener diferentes implementaciones del modo de conducción autónoma. Y así, se puede definir selfDrive()
como un método abstracto e implementarlo de diferentes maneras en diferentes clases de diferentes tipos de autos.
class CarTypeA extends Car {
@Override
void start() {
super.start();
}
@Override
void stop() {
super.stop();
}
@Override
void reverse() {
super.reverse();
}
void selfDrive() {
// custom implementation
System.out.println("Type A self driving mode enabled");
}
}
class CarTypeB extends Car {
// ...all similar methods
void selfDrive() {
// custom implementation
// different implementation than CarTypeB
System.out.println("Type B self driving mode enabled");
}
}
Es importante tener en cuenta que, si una subclase no implementa todos los métodos abstractos definidos en la clase abstracta, entonces debe declararse como una clase abstracta.
Interface
Una interfaz es una forma de decirle a una clase qué métodos debe implementar. Por ejemplo, si considera el ejemplo de un automóvil, tiene algunas funciones básicas. Puede arrancar, moverse y detenerse. Estas funciones son comunes en todos los coches.
Entonces, si implementa una interfaz de un automóvil en una clase, debe implementar todos los métodos para que el automóvil funcione de manera adecuada y segura.
Al igual que las clases abstractas, no podemos instanciar o crear objetos de una interfaz. Puede considerarse una clase completamente abstracta porque contiene solo métodos abstractos, es decir, métodos sin un cuerpo de implementación.
Puede crear una interfaz utilizando el interface
palabra clave.
interface CAR {
void start();
void stop();
void move();
}
Implementar una interfaz usando el implements
palabra clave al definir una clase.
class CarTypeB implements CAR {
public void start() {
System.out.println("started");
}
public void stop() {
System.out.println("stopped");
}
public void move() {
System.out.println("running");
}
}
Similarity
Ninguna instanciación como objeto es lo único que tienen en común las clases abstractas y las interfaces.
Differences
Clase abstracta | Interfaz | |
Herencia e Implementación | Una clase solo puede heredar una clase abstracta. | Una clase puede implementar múltiples interfaces. |
Tipos de variables | Puede tener variables finales, no finales, estáticas y no estáticas. | Solo puede tener variables estáticas y finales. |
Tipos de métodos | Puede contener tanto métodos abstractos como no abstractos. | Solo puede contener métodos abstractos, pero los métodos estáticos son una excepción. |
Modificadores de acceso | Una clase abstracta puede tener un modificador de acceso. | Las firmas de métodos definidas en la interfaz son públicas de forma predeterminada. Una interfaz no tiene un modificador de acceso. |
Constructores y Destructores | Puede declarar constructores y destructores. | No puede declarar constructores o destructores. |
Velocidad | Rápido | Lenta |
When to use abstract class and interface?
Use clases abstractas cuando:
- Desea compartir algunos métodos y campos comunes entre varias clases.
- Declarando
non-static
ynon-final
campos para modificar el estado del objeto al que están vinculados.
Puede utilizar interfaces cuando:
- Desea definir el comportamiento de una clase que implementa la interfaz, pero no le importa la forma en que se implementa.
- Desea asegurarse de que una clase implemente todos los métodos para funcionar correctamente.
Palabras finales
Las interfaces se utilizan principalmente para crear API porque pueden proporcionar una estructura para implementar la funcionalidad sin preocuparse por la implementación real.
Las clases abstractas se utilizan generalmente para compartir métodos abstractos y no abstractos comunes entre varias clases, lo que amplía la clase abstracta para que el código sea más reutilizable.
Aprenda más sobre Java con la ayuda de estos cursos en linea para java. ¿Te estás preparando para una entrevista en Java? Aquí están algunas preguntas de la entrevista sobre Programación Orientada a Objetos.