JavaSE - Explicación de la herencia y el polimorfismo

ced485cbb11e458d81a746890b32cf3f.gif

Autor: Rukawa Maple Knock Code

Página de inicio del blog: Blog de Rukawa Kaede

Columna: Aprende java conmigo

Cita: Mantente hambriento, mantente tonto

Si quieres hacer cosas buenas, primero debes afilar tus herramientas. Permíteme presentarte una herramienta súper poderosa para ganar ofertas de grandes fabricantes: Niuke.com

Haga clic para registrarse de forma gratuita y aclarar las preguntas conmigo  

Directorio de artículos

1. Herencia

1. ¿Cómo entender la herencia?

2. La sintaxis de la herencia

3. Cómo acceden las subclases a los miembros de la clase principal

3.1 Acceso a variables miembro

3.2 Acceso a métodos de miembros

3.3 súper palabra clave

4. Constructor de subclase

5. palabra clave final

6. Herencia y composición

2. Polimorfismo

1. Reconocer el polimorfismo

 2. Condiciones de implementación del polimorfismo

3. Reescribir

4. Cambio ascendente y descendente

Upcasting: cree un objeto de subclase y utilícelo como un objeto de clase principal

Downcast: la referencia de la clase principal se restaura en el objeto de la clase secundaria


1. Herencia

1. ¿Cómo entender la herencia?

Puede haber algunas asociaciones entre los objetos generados por la creación de instancias de clase. La herencia consiste en extraer estos puntos en común para lograr la reutilización del código.

Concepto: El proceso de extender, agregar nuevas funciones y generar nuevas clases sobre la base de mantener las características de la clase original, esta clase se denomina clase derivada.

El principal problema que resuelve la herencia es: extracción común y reutilización de código

2. La sintaxis de la herencia

palabra clave: extiende

Formato:

修饰符 class 子类 extends 父类 {

    //... 

}

Las subclases heredan las variables miembro o los métodos miembro de la clase principal

Una vez que la subclase hereda la clase principal, debe agregar sus propios miembros exclusivos, es decir, funciones distintas de la clase principal.

class Animal{
    public String name;
    public int age;

    public void eat() {
        System.out.println(name+"吃饭");
    }
}
class Dog extends Animal{
    //新加的属性
    public String silly;
    public void houseGuard() {
        System.out.println("看门");
    }
}
class Cat extends Animal {

    //没有添加新属性
    public void catchMouse()  {
        System.out.println(name+"抓老鼠");
    }
}
public class Test {
    public static void main(String[] args) {

        //name和age属性是从父类Animal中继承下来的

        Dog dog = new Dog();
        Cat cat = new Cat();

    }
}

También tenga en cuenta: la herencia múltiple no es compatible con Java, una subclase solo puede heredar una clase principal

3. Cómo acceden las subclases a los miembros de la clase principal

3.1 Acceso a variables miembro

El acceso a las variables miembro sigue el principio de proximidad, si tiene su propia prioridad, si no, búsquela en la clase padre

Si no se encuentra, busque la variable miembro a la que se accederá en la variable miembro heredada de la clase principal y la compilación fallará si no se encuentra

3.2 Acceso a métodos de miembros

Los métodos miembro tienen diferentes nombres:

Priorice el acceso al suyo propio, si no, acceda al heredado de la clase principal

Los métodos miembro tienen el mismo nombre:

La lista de parámetros del método con el mismo nombre de la clase principal y la subclase es diferente (sobrecarga). Seleccione el método apropiado para acceder de acuerdo con los parámetros pasados ​​por el método de llamada. De lo contrario, se informará un error.

3.3 súper palabra clave

Uso: acceder a miembros de la clase principal en un método de subclase

class Dog extends Animal{
    
    public String silly;
    public void houseGuard() {

        System.out.println(super.name+"看门");

    }
}

 Al nombre de la clase padre no se le asigna un valor inicial, por lo que es nulo, por lo que se accede a la variable miembro de la clase padre con el mismo nombre

 Habrá prioridad para preguntarse, si no, acceso heredado de la clase padre

super. El acceso directo se hereda de la clase principal. En el método de la subclase, si desea acceder explícitamente a los miembros de la clase principal, puede usar la palabra clave super.

Resumir:

super.data; acceda a las variables miembro ordinarias de la clase principal

super.func(); accede al método miembro ordinario de la clase padre

super(); accede al constructor de la clase padre

Nota: Los métodos y variables de miembros ordinarios de la clase principal anterior se refieren a métodos y variables de miembros no estáticos

4. Constructor de subclase

Al construir un objeto de subclase, primero debe llamar al constructor de la clase base y luego ejecutar el constructor de la subclase

Mira el código:

class Animal{
    public String name;
    public int age;

    //提供一个两个该参数的构造方法
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat() {
        System.out.println(name+"吃饭");
    }
}

    //此处报错
class Dog extends Animal{
    
    public String silly;
    public void houseGuard() {
        System.out.println(super.name+"看门");
    }
}

La inicialización del objeto requiere llamar al constructor.

Después de agregar un constructor con dos parámetros, el compilador no proporciona un constructor sin parámetros, de ahí el error

A continuación, veremos cómo inicializar cuando se proporciona un constructor con dos parámetros:

class Dog extends Animal{
    
    public String silly;
        public Dog(String name, int age, String silly) {

        //先初始化父类部分
            super(name, age);
            this.silly = silly;

        }

        public void houseGuard() {
        System.out.println(super.name+"看门");
    }
}

super(nombre,edad) primero llamará al constructor de la clase principal para completar la inicialización

this.silly = silly completará la inicialización de sus propias propiedades

Resumir:

1. La clase principal define explícitamente un constructor predeterminado o sin argumentos, y la primera línea del constructor de la subclase tendrá una llamada super() implícita de forma predeterminada

2. El método de construcción de la clase principal tiene parámetros. En este momento, el usuario debe definir explícitamente el método de construcción de la subclase y seleccionar el método de construcción de la clase principal apropiado para llamar al método de construcción de la subclase, de lo contrario, la compilación fallará.

3. En el constructor de la subclase, cuando super(...) llama al constructor de la superclase, debe ser la primera declaración en el constructor de la subclase.

4. super(...) solo puede aparecer una vez en el constructor de la subclase y no puede aparecer al mismo tiempo que este

5. palabra clave final

1. Modificar variables o campos para representar constantes

2. Clase modificada: indica que esta clase no se puede heredar

String La clase String, que está decorada con final, no se puede heredar

3. Método modificado: indica que el método no se puede anular

6. Herencia y composición

Al igual que la herencia, la composición también es una forma de expresar la relación entre clases, lo que permite la reutilización de código.

La herencia representa la comunidad abstraída por varias clases, y la relación entre objetos es una relación es-un

La composición refleja la relación entre el todo, la parte y la posesión, es decir, la relación de tiene -a

Por ejemplo, una combinación de vehículos y vehículos:

class Tire {
    public void run() {
        System.out.println("轮胎转动");
    }
}

class Light {
    public void light() {
        System.out.println("灯亮");
    }
}

public class Vehicle {
    private Tire tire;
    private Light light;

    public Vehicle(Tire tire,Light light) {
        this.tire = tire;
        this.light = light;
    }

    public void operation() {
        light.light();
        tire.run();
    }

    public static void main(String[] args) {
        Tire tire = new Tire();
        Light light = new Light();
        Vehicle vehicle = new Vehicle(tire,light);
        //灯亮
        //轮胎转动
        vehicle.operation();
    }
}

2. Polimorfismo

1. Reconocer el polimorfismo

Diferentes objetos producirán diferentes estados cuando completen cierto comportamiento, lo que se llama polimorfismo.

Por ejemplo: polimorfismo generado durante el pago móvil

 2. Condiciones de implementación del polimorfismo

1. Debe estar bajo el sistema de herencia

2. La subclase debe anular el método en la clase principal

3. Llame al método anulado a través de la referencia de la clase principal

El polimorfismo se refleja en: cuando se ejecuta el código, cuando se pasan objetos de diferentes clases, se llaman los métodos en las clases correspondientes

P.ej:

class Animal{
    public String name;
    public int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat() {
        System.out.println(name+"吃饭");
    }
}

class Dog extends Animal{
    
    public String silly;

        public Dog(String name, int age, String silly) {
            super(name, age);
            this.silly = silly;
        }
        @Override
        public void eat() {
            System.out.println(name+"吃狗粮");
        }

        public void houseGuard() {
        System.out.println(super.name+"看门");
    }
}
class Cat extends Animal {

    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(name+"吃猫粮");
    }
    //没有添加新属性
    public void catchMouse()  {
        System.out.println(name+"抓老鼠");
    }
}
public class Test {
    public static void eat(Animal animal) {

        animal.eat;

}
    public static void main(String[] args) {
        Dog dog = new Dog("dog",2,"silly");
        Cat cat = new Cat("cat",3);
        eat(dog);
        eat(cat);

    }
}

 El parámetro del método eat en la clase Test es Animal. El método no sabe ni presta atención a qué instancia apunta la referencia actual. En este momento, cuando la referencia llama al método eat, puede haber muchas manifestaciones diferentes. (y la instancia referida por a).correlación), este comportamiento se llama polimorfismo

3. Reescribir

Concepto: el valor de retorno y los parámetros formales no se pueden cambiar. La subclase reescribe el proceso de implementación de los métodos no estáticos, de modificación no privada, de modificación no final y de no construcción de la clase principal.

La ventaja de anular es que las subclases pueden definir su propio comportamiento específico según sea necesario. Es decir, las subclases pueden implementar los métodos de la superclase según sea necesario.

【Reglas de anulación de métodos】

El prototipo del método de la subclase es el mismo que el de la superclase: el nombre del método (lista de parámetros) del tipo de valor devuelto debe ser exactamente el mismo

El tipo de valor de retorno del método anulado puede ser diferente, pero debe tener una relación padre-hijo

Los derechos de acceso no pueden ser inferiores a los derechos de acceso del método anulado en la clase principal. Si public modifica el método de la clase principal, el método anulado en la subclase no se puede declarar como protegido.

Los métodos y constructores de la clase principal que están modificados por static y private no se pueden anular

La anotación @Override puede ayudarnos a realizar algunas comprobaciones de legitimidad y la reescritura no constituye un error.

4. Cambio ascendente y descendente

Upcasting: cree un objeto de subclase y utilícelo como un objeto de clase principal

//语法格式:父类类型对象名 = new 子类类型()

    Animal animal = new Cat("cat",2);

 usar:

Método 1: Asignación directa (el objeto de la subclase se asigna al objeto de la clase principal)

public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog("dog",2,"silly");
        Animal animal = dog;
        Animal animal1 = dog;
        Animal animal2 = dog;
    }
}

Método 2: transferencia de parámetros de método (el parámetro formal es una referencia al tipo principal, que puede recibir objetos de cualquier subclase)

    public static void eat(Animal animal) {

        animal.eat;

    }

Método 3: devolución del método (como valor de devolución: devolver cualquier objeto de subclase)

 public static Animal func(){
        return new Cat("dog",2);
    }

Ventajas: simplifica y flexibiliza la implementación del código

Defecto: no se pueden llamar métodos específicos de subclase

Downcast: la referencia de la clase principal se restaura en el objeto de la clase secundaria

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

        Animal animal = new Cat("haha",2);

        if(animal instanceof Cat){
            Cat cat = (Cat) animal;
            cat.catchMouse();
        }
    }
}

Para mejorar la seguridad del downcasting, se introduce instanceof, si la expresión es verdadera, es seguro lanzar

"El intercambio de este problema está aquí, recuerda darle al blogger un enlace de tres, ¡tu apoyo es la mayor fuerza impulsora para mi creación!

ced485cbb11e458d81a746890b32cf3f.gif

Supongo que te gusta

Origin blog.csdn.net/chenchenchencl/article/details/126235117
Recomendado
Clasificación