La esencia del pensamiento orientado a objetos de Java (3)

1. ¿Qué es el modelado ascendente?

1. Modelado ascendente: la clase principal se refiere al objeto de la subclase.

1.1. Definición de modelado ascendente

  • 1) El supertipo (clase principal) se refiere al objeto de la clase derivada (subclase).
  • 2) Lo que se puede señalar mediante variables de referencia depende del tipo de referencia.
  • 3) Nota: Algunos dichos se denominan transformación ascendente, que significa lo mismo.
  • Antes de mirar las castañas de código, incluido el siguiente ejemplo, recuerde tres conceptos:
    modelado ascendente : referencias de clase principal a
    sobrecarga de objetos de subclases, el mismo nombre de método , La lista de parámetros es diferente, el nombre del
    método es el mismo, la lista de parámetros es la misma, el cuerpo del método es diferente
public class UploadDemo {
    
    

	public static void main(String[] args) {
    
    
		Aoo o1 = new Aoo();
		o1.a = 1;
		o1.show();
		
		Boo o2 = new Boo();
		o2.a = 1;
		o2.b = 2;
		o2.show();
		
		//超类型引用指向派生类的对象
		Aoo o3 = new Boo(); 
		o3.a = 1;
		o3.show();
		//o3.b = 2; //报错!向上造型:能点出什么,看引用的类型。
		//若要使它不报错,得在父类加不是私有变量b
	}
}


class Aoo{
    
    
	int a;
	void show() {
    
    
		System.out.println("我是超类(父类)");
	}
}
class Boo extends Aoo{
    
    
	int b;
	void show() {
    
    
		System.out.println("我派生类(子类)");//超类方法被重写
	}
}
  • resultado de la operaciónInserte la descripción de la imagen aquí

1.2. Suplemento de detalles de modelado ascendente

  • En algunos libros, se denomina objeto de transformación superior. Pero la definición y la teoría son las mismas, solo use el código para dar una castaña para entender.
  • Las características del objeto de transformación superior:
    • 1. Puede operar herencia u ocultar variables miembro, y puede llamar a métodos de herencia o invalidación de subclase.
    • 2. No se pueden operar las nuevas variables miembro de la subclase y no se puede llamar al nuevo método de la subclase.
  • El ejemplo de código es el siguiente:
  • Inserte la descripción de la imagen aquí

2. Método de reescritura y reescritura de reglas a seguir

2.1. Reescritura de métodos

  • 2.1.1 Ocurre en la clase principal y secundaria, el nombre del método y la lista de parámetros son los mismos y el cuerpo del método es el mismo.
  • 2.1.2 Cuando se llama al método de anulación, depende del tipo de objeto.
  • Veamos las castañas:
package oop.day04;

class Dongwu {
    
    		//父类
	protected String name;
	protected int age;
	
	public Dongwu(String name, int age){
    
    
		this.name = name;
		this.age = age;
	}
	public void runing(){
    
    
		System.out.println(name+"今年"+age);
	}
}
class Cat extends Dongwu{
    
    		//子类
	int weight;	//重量
	public Cat(String name, int age, int weight){
    
    
		super(name,age);
		this.weight = weight;
	}
	public void runing(){
    
    
		System.out.println(name+"今年"+age+",重量"+weight+"KG");
	}
}
class Dog extends Dongwu{
    
    		//子类
	int size;	//大小
	public Dog(String name, int age, int size){
    
    
		super(name,age);
		this.size = size;
	}
	public void runing(){
    
    
		System.out.println(name+"今年"+age+",大小"+size+"KG");
	}
}

public class Test3 {
    
    
	public static void main(String[] args) {
    
    
		Dongwu[] dw = new Dongwu[3];
		dw[0] = new Cat("加菲猫",8,50);
		dw[1] = new Dog("阿拉斯加",15,70);
		dw[2] = new Dog("英短猫",13,80);
		for(int i=0; i<dw.length; i++) {
    
    
			System.out.println(dw[i].name);
			dw[i].runing();
		}
	}
}
  • resultado:Inserte la descripción de la imagen aquí

2.2. Reescribir reglas

  • Siga: Principio "Dos iguales, dos pequeños, uno grande".
  • Dos iguales: el nombre del método es el mismo y la lista de parámetros es la misma.
  • Dos pequeños: el tipo de valor de retorno del método de la clase derivada (subclase) es menor o igual que el método de la superclase (clase principal).
    • La segunda escuela primaria se refiere a:
    • Cuando void no tiene valor de retorno, debe ser el mismo.
    • El tipo de datos básico debe ser el mismo (es decir, el tipo de valor de retorno).
    • Cuando se hace referencia a un tipo de datos, es menor o igual que la superclase (clase principal).
    • La segunda escuela primaria se refiere a:
    • La excepción lanzada por el método de la clase derivada (subclase) es menor o igual que el método de la superclase (clase principal).
  • Uno grande:
    • Los derechos de acceso del método de clase derivada (subclase) son mayores o iguales que el método de superclase (clase principal).
  • Mira las castañas:
package oop.day04;
//重写
public class OverrideDemo {
    
    

	public static void main(String[] args) {
    
    
		
	}
}

class Coo{
    
    
	void test() {
    
    
		
	}
	int then() {
    
    
		return 0;		
	}
	double show() {
    
    
		return 0.0;
	}
	Doo say() {
    
    
		return null;
	}
}

class Doo extends Coo{
    
    
	//int test() {return 5;} 	//编译错误,void时必须相同
	//int then() {return 1.1;} 	//编译错误,返回值类型必须小于或等于超类。不能返回double型1.1
	//int show() {return 0;} 	//编译错误,基本数据类型必须相同,即返回值类型相同。show()方法定义了double型了
	//Coo say() {return null;} 	//编译错误,引用类型时必须小于或等于超类
	Doo say() {
    
    return null;} 	//超类大于派生类(这里指代的访问权限即访问修饰符)
	//访问修饰符的讲解,将在下一篇内容提到。感谢阅读者的支持
}

Inserte la descripción de la imagen aquí

3. La diferencia entre reescribir y sobrecargar

3.1 Diferencia

  • Sobrecarga ---------- el nombre del método es el mismo, la lista de parámetros es diferente

  • Reescribir ---------- El nombre del método es el mismo, la lista de parámetros es la misma y el cuerpo del método es diferente

  • Mira un ejemplo, el siguiente código:

  • Sobrecarga para ver el tipo de parámetro, reescribe para ver el tipo de objeto, también puedes decir el nuevo objeto (¡énfasis! ¡Énfasis! ¡Énfasis! ¡Importante! Dilo tres veces)

package oop.day04;
//重写与重载
public class OverrideOverloasDemo {
    
    
	public static void main(String[] args) {
    
    
		//重载看参数类型,重写看对象类型,也可以说new出的对象(重点!重点!重点!重要的说三遍)
		Goo goo = new Goo();  
		Eoo o = new Foo();	  //向上造型 ------父类引用指向子类的对象。
		goo.test(o);

		Eoo foo = new Eoo();//当前new对象是Eoo
		foo.show();
	}
}
class Goo{
    
    		//重载-------方法名相同,参数列表不同,方法体不同
	void test(Eoo o) {
    
    
		System.out.println("超类型参数");
		o.show();
	}
	void test(Foo o) {
    
    
		System.out.println("派生类型参数");
		o.show();
	}
}
class Eoo{
    
    
	void show() {
    
    
		System.out.println("超类show");
	}
}
class Foo extends Eoo{
    
    
	void show() {
    
    
		System.out.println("派生类show");//show()方法被重写,若没被重写,则调用超类的方法“超类show”
	}
}
  • Los resultados muestran que:Inserte la descripción de la imagen aquí

¡Tenga paciencia con el contenido de seguimiento y venga pronto! Escribir no es fácil, como 3Q
Si hay algún error, comente

La lista de capítulos está aquí: https://blog.csdn.net/qq_41254299/article/details/106638651
Indique la fuente para la reimpresión: https://blog.csdn.net/qq_41254299
Este artículo es de [Superclover_'s blog]

Supongo que te gusta

Origin blog.csdn.net/qq_41254299/article/details/107168550
Recomendado
Clasificación