[El camino para que Java se convierta en rey] Capítulo 13: Java SE (Programación orientada a objetos - Herencia)

contenido

Objetivos de esta sección

1. ¿Qué es la herencia?

heredar:

súper palabra clave

palabra clave protegida

palabra clave final


Objetivos de esta sección

heredar

1. ¿Qué es la herencia?

Funciones orientadas a objetos:

Encapsulación: los miembros y métodos de datos públicos innecesarios se modifican con la palabra clave privada. Significado: Seguridad.

heredar:

antecedentes:

Clases creadas en código, principalmente para abstraer algunas cosas en la realidad (incluyendo propiedades y métodos).

A veces hay algunas asociaciones entre cosas objetivas, por lo que también habrá ciertas asociaciones cuando se expresan como clases y objetos.

Por ejemplo, diseñe una clase para representar animales.

Nota: podemos crear un archivo java separado para cada clase. El nombre de la clase debe coincidir con el nombre del archivo .java (se distingue entre mayúsculas y minúsculas).

class Dag {
    public String name;
    public int age;

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

}
class Bird{
    public String name;
    public int age;
    public String wing;

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

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

    }

Se definen dos clases, una es la clase Dag y la otra es la clase Bird

Compare las dos clases anteriores:

Encontraremos que hay algunos puntos en común entre ellos, podemos abstraer sus similitudes y redefinir una clase:

class Animal{
    public String name;
    public int age;

    public void eat(){
        System.out.println("eat()");
    }
}
class Dag {
    public String name;
    public int age;

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

}
class Bird{
    public String name;
    public int age;
    public String wing;

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

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

    }
    
}

 Las tres clases tienen un método de alimentación idéntico y se comportan exactamente igual.

Las tres clases tienen el mismo atributo de nombre y el significado es exactamente el mismo.

Lógicamente, tanto Dag como Bird son una especie de Animal.

En este punto, podemos dejar que Dag y Bird hereden la clase Animal respectivamente para lograr el efecto de reutilización de código.

En este momento, las clases heredadas como Animal se llaman clases padre, clases base o superclases. Para clases como Dag y Bird, las llamamos subclases. Las clases derivadas son similares a los hijos reales que heredan la propiedad de sus padres. Las subclases también heredar los campos y métodos de la superclase para lograr el efecto de reutilización de código.

reglas gramaticales

Sintaxis básica:

clase subclase extiende superclase {

}

Usar extensiones para especificar la clase principal

Una subclase en Java solo puede heredar una clase principal (mientras que lenguajes como C++/Python admiten herencia múltiple)

Las subclases heredan todos los campos y métodos públicos de la superclase

Para los campos y métodos privados de la clase principal, la clase secundaria no puede acceder a ellos

Una instancia de una subclase también contiene una instancia de la clase principal. Puede usar la palabra clave super para obtener una referencia a una instancia de la clase principal.

Para el código anterior, la herencia se puede usar para mejorar. En este momento, dejamos que Dag y Bird hereden de la clase Animal, luego Dag no necesita escribir el campo de nombre y el método de alimentación cuando se define. 

class Animal{
    public String name;
    public int age;

    public void eat(){
        System.out.println("eat()");
    }
}
class Dag extends Animal {


}
class Bird extends Animal{

    public String wing;

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

    }

}

Debido a que la subclase hereda los campos y métodos de la clase principal, escribimos esto en la función principal:

 Extends originalmente significaba "extensión" en inglés. La herencia de la clase que escribimos también puede entenderse como "extensión" en el código basado en la clase padre.

Por ejemplo, la clase Bird que escribimos extiende el método fly sobre la base de Animal.

 Si cambiamos la edad a privada, las subclases no pueden acceder a ella en este momento

 Debido a que la edad ahora es privada, la edad no se puede usar en subclases

súper palabra clave

Cuando se construye la subclase, es necesario ayudar a la superclase a construir

Cuando escribimos así, no se reporta ningún error. ¿Por qué es esto?

 Tres usos de super: //No puede aparecer en métodos estáticos, porque super es equivalente a una referencia al objeto de la clase principal

1. super(): llamar al constructor de la clase padre

 2. super.function(): llamar al método normal de la clase padre

3. super.data: llamar a las propiedades de los miembros de la clase principal

palabra clave protegida

Acabamos de descubrir que si el campo está configurado como privado, las subclases no pueden acceder a él. Pero configurarlo como público viola la intención original de nuestra "encapsulación". Lo mejor de ambos mundos es la palabra clave protegida.

Para la persona que llama a la clase, no se puede acceder a los campos y métodos protegidos

Para las subclases de la clase y otras clases en el mismo paquete, los campos y métodos protegidos son accesibles

// Animal.java 
public class Animal { 
 protected String name; 
 public Animal(String name) {
        this.name = name; 
 } 
 public void eat(String food) { 
 System.out.println(this.name + "正在吃" + food); 
 } 
} 
// Bird.java 
public class Bird extends Animal { 
 public Bird(String name) { 
 super(name); 
 } 
 public void fly() { 
 // 对于父类的 protected 字段, 子类可以正确访问
 System.out.println(this.name + "正在飞 ︿( ̄︶ ̄)︿"); 
 } 
} 
// Test.java 和 Animal.java 不在同一个 包 之中了. 
public class Test { 
 public static void main(String[] args) { 
 Animal animal = new Animal("小动物"); 
 System.out.println(animal.name); // 此时编译出错, 无法访问 name 
 } 
} 

Hay cuatro derechos de acceso para campos y métodos en Java

privado: accesible dentro de la clase, no accesible fuera de la clase

Predeterminado (también llamado acceso al paquete): acceso dentro de la clase, las clases en el mismo paquete pueden acceder, otras clases no.

protegido: se puede acceder dentro de la clase, las subclases y las clases en el mismo paquete pueden acceder, otras clases no pueden acceder.

público: tanto dentro de la clase como las personas que llaman de la clase pueden acceder

palabra clave final

Una vez que aprendimos la palabra clave final, al modificar una variable o campo, significa constante (no se puede modificar).

int final a = 10;

a = 20; // error de compilación 

La palabra clave final también puede modificar una clase, lo que significa que la clase modificada no se puede heredar.

final public class Animal { 
 ... 
} 
public class Bird extends Animal { 
 ... 
} 
// 编译出错
Error:(3, 27) java: 无法从最终com.bit.Animal进行继承

La función de la palabra clave final es restringir las clases para que no se hereden.

La cosa "restringida" significa "inflexible". En programación, la flexibilidad a menudo no es algo bueno. Flexible puede significar más propenso a errores. Cuando se hereda una clase modificada con final, compilará un error. En este punto, podemos recordarnos que tal herencia es contraria a la intención original de este diseño de clase

La clase String que solemos usar se modifica con final y no se puede heredar

 

Supongo que te gusta

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