Aburrido JavaEE desde la entrada hasta el abandono (10) abstract method_abstract class & interface

Tabla de contenido

One.abstract

1. Método abstracto

2. Clase abstracta

3. Los principales puntos del uso de clases abstractas

4. Código de muestra

2. Interfaz

1. ¿Qué es la interfaz?

2. El papel de la interfaz

3. Diferencia

4. Formato

(1) Formato de declaración:

(2) Una descripción detallada de la interfaz definida

(3) Puntos clave

5. Código de muestra

6. Nuevas funciones de la interfaz después de JDK8

(1) Método predeterminado

(2) Método estático


One.abstract

1. Método abstracto

Usando métodos abstractos modificados, no hay cuerpo de método, solo declaraciones. Lo que se define es una "norma", que le dice a las subclases que deben proporcionar implementaciones concretas para métodos abstractos.

2. Clase abstracta

Una clase que contiene métodos abstractos es una clase abstracta. Defina la especificación a través del método abstracto y luego requiera que la subclase defina una implementación específica.

A través de clases abstractas, podemos limitar estrictamente el diseño de subclases y hacer que las subclases sean más versátiles.

3. Los principales puntos del uso de clases abstractas

(1) Una clase con métodos abstractos solo se puede definir como una clase abstracta
(2) No se puede instanciar una clase abstracta, es decir, no se puede instanciar una clase abstracta con new.
(3) Las clases abstractas pueden contener atributos, métodos y métodos de construcción. Pero el constructor no se puede usar para nuevas instancias, solo se puede usar para ser llamado por subclases.
(4) Las clases abstractas solo pueden usarse para ser heredadas.
(5) Los métodos abstractos deben ser implementados por subclases.

4. Código de muestra

public abstract class Student {
    private String name;

    abstract public void study();
    abstract public void exam();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    //以后如果是父类,那么不管三七二十一,都要加上无参构造器
    Student(){

    }
}
class Test{
    public static void main(String[] args) {
        //Student stu=new Student();抽象类不能创建对象
        Student stu=new SxtStu();
        stu.study();
        stu.exam();
    }
}

class SxtStu extends Student{

    @Override
    public void study() {
        System.out.println("好好学习,好好谈恋爱,好好敲代码!");
    }

    @Override
    public void exam() {
        System.out.println("考个100分!");
    }
}

Producción:

好好学习,好好谈恋爱,好好敲代码!
考个100分!

2. Interfaz

1. ¿Qué es la interfaz?

La interfaz es la especificación, que define un conjunto de reglas , que encarna el mundo real "si eres ... debes poder ...". Si eres un ángel, debes poder volar. Si eres un coche, debes poder correr. Si eres una buena persona, debes poder matar a la mala persona; si eres una mala persona, debes intimidar a los demás.
La esencia de la interfaz es un contrato, solo como nuestra ley humana. Una vez formulada, todos la acatarán.
La esencia de la orientación a objetos es correcta La abstracción de los objetos que mejor puede reflejar este punto es la interfaz.

El motivo por el que hablamos de patrones de diseño es solo para lenguajes con capacidades de abstracción (como C ++, Java, C #, etc.), porque los patrones de diseño estudiados son en realidad cómo abstraer de manera razonable.

2. El papel de la interfaz

¿Por qué necesito una interfaz? ¿La diferencia entre una interfaz y una clase abstracta? Una
interfaz es una "clase abstracta" que es más "abstracta" que una "clase abstracta" y puede restringir subclases de manera más normativa. Realizado integral y profesionalmente: la separación de normas y realizaciones concretas.
Las clases abstractas también proporcionan algunas implementaciones concretas, las interfaces no proporcionan ninguna implementación y todos los métodos de la interfaz son métodos abstractos. La interfaz está completamente orientada a la especificación y especifica las especificaciones del método público de un lote de clases.
Desde la perspectiva del implementador de la interfaz, la interfaz define los servicios que se pueden proporcionar al exterior.
Desde la perspectiva del llamador de la interfaz, la interfaz define los servicios que el implementador puede proporcionar.
La interfaz es el estándar de comunicación entre dos módulos y la norma de comunicación. Si puede definir la interfaz entre los módulos que desea diseñar, equivale a completar el esquema de diseño del sistema, y ​​el resto es la realización concreta de agregar ladrillos y tejas. Después de trabajar, a menudo utiliza el pensamiento "orientado a la interfaz" para diseñar el sistema cuando lo construye. Las interfaces y las clases de implementación no son una relación padre-hijo, sino una relación que implementa reglas. Por ejemplo: defino una interfaz Runnable, Car la implementa para correr en tierra, Train implementa que también puede correr en tierra, y aviones implementa que también puede correr en tierra. Es decir, si es un vehículo, podrá correr, pero debe implementar la interfaz Runnable.

3. Diferencia

Clase ordinaria: implementación concreta
Clase abstracta: implementación concreta, especificación (método abstracto)
Interfaz: especificación! (Antes de jdk8, solo había especificaciones, y se agregaron métodos estáticos y métodos predeterminados después de jdk8)

4. Formato

(1) Formato de declaración:

[Modificador de acceso] nombre de la interfaz de la interfaz [extiende la interfaz principal 1, la interfaz principal 2 ..] {                         definición constante;                         definición del método; }


(2) Una descripción detallada de la interfaz definida

Modificador de acceso: solo puede ser público o predeterminado.
Nombre de la interfaz: use el mismo mecanismo de nomenclatura que el nombre de la clase.
extiende: la interfaz se puede heredar varias veces.

La interfaz es totalmente compatible con la herencia múltiple. Similar a la herencia de clases, una interfaz secundaria extiende una interfaz principal y obtendrá todo lo definido en la interfaz principal.

Constantes: Los atributos en la interfaz solo pueden ser constantes, siempre: modificación final estática pública. Incluso sin escribir.
Método: El método en la interfaz solo puede ser: resumen público si se omite, también es resumen público.

(3) Puntos clave

Las subclases implementan las especificaciones en la interfaz a través de implementos.
Las interfaces no pueden crear instancias, pero pueden usarse para declarar tipos de variables de referencia .
Una clase implementa una interfaz, debe implementar todos los métodos en la interfaz y estos métodos solo pueden ser públicos.
Antes de JDK1.8 (excluyendo 8), la interfaz solo puede contener constantes estáticas y métodos abstractos, y no puede tener atributos ordinarios, métodos de construcción y métodos ordinarios.
Después de JDK1.8 (incluido 8), la interfaz contiene métodos estáticos ordinarios y métodos predeterminados.

5. Código de muestra

(Estructura de archivo)

Interfaz piloto:

/**
 * 这是一个飞行器接口
 */
public interface Pilot {
    /**
     * 表示飞行器在地球这个星球上飞的最高的高度,单位是:公里
     */
    /*public static final*/ int MAX_HEIGHT=100;

    /**
     * 飞行方法,飞行器可以起飞
     */
    /*public abstract*/ void fly();

    /**
     * 可以让飞行器停止,如果在空中就是悬停,如果在地上就是静止
     */
    void stop();
}

interface Honest{
    void helpOther();
}
SuperMan类
public class SuperMan implements Pilot,Honest{接口是可多继承的
    //Alt+Enter智能补全需要实现的方法
    @Override
    public void fly() {
        System.out.println("横着飞!");
    }

    @Override
    public void stop() {
        System.out.println("竖着停!");
    }

    @Override
    public void helpOther() {
        System.out.println("哪里call我,飞哪里!");
    }

    public static void main(String[] args) {
        /*
        SuperMan m1=new SuperMan();
        m1.fly();
        m1.helpOther();
         */
        Pilot p1=new SuperMan();//编译器就认为对象p1是Pilot型的,但是调用方法时还是new的对象的方法
        p1.fly();
        //因为编译器就认为对象p1是Pilot型的,所以想执行helpOther()函数还需要强制类型转换!
        Honest h=(Honest)p1;
        h.helpOther();
    }
}

Producción:

横着飞!
哪里call我,飞哪里!

6. Nuevas funciones de la interfaz después de JDK8

Antes de JAVA8, todos los métodos de la interfaz deben ser métodos abstractos.
Después de JAVA8 (incluido 8), se permite definir métodos predeterminados y métodos de clase en interfaces en el futuro.

(1) Método predeterminado

Las versiones anteriores de Java 8 y superiores permiten agregar una implementación de método no abstracto a la interfaz. Solo necesita usar la palabra clave predeterminada. Esta característica también se denomina método predeterminado (también llamado método de extensión).
La diferencia entre el método predeterminado y el método abstracto es que el método abstracto debe implementarse, el método predeterminado no. Como alternativa, la interfaz puede proporcionar la implementación del método predeterminado, y todas las clases de implementación de esta interfaz obtendrán este método a través de la herencia.

public class Test {
    public static void main(String[] args) {
        A a=new Test_A();
        a.moren();//默认方法通过实现类的对象来调用
    }

}
class Test_A implements A{
    @Override
    public void moren() {
        System.out.println("Test_A moren");
    }
}
interface A{
    default void moren(){
        System.out.println("我是接口A中的默认方法!");
    }
}

(2) Método estático

Después de JAVA8, también podemos definir directamente la implementación de métodos estáticos en la interfaz. Este método estático está directamente subordinado a la interfaz (la interfaz también es una clase, una clase especial) y se puede llamar por el nombre de la interfaz.
Si un método estático con el mismo nombre se define en una subclase, es un método completamente diferente y directamente subordinado a la subclase. Puede ser llamado directamente por el nombre de la subclase.

Código de muestra:

public class Test1 {
    public static void main(String[] args) {
        A1.staticMethod();//静态方法可直接用类名调用
        Testt_A1.staticMethod();
    }
}

interface A1{
    public static void staticMethod(){
        System.out.println("A1.staticMethod");
    }
}

class Testt_A1 implements A{
    public static void staticMethod(){
        System.out.println("Testt_A1.staticMethod");
    }
}

Producción:

A1.staticMethod
Testt_A1.staticMethod

 

 

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/weixin_44593822/article/details/115369364
Recomendado
Clasificación