[Conceptos básicos de Java] ¿Debería JAVA utilizar el tipo de interfaz o el tipo de clase de implementación al hacer referencia a un objeto?

[conceptos básicos de Java] ¿Debería JAVA utilizar el tipo de interfaz o el tipo de clase de implementación al hacer referencia a un objeto?

Primero, pongamos el código para aclarar la pregunta del título: ¿Cuál de las siguientes dos formas de recibir objetos deberías elegir?

//implA 为接口  ClassB为其实现类
implA A=new ClassB();  //接口类型的引用变量A 去接收对象地址
or
ClassB A=new ClassB();  //类类型的引用变量A 去接收对象地址

Comencemos con la conclusión: las interfaces deben usarse con preferencia a las clases para hacer referencia a objetos, pero solo si existe un tipo de interfaz apropiado.

"Java efectivo" dijo:

"Si existe un tipo de interfaz adecuado, entonces los parámetros, valores de retorno y campos deben usar tipos de interfaz.
Si desarrolla el hábito de usar tipos de interfaz, sus programas serán más flexibles. Si no existe una interfaz adecuada, use referencias de clase. El tema es perfectamente adecuado."

Entonces, ¿cuándo no existe un tipo de interfaz apropiado? Eche un vistazo al siguiente ejemplo:

public class InterfaceTest {
    
    

    public static void main(String[] args) {
    
    
        PetInterface p = new Cat();
        p.talk();
        p.batheSelf();//无法调用 ,报错The method batheSelf() is undefined for the type PetInterface
    }

}

interface PetInterface {
    
                    
    public void talk();
}

class Dog implements PetInterface {
    
    
    @Override
    public void talk() {
    
    
        System.out.println("Bark!");
    }
}

class Cat implements PetInterface {
    
    
    @Override
    public void talk() {
    
    
        System.out.println("Meow!");
    }
    public void batheSelf() {
    
    
        System.out.println("Cat bathing");
    }
}

Vemos que cuando el método batheSelf() solo existe en la clase de implementación, si todavía usamos la interfaz para referirnos al objeto PetInterface p = new Cat(), esos métodos que solo existen en la clase de implementación no se pueden llamar directamente, eso Es decir, p.batheSelf () informará un error si no se puede llamar. Por lo tanto, es mejor usar Cat p = new Cat () para referirse a la clase en este momento.

Con todo, existe un requisito previo para usar una clase de interfaz para hacer referencia a un objeto , es decir, la clase de implementación es toda la implementación del método de la clase de interfaz y no existe un método separado en sí mismo. Cuando la clase implementadora tiene su propio método, utilice la clase implementadora para declarar la variable.

Ventajas: 1. Si una clase implementa múltiples interfaces, si usa el tipo de interfaz para definir sus variables de referencia, puede comprender de un vistazo qué métodos de esta clase se necesitan aquí .

2. El programa es más flexible. Cuando decides cambiar la implementación, solo necesitas cambiar el nombre de la clase en el constructor. No es necesario cambiar el código en otros lugares donde se usa la lista. como sigue:

List<> list= new Vector<>();
//更改为ArrayList
 List<?> list= new ArrayList<?>();

Supongo que te gusta

Origin blog.csdn.net/qq_43842093/article/details/132639411
Recomendado
Clasificación