Aprendizaje y comprensión de herencia y polimorfismo, ocultación de variables miembro y reescritura de métodos, superpalabra clave, palabra clave final, objeto de transformación de objeto, clase abstracta (java)

heredar

Es un mecanismo para crear nuevas clases a partir de clases existentes. Usando la herencia, primero podemos crear una clase general con propiedades comunes y luego crear una nueva clase con propiedades especiales basadas en la clase general. La nueva clase hereda el estado y el comportamiento de la clase general y agrega su propio estado y comportamiento nuevos. según sea necesario. Las clases derivadas de la herencia se denominan subclases y las clases heredadas se denominan clases principales (superclases).
Nota : Java no admite herencia múltiple (las subclases solo pueden tener una clase principal).

declarar subclases

Utilice la palabra clave extends para definir una subclase de una clase, el formato es el siguiente:
clase nombre de subclase extiende nombre de clase principal { ... } Por ejemplo: clase Estudiante extiende Personas { ... } Explicación: Defina la clase Estudiante como subclase de la clase Personas, la clase Personas Es la clase padre de la clase Estudiante






Herencia de subclases

Las clases pueden tener dos miembros importantes: variables miembro y métodos. Algunos de los miembros de la subclase son declarados y definidos por la propia subclase, y la otra parte se hereda de su clase principal.

La llamada subclase hereda las variables miembro de la clase principal es utilizar las variables heredadas como una de sus propias variables miembro, como si estuvieran declaradas directamente en la subclase y pueden ser operadas por cualquier método de instancia definido en la subclase.

La llamada subclase hereda el método de la clase principal es utilizar el método heredado como un método en la subclase, como si estuvieran definidos directamente en la subclase, y puede ser llamado por cualquier método de instancia definido en la propia subclase.
Ejemplo: herencia de subclases

clase Padre
{ peso flotante, altura;
Cabeza de hilo;
void hablar(String s)
{ System.out.println(s);
}
}
clase Hijo extiende Padre
{ String mano,pie;
}

Hijo s=nuevo Hijo();

Herencia de subclases y clases principales en el mismo paquete

Si la subclase y la clase principal están en el mismo paquete, entonces la subclase hereda naturalmente las variables miembro no privadas de su clase principal como sus propias variables miembro, y también hereda naturalmente los métodos no privados de la clase principal como propios. Los derechos de acceso del método, variable miembro heredada o método permanecen sin cambios.

Herencia donde la subclase y la superclase no están en el mismo paquete

Si la subclase y la clase principal no están en el mismo paquete, entonces la subclase hereda las variables miembro públicas y protegidas de la clase principal como variables miembro de la subclase, y hereda los métodos públicos y protegidos de la clase principal como métodos. de la subclase. Los derechos de acceso de los miembros o métodos heredados permanecen sin cambios.

Generación de objetos de subclase.

Cuando una subclase crea un objeto, el constructor de la subclase siempre llama primero a un constructor de la clase principal para completar la creación de la clase principal; luego llama al propio constructor de la subclase para completar la creación de la subclase. Si el constructor de la subclase no indica claramente qué constructor de la clase principal usar, la subclase llama al constructor de la clase principal sin parámetros.

Cuando una subclase crea un objeto, el constructor de la subclase siempre llama primero a un constructor de la clase principal para completar la creación de la clase principal; luego llama al propio constructor de la subclase para completar la creación de la subclase. Si el constructor de la subclase no indica claramente qué constructor de la clase principal usar, la subclase llama al constructor de la clase principal sin parámetros.
Las subclases pueden operar variables y métodos no heredados por las subclases a través de métodos heredados.Conclusión
:
1) Al crear objetos de subclases, las subclases siempre llaman a todos los constructores de superclases en orden de arriba a abajo en la jerarquía. Si la herencia y la combinación se usan juntas, primero se debe construir el constructor de la clase base y luego se debe llamar al constructor del objeto combinado (la combinación se llama en el orden de declaración).
2) Si la clase padre no tiene un constructor sin parámetros, entonces en el constructor de la subclase se le debe indicar explícitamente que llame a un constructor con parámetros de la clase padre.A través de la palabra clave super, esta declaración también debe aparecer en el constructor La primera oración del método.

Ocultación de variables miembro y anulación de métodos

1) Para las variables miembro que las subclases pueden heredar de la clase principal, siempre que las variables miembro declaradas en la subclase tengan el mismo nombre que las variables miembro de la clase principal, la subclase ocultará las variables miembro heredadas. la subclase, esto es lo mismo que la variable principal
. Cuando se usa una variable miembro con el mismo nombre que la clase, la subclase opera en la variable miembro redeclarada por la subclase. en lugar de estar escondido.
2)
1. Reglas gramaticales para anular
Si la subclase hereda el método de instancia de la clase principal, entonces la subclase tiene derecho a anular este método.
La reescritura de métodos se refiere a: un método se define en la subclase, el tipo de este método es el mismo que el tipo del método de la clase principal o un subtipo del tipo del método de la clase principal, y el nombre de la El método, el número de parámetros, el tipo de parámetros y el método de la clase principal son exactamente los mismos
. El propósito de reescribir
Las subclases pueden ocultar métodos heredados mediante la reescritura de métodos, y las subclases pueden cambiar el estado y el comportamiento de la clase principal a su propio estado y comportamiento mediante la reescritura de métodos.
3. Invocar el método después de reescribir
Un objeto creado por una subclase, si la subclase reescribe el método de la clase principal, el sistema de ejecución llama al método reescrito por la subclase,
un objeto creado por la subclase, si la subclase Si el método de la clase principal no se reescribe, el sistema de ejecución llama al método heredado de la subclase
4. Precauciones para la reescritura
Al reescribir el método de la clase principal, no está permitido reducir los derechos de acceso del método, pero los derechos de acceso pueden incrementarse (el orden de los modificadores de restricción de acceso de mayor a menor derecho de acceso es: público, protegido, amigable, privado).

súper palabra clave

1 Use super para operar variables miembro ocultas y métodos
Las subclases pueden ocultar variables miembro y métodos heredados de las clases principales. Si desea utilizar variables miembro o métodos ocultos por subclases en subclases, puede usar la palabra clave super. Por ejemplo, super.x y super.play() son para acceder y llamar a la variable miembro x y al método play() oculto por la subclase. 2
Utilice super para llamar al constructor de la clase principal
. La subclase no hereda el constructor de la clase principal, por lo tanto, la subclase Si desea utilizar el método de construcción de la clase principal, debe usarlo en el método de construcción de la subclase y debe usar la palabra clave super para expresar, y super debe ser el primero declaración en el método de construcción de la subclase.

palabra clave final

La palabra clave final puede modificar variables locales en clases, variables miembro y métodos.
Puedes usar final para declarar una clase como final. Una clase final no se puede heredar, es decir, no puede tener subclases.
Tales como: final clase A { ... ... } Si un método en la clase principal se modifica con final, entonces este método no permite que las subclases se anulen. Si una variable miembro o una variable local se modifica como final, es una constante.



objeto upcast del objeto

Suponiendo que la clase A es la clase principal de la clase B, cuando se crea un objeto con una subclase y la referencia de este objeto se coloca en el objeto de la clase principal, se dice que el objeto a es un objeto upcast del objeto b. Por ejemplo:
A a;
a=new B();
o
A a;
B b=new B();
a=b;
el uso del objeto de transformación superior
1. El objeto de transformación superior no puede operar la nueva variable miembro del subclase; no se puede llamar Métodos agregados por subclases.
2. Los objetos de actualización pueden acceder a variables miembro heredadas u ocultas por subclases, y también pueden llamar a métodos heredados por subclases o métodos de instancia anulados por subclases.
3. Si la subclase reescribe un método de instancia de la clase principal, cuando se llama al método de instancia con el objeto de transformación, se debe llamar al método de instancia reescrito por la subclase.

polimorfismo

El polimorfismo significa que cuando un método de una clase principal es anulado por sus subclases, cada una puede generar su propio comportamiento funcional.

clase abstracta y método abstract()

Una clase modificada con la palabra clave abstract se llama clase abstracta (clase abstracta).
Por ejemplo: clase abstracta A { ... ... } El método modificado con la palabra clave abstract se llama método abstracto (método abstracto) Por ejemplo: abstract int min(int x, int y); La clase abstracta tiene lo siguiente características En comparación con las clases ordinarias, abstract Puede haber métodos abstractos en una clase. También puedes prescindir de él. Para los métodos abstractos, solo se permiten declaraciones, no se permite la implementación y no se permite el uso de final para modificar métodos abstractos. Para la clase abstracta, el nuevo operador no se puede utilizar para crear objetos de esta clase, solo se pueden generar sus subclases y las subclases pueden crear objetos. Si una clase es una subclase de una clase abstracta, debe implementar específicamente todos los métodos abstractos de la clase principal.







Programación orientada a abstractos

Al diseñar un programa, primero puede declarar una clase abstracta y declarar varios métodos abstractos en la clase para indicar la importancia de estos métodos en todo el diseño del sistema, y ​​los detalles del cuerpo del método se completan con sus subclases no abstractas.

Luego use el polimorfismo para realizar la programación. La técnica principal de usar polimorfismo para la programación es usar la reescritura de métodos y los objetos de actualización, es decir, el objeto de declaración de clase abstracta se usa como un objeto de actualización de su subclase, luego el objeto de actualización puede llamar al método reescrito por la subclase.

La llamada programación orientada a lo abstracto significa que cuando se diseña una clase importante, la clase no está orientada a una clase específica, sino a una clase abstracta, es decir, los datos importantes en la clase diseñada son los objetos declarados por el resumen. clase, no la clase concreta objeto declarado.

ejemplo

El siguiente es un ejemplo para describir el uso simple de herencia, reescritura y clases abstractas.

Diseñe un "simulador" de sonidos de animales, con la esperanza de que el simulador pueda simular los sonidos de muchos animales. Los requisitos son los siguientes:

  1. Escribir una clase abstracta Animal
    La clase abstracta de Animal tiene dos métodos abstractos cry() y getAnimalName(), que requieren que varios animales específicos den sus propias llamadas y nombres de especies.
  2. Escribe la clase de simulador Simulador.
    Esta clase tiene un método playSound (Animal animal) y el parámetro de este método es de tipo Animal. Es decir, animal puede llamar al método cry() reescrito por la subclase de Animal para reproducir el sonido de un animal específico, y llamar al método getAnimalName() reescrito por la subclase para mostrar el nombre de la especie animal.
  3. Escribe subclases de la clase Animal: clases de perros y gatos.
  4. Escriba la clase principal Aplicación (programa de usuario)
    y al menos incluya el siguiente código en el método principal de la clase principal Aplicación;
    Simulador simulador =nuevo Simulador();
    simulador.playSound(nuevo Perro());
    simulador.playSound(nuevo Gato ());

La siguiente tabla es el diagrama UML de Simulador, Animal, Perro y Gato.
inserte la descripción de la imagen aquí

//Animal.java
public abstract class Animal{
    
     //定义抽象类
	public abstract void cry(); //声明抽象方法
	public abstract String getAnimalName();
}
//Simulator.java 
public class Simulator{
    
     //编写模拟器类
	public void playSound(Animal animal){
    
     //实现调用对象参数方法,即animal参数可以调用Animal类子类的方法
		System.out.print("现在播放"+animal.getAnimalName()+"类的声音:");
		animal.cry();
	}
}
//Dog.java
public  class Dog extends Animal{
    
     //编写Dog类继承
	public void cry(){
    
     //实现父类方法的内容
		System.out.println("汪汪....汪");
	}
	public String getAnimalName(){
    
    
		return "狗";
	}
}
//Cat.java 
public class Cat extends Animal{
    
      //编写Cat类继承
	public void cry(){
    
      //实现父类方法的内容
		System.out.println("喵喵.....喵喵");
	}
	public String getAnimalName(){
    
    
		return "猫";
	}
}

//Application.java
public class Application{
    
      //编写主类
	public static void main(String args[]){
    
    
		Simulator simulator=new Simulator(); //创建模拟器对象
		simulator.playSound(new Dog());  //调用模拟器方法参数为Animal类型(对象的上转型对象)
		simulator.playSound(new Cat());
	}
}
























Supongo que te gusta

Origin blog.csdn.net/weixin_44659084/article/details/105232118
Recomendado
Clasificación