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
}
}
}