[Palabras clave de Java] abstracción abstracta

Existen clases abstractas para herencia (reescritura). Si se define una clase abstracta pero no se hereda, es inútil. Por supuesto, después de la herencia, la clase debe implementar todos los métodos no implementados en la clase padre, de lo contrario no está permitido (a menos que sea una clase abstracta heredada por una clase abstracta, que puede no implementarse en este momento).

clase abstracta

Las clases con métodos abstractos deben ser clases abstractas. Las clases abstractas, como las clases ordinarias, no pueden tener métodos abstractos, y pueden tener variables miembro y métodos miembro ordinarios.
Debido a que la clase abstracta contiene métodos que no tienen una implementación concreta, ¡no puede usar la clase abstracta para crear objetos de instancia!
Puede haber métodos estáticos, a los que puede llamar el objeto instanciado de la subclase después de ser heredado por la subclase ; también puede llamarse directamente por el nombre de clase de la clase y subclase abstracta, al igual que otros métodos estáticos. También se puede acceder a las mismas variables estáticas utilizando el mismo método.
Por supuesto, puede haber una clase que solo esté decorada con resumen, pero no existe un método abstracto. Esta también es una clase abstracta y no se puede instanciar. Si no hay un método abstracto, ¿por qué debería diseñarse como una clase abstracta?

AbstractStringBuilder.class (jdk1.8)

//有抽象方法的类,必须是抽象类。public abstract String toString()
abstract class AbstractStringBuilder implements Appendable, CharSequence {
    char[] value;
    int count;
    AbstractStringBuilder() {
    }
    AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }
    //一个类,只用abstract修饰,但是却没有抽象方法,这也属于抽象类,是不可以实例化的
	public AbstractStringBuilder append(char[] str) {
	        int len = str.length;
	        ensureCapacityInternal(count + len);
	        System.arraycopy(str, 0, value, count, len);
	        count += len;
	        return this;
	    }
	@Override
    public AbstractStringBuilder append(char c) {
        ensureCapacityInternal(count + 1);
        value[count++] = c;
        return this;
    }
	@Override
	public abstract String toString();//因为抽象类中含有无具体实现的方法,所以不能用抽象类创建实例对象!
}

método abstracto

No puede haber métodos abstractos estáticos en las clases abstractas de Java.
Las clases abstractas no se pueden instanciar, es decir, no se les puede asignar memoria; y los métodos modificados estáticamente no asignan memoria antes de que se instancia la clase, por lo que aparece una contradicción: las clases abstractas no se pueden asignar memoria, y los métodos estáticos deben La memoria está asignada. Por lo tanto, no puede haber métodos abstractos estáticos en la clase abstracta.
Además, el propósito de definir un método abstracto es reescribir este método, pero si se define como un método estático, no se puede reescribir.

Clase abstracta y comparación de interfaz

Diferencia gramatical

La interfaz solo puede tener métodos abstractos públicos, la clase abstracta tiene más tipos de métodos y puede tener métodos ordinarios;
las variables miembro en la interfaz solo pueden ser de tipo final público estático, la clase abstracta tiene más tipos de variables y puede tener variables ordinarias; la
interfaz No puede contener bloques de código estático y métodos estáticos, y las clases abstractas pueden tener bloques de código estático y métodos estáticos;
una clase solo puede heredar una clase abstracta, pero una clase puede implementar múltiples interfaces.

Diferencias de diseño

  1. Una clase abstracta es una abstracción de las cosas (abstracción de clase), y una interfaz es una abstracción del comportamiento.
    Por ejemplo, Bird es una clase abstracta, y varias aves la implementan. La definición de una interfaz es volar, y varias aves pueden implementar esta interfaz. En términos simples: la herencia es una relación "es correcto", mientras que la implementación de la interfaz es una relación "está ahí". Birds hereda Bird, y está destinado a su tipo, y en cuanto a si se debe implementar la interfaz de vuelo, simplemente piense que tiene esta característica (comportamiento).

  2. La clase abstracta es un diseño de plantilla, la interfaz es una especificación de comportamiento y un diseño radial.
    Por ejemplo, para el mismo método, después del diseño de la plantilla de clase abstracta, cuando se modifica el método, solo es necesario modificar en la plantilla, todas las subclases se pueden actualizar; después del diseño radial de la interfaz, al modificar el método, debe Todos los cambios en la clase de implementación se pueden actualizar y son independientes entre sí.

La conexión entre los dos

  1. Si la interfaz hereda, la interfaz debe ser heredada. No es posible No se puede heredar la clase abstracta

  2. Las clases abstractas pueden implementar interfaces, pueden heredar clases abstractas y no pueden heredar interfaces

Referencia: https://www.i3geek.com/archives/1230

99 artículos originales publicados · Me gusta 106 · Visita 270,000+

Supongo que te gusta

Origin blog.csdn.net/lglglgl/article/details/105042886
Recomendado
Clasificación