[El camino para convertirse en un rey de Java] Capítulo 14: Java SE (Programación orientada a objetos: composición, polimorfismo)

Objetivos de esta sección

combinación

polimorfismo

1. ¿Qué es una combinación?

Al igual que la herencia, la composición también es una forma de expresar la relación entre clases y también puede lograr el efecto de reutilización de código. Por ejemplo, para representar una escuela:

public class Student { 
 ... 
} 
public class Teacher { 
 ... 
} 
public class School { 
 public Student[] students; 
 public Teacher[] teachers; 
} 

La composición no involucra una sintaxis especial (palabras clave como extends), solo toma una instancia de una clase como un campo de otra clase. Esta es una de las formas comunes en que diseñamos clases.

La representación combinatoria tiene - una semántica

En el ejemplo anterior, podemos entender que una escuela "contiene" varios alumnos y profesores

La herencia representa es - una semántica

En el ejemplo anterior de "animales y perros", podemos entender que un perro también "es" un animal.

Segundo, ¿qué es el polimorfismo?

Polimorfismo: Comprensión literal: una cosa tiene muchas formas (esta frase no se debe decir al entrevistador) 

Transformación ascendente: 

Upcasting: una oración, referencia de clase principal, objeto de subclase de referencia

class Animal{
    public String name;
    public int age;

    public void eat(){
        System.out.println("eat()");
    }

    public Animal(String name,int age){
        this.name = name;
        this.age = age;
    }
}
class Dag extends Animal {
    public Dag(String name,int age){
        super(name,age);
    }


}
class Bird extends Animal{

    public String wing;

    public void fly(){
        System.out.println(age+"fly");

    }

    public Bird(String name,int age,String wing){
        super(name,age);
        this.wing = wing;
    }

}
public class TestDemo{
    public static void main(String[] args) {
        //Dag dag = new Dag("HAHAH",12);
        //Animal animal = dag;
        Animal animal1 = new Dag("HAHAH",12);
    }

Qué sucede cuando se produce un upcast:

1. Asignación directa

2. Transferencia de parámetros de método

3. El método regresa

Hemos demostrado el método de asignación directa. Los otros dos métodos no son sustancialmente diferentes de la asignación directa.

Parámetros del método:

 En este momento, el tipo de parámetro formal animal es Animal (clase base), que en realidad corresponde a la instancia de Dag (clase padre)

 método devuelve:

Unión dinámica:

Unión dinámica:

Dos premisas:

1, la referencia de la clase principal, se refiere al objeto de la subclase

2. A través de esta referencia de clase principal, llame al método de anulación con el mismo nombre de la clase principal y la clase secundaria

Método de anulación del mismo nombre, término: anulación

Volver a escribir:

1: El nombre del método es el mismo

2: La lista de parámetros es la misma (número + tipo)

3: El valor de retorno es el mismo

La anulación debe ser en el caso de clases padre e hijo

La unión dinámica es la base del polimorfismo.


// Animal.java 
public class Animal { 
 protected String name; 
 public Animal(String name) { 
 this.name = name; 
 } 
 public void eat(String food) { 
 System.out.println("我是一只小动物"); 
 System.out.println(this.name + "正在吃" + food); 
 } 
} 
// Bird.java 
public class Bird extends Animal { 
 public Bird(String name) { 
 super(name); 
 } 
 public void eat(String food) { 
 System.out.println("我是一只小鸟"); 
 System.out.println(this.name + "正在吃" + food); 
 } 
} 
// Test.java 
public class Test { 
 public static void main(String[] args) { 
 Animal animal1 = new Animal("圆圆"); 
 animal1.eat("谷子"); 
 Animal animal2 = new Bird("扁扁"); 
 animal2.eat("谷子"); 
 } 
} 
// 执行结果
我是一只小动物
圆圆正在吃谷子
我是一只小鸟
扁扁正在吃谷子

En este punto encontramos:

Aunque tanto animal1 como animal2 son referencias de tipo Animal, animal1 apunta a una instancia de tipo Animal y animal2 apunta a una instancia de tipo Bird.

Llame al método eat para animal1 y animal2 respectivamente, y descubra que animal1.eat() en realidad llama al método de la clase principal, mientras que animal2.eat() en realidad llama al método de la subclase

Por lo tanto, en Java, cuando se llama a un método de una clase, qué fragmento de código se ejecuta (si es el código del método de la clase principal o el código del método de la subclase), depende de si la referencia apunta a la clase principal. objeto o el objeto de la subclase.Este proceso se determina en tiempo de ejecución del programa (no en tiempo de compilación), por lo que se denomina vinculación dinámica

Precauciones:

1. El método no puede ser estático

2. El modificador de acceso de la subclase debe ser mayor o igual que el modificador de acceso de la clase principal

3. El método privado no se puede anular

4. El método modificado por final no se puede anular

Además, para los métodos anulados, puede usar la anotación @Override para especificar explícitamente

// Bird.java 
public class Bird extends Animal { 
 @Override 
 private void eat(String food) { 
 ... 
 } 
} 

Tener esta anotación puede ayudarnos a realizar algunas comprobaciones de legalidad. Por ejemplo, si el nombre del método está mal escrito (como aet), el compilador encontrará que no hay ningún método aet en la clase principal y compilará un error, indicando Cannot constituyen anulación Recomendamos agregar explícitamente la anotación @Override al anular métodos en el código

Resumir:

Primero comprendamos brevemente el concepto de polimorfismo, y luego profundizaremos la comprensión y la comprensión del polimorfismo a través del código, para que todos puedan comprender completamente el conocimiento gramatical del polimorfismo.

 

Supongo que te gusta

Origin blog.csdn.net/m0_64397675/article/details/123616315
Recomendado
Clasificación