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.