Java: polimorfismo; clase abstracta; interfaz

1. Clase abstracta

1. Definición de clase abstracta

Agregue la palabra clave abstracta antes de la clase

public abstract class AbstractClass

2. Las clases abstractas no se pueden instanciar y los objetos no se pueden crear (las clases abstractas se utilizan para ser heredadas por subclases)

3. final y resumen no se pueden usar juntos, estas dos palabras clave son opuestas

4. La subclase de una clase abstracta puede ser una clase abstracta, también puede ser una clase no abstracta

5. Aunque no se puede crear una instancia de la clase abstracta, la clase abstracta tiene un método de construcción, que es utilizado por las subclases

6. No puede haber métodos abstractos en clases abstractas, los métodos abstractos deben aparecer en clases abstractas

7. Definición de método abstracto

public abstract void doSome();

8. Una clase no abstracta que hereda una clase abstracta debe anular/reescribir/implementar los métodos abstractos en la clase abstracta

No todos los métodos sin un cuerpo de método en Java son métodos abstractos. Hay muchos métodos en la clase Object que no tienen cuerpo de método y terminan con ";", pero ninguno de ellos es un método abstracto, como:

public native int hashCode();

La capa inferior del método hashCode() llama al programa de biblioteca de vínculos dinámicos escrito en C++

No hay: resumen en la lista de modificadores anterior, hay un nativo, lo que significa llamar al programa nativo JVM

De esto se puede ver que las clases abstractas existen para la herencia.Si define una clase abstracta pero no la hereda, entonces es equivalente a crear esta clase abstracta para nada, porque no puede usarla para hacer nada. Para una clase principal, si un determinado método no tiene significado en la clase principal, debe implementarse de manera diferente de acuerdo con las necesidades reales de la subclase. 

Una clase que contiene métodos abstractos se denomina clase abstracta, pero eso no significa que solo pueda haber métodos abstractos en una clase abstracta. También puede tener variables miembro y métodos miembro ordinarios como las clases ordinarias.

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, las subclases no pueden heredarlo y las subclases no pueden implementar el método) y el valor predeterminado 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 una clase abstracta

En otros aspectos, las clases abstractas no son diferentes de las clases ordinarias.

2. Interfaz

(1) Gramática básica de la interfaz

Interfaz , en inglés se llama  interfaz , en ingeniería de software, interfaz generalmente se refiere a un método o función llamada por otros, es una abstracción de comportamiento

En Java, la forma de definir una interfaz es la siguiente:

[修饰符列表] interface 接口名{}

como:

public interface TestInterface {
    public void doSome();
}

1. La interfaz es un "tipo de datos de referencia"

2. La interfaz es completamente abstracta

3. La interfaz admite herencia múltiple

4. Solo hay constantes + métodos abstractos en la interfaz

5. Todos los elementos de la interfaz se modifican públicamente

6. Se puede omitir el resumen público del método abstracto en la interfaz

7. Se puede omitir el final estático público de la constante en la interfaz

8. Los métodos en las interfaces no pueden tener cuerpos de métodos

9. Para una clase no abstracta, al implementar una interfaz, se deben implementar todos los métodos de la interfaz.

10. Una clase puede implementar múltiples interfaces

11. Las extensiones y los implementos pueden coexistir, las extensiones primero, los implementos después.

12. Usando interfaces, puede usar polimorfismo (las referencias de tipo principal apuntan a objetos de subtipo)

(2) El papel de las interfaces en el desarrollo

El papel de las interfaces en el desarrollo es similar al papel del polimorfismo en el desarrollo.        

多态:面向抽象编程,不要面向具体编程。降低程序的耦合度。提高程序的扩展力
            /*
            public class Master{
                public void feed(Dog d){}
                public void feed(Cat c){}
                //假设又要养其它的宠物,那么这个时候需要再加1个方法。(需要修改代码了)
                //这样扩展力太差了,违背了OCP原则(对扩展开放,对修改关闭。)
            }
            */

            public class Master{
                public void feed(Animal a){
                    // 面向Animal父类编程,父类是比子类更抽象的。
                    //所以我们叫做面向抽象编程,不要面向具体编程。
                    //这样程序的扩展力就强。
                }
            }

"Desacoplamiento", la programación orientada a la abstracción puede entenderse como: programación orientada a la interfaz

La programación orientada a la interfaz puede reducir el grado de acoplamiento del programa y mejorar la escalabilidad del programa; se ajusta al principio de desarrollo OCP

El uso de interfaces es inseparable del mecanismo polimórfico (interfaz + polimorfismo pueden lograr un acoplamiento reducido); las interfaces se pueden desacoplar

Cualquier interfaz tiene una persona que llama y un implementador; la interfaz puede desacoplar la persona que llama y el implementador

La persona que llama llama a la interfaz; el implementador escribe la implementación para la interfaz

Las interfaces pueden contener variables y métodos.

Nota:

(1) Las variables en la interfaz se designarán implícitamente como variables finales estáticas públicas (y solo pueden ser variables finales estáticas públicas, y se informará un error de compilación si se modifican con privado)

(2) El método en la interfaz se designará implícitamente como un método abstracto público , y solo puede ser un método abstracto público (modificado con otras palabras clave, como privado, protegido, estático, final, etc., informará una compilación error), y la interfaz en Todos los métodos no puede tener implementaciones concretas ( los métodos en las interfaces deben ser métodos abstractos )

La interfaz es un tipo extremadamente abstracto, que es más "abstracto" que una clase abstracta y, por lo general, no define variables en las interfaces.

Una clase que se ajuste a un conjunto específico de interfaces necesita usar la palabra clave implements , el formato específico es el siguiente:

public class TestInterfaceImpl implements TestInterface{
    @Override
    public void doSome() {
        // TODO Auto-generated method stub
    }
}

En el desarrollo de grandes proyectos, el proyecto generalmente se separa en módulos uno por uno, y se utilizan interfaces entre módulos para conectar (reducir el grado de acoplamiento)

(3) La diferencia entre clase abstracta e interfaz

1. Diferencia gramatical

1. Las clases abstractas son semi-abstractas, las interfaces son completamente abstractas.

2. Hay constructores en clases abstractas, no hay constructores en interfaces

3. Se admite herencia múltiple entre interfaces, solo herencia única entre clases

4. Una clase puede implementar múltiples interfaces al mismo tiempo, una clase abstracta solo puede heredar una clase (herencia única)

5. Solo se permiten constantes y métodos abstractos en la interfaz

6. Las interfaces no pueden contener bloques de código estático y métodos estáticos, mientras que las clases abstractas pueden tener bloques de código estático y métodos estáticos

2. Diferencia de diseño

(1) Una clase abstracta es una abstracción de una cosa, es decir, una abstracción de una clase, mientras que una interfaz es una abstracción de comportamiento. Una clase abstracta abstrae toda la clase como un todo, incluidos los atributos y comportamientos, pero una interfaz abstrae las partes (comportamientos) de la clase.

Por ejemplo, los aviones y los pájaros son cosas diferentes, pero todos tienen una cosa en común, es decir, pueden volar. Luego, al diseñar, puede diseñar un avión como un avión y un pájaro como un pájaro, pero no puede diseñar la característica de vuelo como una clase, por lo que es solo una característica de comportamiento, no una descripción abstracta de un clase de cosas. En este momento, el vuelo se puede diseñar como una interfaz Fly, incluido el método fly(), y luego Airplane y Bird implementan la interfaz Fly de acuerdo con sus propias necesidades. Luego, en cuanto a los diferentes tipos de aeronaves, como los aviones de combate y las aeronaves civiles, basta con heredar directamente de Airplane. Lo mismo es cierto para las aves. Diferentes tipos de aves pueden heredar directamente de la clase Bird.

Se puede ver desde aquí que la herencia es una relación de "si o no", mientras que la implementación de la interfaz es una relación de "si o no". Si una clase hereda cierta clase abstracta, la subclase debe ser del tipo de la clase abstracta, y la implementación de la interfaz está relacionada con si tiene o no, como si el pájaro puede volar (o si tiene la característica de volar) , puede volar Entonces puede implementar esta interfaz, si no puede volar, no implemente esta interfaz.

(2) El nivel de diseño es diferente.Como la clase principal de muchas subclases, la clase abstracta es un diseño de plantilla. Si bien la interfaz es una especificación de comportamiento, es un diseño radial.

Por ejemplo: plantilla en ppt, si la plantilla A se usa para diseñar ppt B y ppt C, la parte común de ppt B y ppt C es la plantilla A, si es necesario cambiar sus partes comunes, solo se debe cambiar la plantilla A, No es necesario volver a realizar cambios en ppt B y ppt C.

Y el diseño radial, por ejemplo, cierto ascensor está equipado con algún tipo de alarma, una vez que se actualiza la alarma, todos deben actualizarse. Es decir, para una clase abstracta, si necesita agregar un nuevo método, puede agregar directamente una implementación específica en la clase abstracta, y no es necesario cambiar la subclase; pero para la interfaz, si la interfaz es cambiado, todas las implementaciones de las clases de interfaz deben modificarse en consecuencia.

parámetro clase abstracta interfaz
La implementación del método por defecto Puede haber un método predeterminado para implementar Completamente abstracto, no hay implementación del método en absoluto.
Método para realizar

La subclase usa la palabra clave extends para heredar la clase abstracta, si la subclase

Si no es una clase abstracta, debe implementar todas las abstracciones en la clase abstracta principal

Al igual que los métodos, los métodos no abstractos en la clase principal pueden anularse o no

La subclase usa implementos para implementar la interfaz y necesita implementar todos los métodos en la interfaz.
constructor Las clases abstractas pueden tener constructores (los constructores no se pueden modificar con resumen) Las interfaces no pueden tener constructores.
Diferencias con las clases normales de Java Se pueden instanciar clases normales de Java, no se pueden instanciar clases abstractas, consulte el contexto para ver otras diferencias Las interfaces y las clases normales de Java son tipos diferentes
modificador de acceso  Los métodos abstractos se pueden modificar con public, protected, default La interfaz es pública por defecto y no se puede modificar con otros modificadores
método principal Puede haber un método principal en una clase abstracta, que se puede ejecutar No puede haber un método principal en una interfaz, por lo que no se puede ejecutar
herencia múltiple Una clase abstracta puede heredar una clase e implementar múltiples interfaces Una interfaz solo puede heredar una o más interfaces
velocidad Las clases abstractas son más rápidas que las interfaces. La interfaz es un poco más lenta porque necesita encontrar sus métodos implementados en la clase
añadir nuevo método Si agrega un nuevo método no abstracto en una clase abstracta, puede agregarlo directamente, porque el método no abstracto no necesita implementarse en la subclase. Si es un método abstracto, debe cambiar el código de la subclase e implementar este método Siempre que se agregue un método a la interfaz, la clase que lo implementa cambiará para implementar el método recién agregado

(4) Escenarios de aplicación de clases e interfaces abstractas

1. Si tiene algunos métodos y desea que algunos de ellos tengan implementaciones predeterminadas, use clases abstractas

2. Si desea lograr herencia múltiple, debe usar interfaces. Dado que Java no admite la herencia múltiple, las subclases no pueden heredar varias clases, pero pueden implementar múltiples interfaces. Entonces puedes usar interfaces para resolver (polimorfismo)

3. Si las funciones básicas cambian constantemente, entonces necesita usar clases abstractas. Si sigue cambiando la funcionalidad básica y usa la interfaz, entonces necesita cambiar todas las clases que implementan la interfaz.

Tres, polimorfismo

La programación orientada a objetos tiene tres características: encapsulación, herencia, polimorfismo.

1. La encapsulación oculta el mecanismo de implementación interna de la clase, que puede cambiar la estructura interna de la clase sin afectar el uso y también protege los datos. Sus detalles internos están ocultos al mundo exterior, y solo sus métodos de acceso están expuestos al mundo exterior.

2. La herencia consiste en reutilizar el código de la clase principal. Si existe una relación IS-A entre dos clases, se puede utilizar la herencia. Al mismo tiempo, la herencia allanó el camino para la realización del polimorfismo.

3. Polimorfismo significa que el tipo específico al que apunta la variable de referencia definida en el programa y la llamada al método emitida a través de la variable de referencia no se determinan durante la programación, sino que se determinan durante la ejecución del programa, es decir, una variable de referencia apuntar a El objeto de instancia de qué clase y el método implementado en qué clase la llamada al método emitida por la variable de referencia debe determinarse durante la ejecución del programa.

Debido a que la clase específica se determina cuando el programa se está ejecutando, de esta manera, sin modificar el código fuente del programa, la variable de referencia se puede vincular a varias implementaciones de clase, lo que hará que el método específico llamado por la referencia cambie en consecuencia, es decir , no modificar El código del programa puede cambiar el límite de código específico cuando el programa se está ejecutando, de modo que el programa puede elegir varios estados de ejecución, que es polimorfismo.

1. La premisa del polimorfismo:

(1) Debe existir una relación de herencia o realización

(2) Debe haber una reescritura del método.

(3) Debe haber una referencia de clase principal que apunte al objeto de la subclase

2. Definición y formato de uso de polimorfismo

定义格式:
    父类类型 变量名 = new 子类类型();

Tales como: Animal a=new Cat();

animal

public class Animal {
    public void eat() {
        System.out.println("动物吃东西");
    }
}

Clase Gato, hereda la clase Animal.

//有继承关系
public class Cat extends Animal{
    //有方法的重写
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    //子类特有方法
    public void catchMouse(){
        System.out.println("猫抓老鼠");
    }
}

Clase de perro, heredado de la clase Animal

//有继承关系
public class Dog extends Animal{
    //有方法的重写
    @Override
    public void eat() {
        System.out.println("狗啃骨头");
    }

    //子类特有方法
    public void careHome(){
        System.out.println("狗看家护院");
    }
}

Código de prueba:

public class AnimalDemo {
    public static void main(String[] args) {

        //编译时是Animal类,运行时内存是Cat类
        Animal a = new Cat();//向上转型;父类引用指向子类对象
        a.eat();//输出 “猫吃鱼”
        //a.catchMouse(); //编译错误,a是Animal类,没有catchMouse()方法

        //Exception in thread "main" java.lang.ClassCastException: multiple.Animal cannot be cast to multiple.Cat 
        //此时内存中a是Cat,猫不能强转为狗
        Dog d = (Dog)a;//向下转型;父类引用转为子类对象,转型的是父类引用所指向的那个子类对象
        d.eat();
    }
}

Características de acceso a miembros en polimorfismo

1. Variables miembro:

Compile para ver la clase principal, ejecute para ver la clase principal

2. Método de miembros:

Compile para ver la clase principal, ejecute para ver la subclase

Relaciones entre tipos y tipos:

es una (herencia), tiene una (asociación), como una (implementación)

1. es un:
                el gato es un animal (un gato es un animal)
                puede satisfacer la expresión de es una "relación de herencia"
                A extiende B

2. has a:
                I has a Cat (Tengo un gato)
                puede satisfacer la expresión de tiene una relación "relación de asociación"
                la relación suele existir en forma de "atributo".
                A{                     B b;                 } 3. like a:                 la expresión que puede satisfacer la relación like a "relación de implementación"                 La relación de realización suele ser: la clase implementa la interfaz.                 A implementa B





Cuarto, la palabra clave final

1. Las clases modificadas finales no se pueden heredar

2. El método de modificación final no puede ser anulado

3. A una variable modificada por final solo se le puede asignar un valor una vez

4. Una vez que la referencia modificada final apunta a un objeto, ya no puede apuntar a otros objetos, pero los datos de atributo dentro del objeto al que apunta la referencia pueden modificarse

public class FinalTest2 {
    public static void main(String[] args) {

        Person p1 = new Person();
        //可以赋值
        p1.name = "张三111";
        System.out.println(p1.name);

        final Person p2 = new Person();
        p2.name = "李四";
        System.out.println(p2.name);

        p2.name = "张三";
        System.out.println(p2.name);

        //不能编译通过;java: 无法为最终变量p2分配值
        //p2 采用 final 修饰,主要限制了 p2 指向堆区中的地址不能修改(也就是p2 只能指向一个对象)
        //p2 指向的对象的属性是可以修改的
        //p2 = new Person();
    }
}

class Person {
    String name;
}
张三111
李四
张三

5. Las variables de instancia modificadas por final deben inicializarse manualmente y no se puede usar el valor predeterminado del sistema

6. Las variables de instancia modificadas finales generalmente se usan junto con estáticas y se denominan constantes.

public static final double PI = 3.1415926;

7. Las variables modificadas finales deben inicializarse explícitamente

// final 修饰的变量必须显示初始化
// Variable 'number' might not have been initialized
//private static final Long number;


int i;
// 局部变量必须初始化,如果不使用可以不初始化
// Variable 'i' might not have been initialized
//System.out.println(i);

8. El método de construcción no puede ser modificado por decisión final. 

Supongo que te gusta

Origin blog.csdn.net/MinggeQingchun/article/details/120733179
Recomendado
Clasificación