Para la programación orientada a objetos, la abstracción es una de sus principales características. En Java, la abstracción OOP se puede reflejar en dos formas: interfaces y clases abstractas. Hay demasiadas similitudes y demasiadas diferencias entre los dos. Muchas personas piensan que pueden usarse indistintamente cuando son principiantes, pero de hecho no lo son. Hoy aprenderemos sobre interfaces y clases abstractas en Java. Aquí está el esquema del directorio de este artículo:
1. Clase abstracta
2. Interfaz
3. La diferencia entre clases abstractas e interfaces
1. Clase abstracta
Antes de comprender las clases abstractas, primero comprendamos los métodos abstractos. Un método abstracto es un método especial: solo tiene declaraciones, pero no hay implementación concreta. El formato de declaración de un método abstracto es:
abstracto nula divers ();
Los métodos abstractos deben modificarse con la palabra clave abstracta. Si una clase contiene métodos abstractos, esta clase se llama clase abstracta. La clase abstracta debe modificarse con la palabra clave abstracta antes de la clase. Debido a que las clases abstractas contienen métodos sin implementaciones concretas, los objetos no se pueden crear utilizando clases abstractas.
A continuación se debe tener en cuenta un problema: en el libro "Java Programación de pensamiento", las clases abstractas se definen como "clases que contienen métodos abstractos", pero luego se descubrió que si una clase no contiene métodos abstractos y se modifica con abstracto, también es una clase abstracta. En otras palabras, las clases abstractas no necesariamente tienen que contener métodos abstractos. Personalmente, creo que esta es una pregunta obstinada, porque si una clase abstracta no contiene ningún método abstracto, ¿por qué debería diseñarse como una clase abstracta? Así que recuerde este concepto por el momento, y no hay necesidad de profundizar por qué.
[public] Abstract Class ClassName {Resumen Void Fun ();}De esto podemos ver que las clases abstractas existen para la herencia. Si define una clase abstracta pero no la herede, es equivalente a crear esta clase abstracta en vano, porque no puede usarla para hacer nada. Para una clase principal, si uno de sus métodos se implementa en la clase principal no tiene significado y debe implementarse de manera diferente de acuerdo con las necesidades reales de la subclase, entonces este método puede declararse como un método abstracto, y esta clase se convierte en una clase abstracta.
Las clases que contienen métodos abstractos se denominan clases abstractas, pero no significan que los métodos abstractos solo se puedan encontrar en clases abstractas. Al igual que las clases ordinarias, también pueden tener variables miembros y métodos de miembros ordinarios. Tenga en cuenta que hay tres diferencias principales entre las clases abstractas y las clases ordinarias:
1) El método abstracto debe ser público o protegido (porque si es privado, no puede ser heredado por la subclase, y la subclase no puede implementar el método). Por defecto, es público.
2) Las clases abstractas no se pueden usar para crear objetos;
3) Si una clase hereda de una clase abstracta, la subclase debe implementar el método abstracto de la clase principal. Si la subclase no implementa el método abstracto de la clase principal, la subclase también debe definirse como clase abstracta.
En otros aspectos, no hay diferencia entre las clases abstractas y las clases ordinarias.
2. Interfaz
La interfaz, llamada interfaz en inglés, en ingeniería de software, las interfaces generalmente se refieren a métodos o funciones para que otros llamen. A partir de esto, podemos entender la intención original de los diseñadores de idiomas Java, que es una abstracción del comportamiento. En Java, la forma de una interfaz es la siguiente:
[public] Interface Interfacename {}
Las interfaces pueden contener variables y métodos. However, it should be noted that variables in the interface will be implicitly specified as public static final variables (and can only be public static final variables, and modifying private will report a compilation error), while methods will be implicitly specified as public abstract method and can only be public abstract method (using other keywords, such as private, protected, static, final, etc. will report a compilation error), and all methods in the interface cannot have specific implementations, Es decir, los métodos en la interfaz deben ser métodos abstractos. Desde aquí, podemos ver vagamente la diferencia entre una interfaz y una clase abstracta. Una interfaz es un tipo extremadamente abstracto. Es más "abstracto" que una clase abstracta y generalmente no define variables en una interfaz.
Para que una clase siga un grupo específico de interfaces, debe usar la palabra clave de implementos, el formato específico es el siguiente:
Class ClassName Implements Interface1, Interface2, [....] {}
Se puede ver que una clase puede seguir múltiples interfaces específicas. Si una clase de no abstracto sigue una interfaz, se deben implementar todos los métodos en esa interfaz. Para las clases abstractas que siguen una interfaz, los métodos abstractos en esa interfaz pueden no implementarse.
3. La diferencia entre clases abstractas e interfaces
1. Diferencias a nivel gramatical
1) Las clases abstractas pueden proporcionar detalles de implementación de los métodos miembros, mientras que solo pueden existir métodos públicos abstractos en la interfaz;
2) Las variables miembros en las clases abstractas pueden ser de varios tipos, mientras que las variables de los miembros en la interfaz solo pueden ser de tipo público estático público;
3) la interfaz no puede contener bloques de código estáticos y métodos estáticos, mientras que las clases abstractas pueden tener bloques de código estáticos y métodos estáticos;
4) Una clase solo puede heredar una clase abstracta, mientras que una clase puede implementar múltiples interfaces.
2. Diferencias a nivel de diseño
1) Las clases abstractas son abstracciones de las cosas, es decir, abstracciones de las clases, mientras que las interfaces son abstracciones de comportamiento. Una clase abstracta abstrae a toda la clase, incluidas las propiedades y los comportamientos, pero una interfaz abstrae la parte de clase (comportamiento). Para dar un ejemplo simple, los aviones y las aves son cosas diferentes, pero todos tienen una cosa en común, es decir, todos vuelan. Luego, al diseñar, el avión se puede diseñar como un avión y un carácter similar a un pájaro, pero la característica de vuelo no puede diseñarse como una clase. Por lo tanto, es solo una característica de comportamiento, no una descripción abstracta de un tipo de cosas. En este momento, el vuelo se puede diseñar como una mosca de la interfaz, incluida la mosca del método (), y luego el avión y las aves implementan la interfaz de mosca de acuerdo con sus propias necesidades. Luego, en cuanto a los diferentes tipos de aviones, como aviones de combate, aviones civiles, etc., puede heredar directamente el avión. También es similar a los pájaros. Los diferentes tipos de aves pueden heredar directamente la clase de pájaros. Desde aquí, podemos ver que la herencia es una relación "sí o no", mientras que la implementación de la interfaz es una relación "sí o no". Si una clase hereda una clase abstracta, la subclase debe ser un tipo de clase abstracta, y la implementación de la interfaz es una relación que no existe, como si el pájaro puede volar (o si tiene las características de volar). Si puede volar, puede darse cuenta de esta interfaz. Si no puede volar, no se dará cuenta de esta interfaz.
2) Diferentes niveles de diseño, la clase abstracta es un diseño de plantilla, como la clase principal de muchas subclases. Y la interfaz es un código de comportamiento, es un diseño de radiación. ¿Qué es el diseño de la plantilla? El ejemplo más simple es que todos han usado las plantillas en PPT. Si usa la plantilla A para diseñar PPT B y PPT C, la parte común de PPT B y PPT C es la plantilla A. Si su parte pública debe cambiarse, solo necesita cambiar la plantilla A, y no es necesario volver a cambiar PPT B y PPT C. Radiant Design, como un elevador equipado con algún tipo de alarma, una vez que se actualice la alarma, todo debe actualizarse. Es decir, para las clases abstractas, si necesita agregar nuevos métodos, puede agregar directamente implementaciones específicas a la clase abstracta, y las subclases no se pueden cambiar; Pero para las interfaces, no es posible. Si se cambia la interfaz, todas las clases que implementan esta interfaz deben cambiarse en consecuencia.
Veamos el ejemplo más distribuido en Internet: Ejemplos de puertas y alarmas: las puertas tienen dos acciones: Open () y Close (). En este momento, podemos definir este concepto abstracto a través de clases e interfaces abstractas:
puerta de clase abstracta {public abstract void open (); Public Abstract void Close ();}o:
puerta de interfaz {public abstract void open (); Public Abstract void Close ();}Pero ahora, si necesitamos la puerta para tener la función de alarma (), ¿cómo implementarla? Se proporcionan las siguientes dos ideas:
1) Ponga las tres funciones en la clase abstracta, pero de esta manera, todas las subclases heredadas de esta clase abstracta tienen funciones de alarma, pero algunas puertas no necesariamente tienen funciones de alarma;
2) Ponga todas estas tres funciones en la interfaz. Las clases que necesitan usar funciones de alarma deben implementar Open () y cerrar () en esta interfaz. Quizás esta clase no tenga las dos funciones de Open () y Close () en absoluto, como alarmas de incendio.
Desde aquí, podemos ver que la puerta está abierta (), cierre () y alarma () simplemente pertenece a dos comportamientos en diferentes categorías. Open () y Close () pertenece a las características de comportamiento inherente de la puerta misma, mientras que la alarma () pertenece a comportamientos adicionales extendidos. Por lo tanto, la mejor solución es diseñar la alarma como interfaz, incluido el comportamiento de alarma () y la puerta como una clase abstracta separada, incluidos los comportamientos abiertos y de cierre. Otra puerta de alarma está diseñada para heredar la clase de la puerta e implementar la interfaz de alarma.
interfaz alram {void alarm ();} puerta de clase abstracta {void open (); Void Close ();} clase AlarmDoor extiende la puerta implementa alarma {void oepn () {// ..} void Close () {// ..} Void Alarm () {// ...}}Lo anterior es una compilación de interfaces Java y clases abstractas. Espero que pueda ayudar a los amigos que aprenden la programación de Java.