Java Language Clases abstractas


Ejemplo

Una clase abstracta es una clase marcada con la palabra clave abstract . Contrariamente a la clase no abstracta, puede contener métodos abstractos sin implementación. Sin embargo, es válido crear una clase abstracta sin métodos abstractos.

Una clase abstracta no puede ser instanciada. Puede ser subclasificado (extendido) siempre que la subclase sea abstracta, o implemente todos los métodos marcados como abstractos por súper clases.

Un ejemplo de una clase abstracta:

public abstract class Component {
    private int x, y;
    
    public setPosition(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public abstract void render();
}

La clase debe estar marcada como abstracta, cuando tiene al menos un método abstracto. Un método abstracto es un método que no tiene implementación. Se pueden declarar otros métodos dentro de una clase abstracta que tiene implementación para proporcionar código común para cualquier subclase.

Intentar crear una instancia de esta clase proporcionará un error de compilación:

//error: Component is abstract; cannot be instantiated   
Component myComponent = new Component();

Sin embargo, una clase que amplía el Component y proporciona una implementación para todos sus métodos abstractos y se puede instanciar.

public class Button extends Component {

    @Override
    public void render() {
        //render a button
    }
}

public class TextBox extends Component {

    @Override
    public void render() {
        //render a textbox
    }
}

Las instancias de clases heredadas también se pueden convertir como la clase principal (herencia normal) y proporcionan un efecto polimórfico cuando se llama al método abstracto.

Component myButton = new Button();
Component myTextBox = new TextBox();

myButton.render(); //renders a button
myTextBox.render(); //renders a text box

Clases abstractas vs interfaces

Tanto las clases abstractas como las interfaces proporcionan una forma de definir firmas de métodos al tiempo que requieren que la clase extendida / implementada proporcione la implementación.

Hay dos diferencias clave entre las clases abstractas y las interfaces:

  • Una clase solo puede extender una sola clase, pero puede implementar muchas interfaces.
  • Una clase abstracta puede contener campos de instancia (no static ), pero las interfaces solo pueden contener campos static .
Java SE 8

Los métodos declarados en las interfaces no pueden contener implementaciones, por lo que se usaron clases abstractas cuando fue útil proporcionar métodos adicionales que las implementaciones llamaron métodos abstractos.

Java SE 8

Java 8 permite que las interfaces contengan métodos predeterminados , generalmente implementados usando los otros métodos de la interfaz , haciendo que las interfaces y las clases abstractas sean igualmente poderosas en este sentido.

Subclases anónimas de clases abstractas

Como conveniencia, java permite crear instancias anónimas de subclases de clases abstractas, que proporcionan implementaciones para los métodos abstractos al crear el nuevo objeto. Usando el ejemplo anterior, esto podría verse así:

Component myAnonymousComponent = new Component() {
    @Override
    public void render() {
        // render a quick 1-time use component
    }
}