08-Herencia de Java, polimorfismo, super palabra clave, palabra clave final

1. Herencia

Cuando existen los mismos atributos y comportamientos en varias clases, estos contenidos se extraen en una sola clase, por lo que varias clases no necesitan definir estos atributos y comportamientos, siempre que hereden esa clase.

Beneficios de la herencia:

  • Reutilización de código
  • Extensión de código
  • Con una relación entre clases y clases, se pueden crear más tipos especiales.

Desventajas de la herencia:

  • Se mejora el acoplamiento de clases.
  • El principio de desarrollo: alta cohesión, bajo acoplamiento.
  • Acoplamiento: la relación entre clase y clase
  • Cohesión: la capacidad de lograr algo por ti mismo

Formato de sintaxis heredado:

【修饰符】 class 子类  extends 父类{
    
    
    
}

Características heredadas :

  • La subclase heredará todas las propiedades y métodos no privados de la clase principal

  • La subclase no heredará el constructor de la clase principal, porque el constructor de la clase principal se utiliza para crear el objeto de la clase principal.

  • El constructor de la subclase debe llamar al constructor de la clase padre

    Al crear el objeto de subclase, se utiliza para inicializar las propiedades heredadas de la clase principal. Puede asignar valores a las propiedades con la ayuda del código en el constructor de la clase principal.

  • Java solo admite herencia única, no se permite la herencia múltiple, pero Java admite herencia múltiple

    • Una subclase solo puede tener una clase principal "directa"
    • La clase principal también puede tener una clase principal
    • Una clase padre puede tener muchas subclases al mismo tiempo

1.1 palabra clave super

super: de la clase padre

uso:

  • super.Properties

Cuando la subclase declara una variable miembro con el mismo nombre que la clase principal, si desea indicar que una variable miembro es de la clase principal, puede agregar "super".

  • super.method

Cuando la subclase sobrescribe el método de la clase principal y necesita llamar al método reemplazado de la clase principal en la subclase, puede usar "super".

  • super () o super (lista de argumentos)

super (): indica que se llama a la estructura sin parámetros de la clase padre

super (lista de argumentos): Indica que se llama a la estructura parametrizada de la clase padre

Nota:

(1) Si desea escribir super () o super (lista de argumentos), debe escribirlo en la primera línea del constructor de subclase

(2) Si no hay nada escrito en el constructor de la subclase: super () o super (lista de argumentos), entonces habrá super () por defecto

(3) Si la clase padre no tiene una estructura sin parámetros, entonces "debe" escribir super (lista de argumentos) en la primera línea del constructor de la subclase

(4) La trazabilidad de super no se limita al padre directo

La diferencia entre esto y super:

Diferencia esta súper
Atributos de acceso Acceda a las propiedades de esta clase, si esta clase no tiene esta propiedad, continúe buscando desde la clase padre Acceso directo a atributos en la clase padre
Método de llamada Métodos de acceso en esta clase, si esta clase no tiene este método, busque en la clase principal Acceso directo a métodos en la clase padre
Constructor de llamadas Para llamar al constructor de esta clase, debe colocarse en la primera línea del constructor Para llamar al constructor de la clase padre, debe colocarse en la primera línea del constructor de la subclase
representante Representa el objeto actual Representa la clase padre

Nota :

  • Si se usa "this." Delante de una propiedad o método, primero busque en esta clase; si no lo encuentra, buscará en la clase principal
  • Si se usa "super." Delante de una propiedad o método, primero se buscará desde la clase principal directa, si no se encuentra, se buscará a lo largo de la relación de herencia
  • Si no hay "esto" ni "super" delante de una propiedad o método, siga el principio de proximidad y comience a buscar

1.2 Reescritura de métodos

Anulación de método (anulación):

Cuando la subclase hereda los métodos de la clase principal y siente que la implementación del cuerpo del método de la clase principal no es adecuada para la subclase, la subclase puede optar por reescribirlo.

Requisitos para la reescritura de métodos:

  • Nombre del método: debe ser el mismo
  • Lista de parámetros formales: debe ser la misma
  • Modificador

Modificador de permiso:> =

  • Tipo de valor devuelto

Si el tipo de datos básico y void: debe ser el mismo

Si es un tipo de datos de referencia: <=

Nota : El método anulado no puede ser estático, final e invisible para las subclases.

La diferencia entre sobrecarga y anulación

Sobrecarga Volver a escribir
posición En la misma clase En clase de padres e hijos
Nombre del método Debe ser lo mismo Debe ser lo mismo
Formulario de tabla de asistencia Debe ser diferente Debe ser lo mismo
Tipo de valor devuelto Irrelevante Los tipos de datos básicos y vacíos deben ser consistentes, los tipos de datos de referencia <=
Modificador de permisos Irrelevante El modificador de permiso del método anulado es el mismo que el método anulado o tiene un alcance de autoridad mayor que el método anulado

2.palabra clave final

final: final

uso:

(1) Clase de modificación (incluida la clase externa y la clase interna)

Indica que esta clase no se puede heredar y no tiene subclases

Mejore la seguridad y mejore la legibilidad del programa.

(2) Método de modificación

Indica que este método no se puede anular.

(3) Variables modificadas (variables miembro (variables de clase, variables de instancia), variables locales)

Se llama constante, lo que significa que el valor de esta variable no se puede modificar.

(4) Modifique el tipo de datos de referencia para indicar que el valor de la dirección no se puede modificar.

Nota: Si una variable miembro se modifica con final, debe asignarse manualmente, y una vez que se asigna el valor, no se puede modificar, es decir, no hay un método establecido.

3. Polimorfismo

Polimorfismo: múltiples manifestaciones de una clase de cosas.

En java

(1) Sobrecarga: múltiples manifestaciones de una función de método en una clase

Reescribir: las clases padre e hijo muestran diferentes formas para el mismo método

(2) Polimorfismo del objeto: si el tipo en tiempo de compilación no es coherente con el tipo en tiempo de ejecución, se producirá polimorfismo (polimorfismo)

La referencia de la clase principal apunta al objeto de la clase secundaria.

Formato de sintaxis:

父类 引用/变量 = 子类的对象;

Premisa polimórfica:

  • heredar
  • Reescritura de métodos
  • Puntos de referencia de supertipo a objeto de subtipo

fenómeno:

  • Variables miembro: no hay polimorfismo, solo mire la clase a la que pertenece la variable de referencia.

  • Llame al método en forma polimórfica: mire a la izquierda / "clase principal" en tiempo de compilación, y mire a la derecha / "clase secundaria" en tiempo de ejecución.

    Al compilar, debido a que se compila de acuerdo con la clase principal, solo se pueden usar los métodos de la clase principal y no se pueden llamar a los métodos extendidos por la subclase;

    La ejecución debe ser el cuerpo del método anulado por la subclase en ejecución.

Ejemplo de código:

class Person{
    
    
	public void eat(){
    
    
		System.out.println("吃饭");
	}
	public void walk(){
    
    
		System.out.println("走路");
	}
}
class Woman extends Person{
    
    
	public void eat(){
    
    
		System.out.println("细嚼慢咽的吃饭");
	}
	public void walk(){
    
    
		System.out.println("婀娜多姿走路");
	}
	public void shop(){
    
    
		System.out.println("买买买...");
	}
}
class Man extends Person{
    
    
	public void eat(){
    
    
		System.out.println("狼吞虎咽的吃饭");
	}
	public void walk(){
    
    
		System.out.println("大摇大摆的走路");
	}
	public void smoke(){
    
    
		System.out.println("吞云吐雾");
	}
}
class Test{
    
    
    public static void main(String[] args){
    
    
        Person p = new Woman();//多态引用
        p.eat();//执行子类重写
        p.walk();//执行子类重写
        //p.shop();//无法调用
    }
}

3.1 Aplicación del polimorfismo

(1) Parámetros polimórficos: el parámetro formal es la clase principal y el parámetro real es el objeto de subclase

Código de muestra:

class Test{
    
    
    public static void main(String[] args){
    
    
        test(new Woman());//实参是子类对象
        test(new Man());//实参是子类对象
    }
    public static void test(Person p){
    
    //形参是父类类型
        p.eat();
        p.walk();
    }
}

(2) Matriz polimórfica: el tipo del elemento de la matriz es la clase principal y el elemento almacena el objeto de la subclase

Código de muestra: matriz polimórfica

class Test{
    
    
    public static void main(String[] args){
    
    
        Person[] arr = new Person[2];//多态数组
        arr[0] = new Woman();
        arr[1] = new Man();
        
        for(int i=0; i<arr.length; i++){
    
    
            all[i].eat();
            all[i].walk();
        }
    }
}

3.2 Transición ascendente y descendente

(1) Transformación ascendente: conversión automática de tipos

Cuando el objeto de la subclase se asigna a la variable de la clase principal (es decir, referencia polimórfica), en el momento de la compilación, este objeto se convierte a la clase principal. En este momento, no puede ver los métodos "específicos y extendidos" de la subclase.

(2) Transformación descendente: transformación forzada. Existe un riesgo: cuando los tipos son incompatibles, se producirá una ClassCastException cuando se realice la conversión. Para evitar la ocurrencia de esta excepción, se recomienda realizar un juicio de tipo de tiempo de ejecución antes de realizar el downcasting, es decir, la instancia de que se menciona a continuación.

Cuando necesite asignar una variable de una clase principal a una variable de una subclase, debe abatirse.

Transformación de tipo en tiempo de ejecución para tener éxito, debemos asegurarnos de que la preservación del tipo de objeto variable sea <= giro fuerte

Código de muestra:

class Person{
    
    
	//方法代码省略...
}
class Woman extends Person{
    
    
    //方法代码省略...
}
class ChineseWoman extends Woman{
    
    
	//方法代码省略...
}
 public class Test{
    
    
     public static void main(String[] args){
    
    
		//向上转型
		Person p1 = new Woman();
		//向下转型
		Woman m = (Woman)p1; 
		//p1变量中实际存储的对象就是Woman类型,和强转的Woman类型一样

		//向上转型
		Person p2 = new ChineseWoman();
		//向下转型
		Woman w2 = (Woman) p2; 
		//p2变量中实际存储的对象是ChineseWoman类型,强制的类型是Woman,ChineseWoman<Woman类型     
     }
 }

(3) instancia de

Formato de sintaxis de expresión:

对象/变量  instanceof  类型

Resultado de la operación: verdadero o falso

efecto:

Se utiliza para determinar si el objeto pertenece a este tipo, o si es un objeto de este tipo o un objeto de esta subclase de tipo. En el desarrollo de programas java, antes de cualquier operación de transformación descendente, debe usarse instanceof para juzgar, y deben desarrollarse dichos hábitos de programación.

Código de muestra:

class Person{
    
    
	//方法代码省略...
}
class Woman extends Person{
    
    
    //方法代码省略...
}
class ChineseWoman extends Woman{
    
    
	//方法代码省略...
}

 public class Test{
    
    
     public static void main(String[] args){
    
    
         Person p = new Person();
         Woman w = new Woman();
         ChineseWoman c = new ChineseWoman();
         
         if(p instanceof Woman){
    
    //false
             
         }
         if(w instanceof Woman){
    
    //true
             
         }
         if(c instanceof Woman){
    
    //true
             
         }
     }
 }

Supongo que te gusta

Origin blog.csdn.net/m0_46988935/article/details/110198397
Recomendado
Clasificación