Introducción a la super palabra clave en Java

Dado que la subclase no puede heredar el método de construcción de la clase principal, si desea llamar al método de construcción de la clase principal, puede utilizar la palabra clave super. super se puede utilizar para acceder al constructor, métodos comunes y propiedades de la clase principal.

La función de la súper palabra clave:

  • Llame explícitamente al constructor de la clase padre en el constructor de la subclase
  • Acceda a métodos y variables de miembros de la clase principal.

1. Use super para llamar al método de construcción de la clase principal

super debe ser la primera declaración en el método de construcción de subclase

Cuando definimos varios constructores en la clase padre, deberíamos incluir un constructor sin parámetros para evitar errores cuando la subclase omite super .

Declare la clase principal Person y la subclase Student, y defina un constructor con parámetros en la clase Person. El código es el siguiente:

public class Person {
    public Person(String name) {

    }
}
public class Student extends Person {

}

Verá que la clase Student tiene un error de compilación, lo que le indica que debe definir explícitamente el método de construcción, el mensaje de error es el siguiente:

El superconstructor implícito Person () no está definido para el constructor predeterminado. Debe definir un constructor explícito

En este ejemplo, la JVM agrega un constructor sin argumentos a la clase Student de forma predeterminada, y se llama a super () de manera predeterminada en este método, pero el constructor no existe en la clase Person, por lo que se producirán errores de compilación.

Si no se escribe ningún constructor en una clase, JVM generará un constructor sin argumentos predeterminado. En la relación de herencia, porque en el método de construcción de la subclase, la primera instrucción por defecto llama al método de construcción sin parámetros de la clase padre (es decir, el valor predeterminado es super (), generalmente esta línea de código se omite). Entonces, cuando se define un constructor parametrizado en la clase padre, pero no se define ningún constructor sin parámetros, el compilador nos obligará a definir un constructor con el mismo tipo de parámetro. 

La subclase Student hereda la clase Person y usa la super declaración para definir el método de construcción de la clase Student. El código de muestra es el siguiente:

public class Student extends Person {
    public Student(String name, int age, String birth) {
        super(name, age); // 调用父类中含有2个参数的构造方法
    }

    public Student(String name, int age, String sex, String birth) {
        super(name, age, sex); // 调用父类中含有3个参数的构造方法
    }
}

 Como se puede ver en el código del método de construcción de la clase Student anterior, super se puede usar para llamar directamente al método de construcción en la clase principal, lo que hace que la escritura del código sea más concisa y conveniente.
El compilador agregará automáticamente la primera oración del método de construcción de la subclase super();para llamar al método de construcción sin parámetros de la clase padre. Debe estar escrito en la primera oración del método de construcción de la subclase, o puede omitirse. Al llamar a otros métodos de construcción de la clase padre a través de super, solo necesita pasar los parámetros correspondientes.

public class Student 
{
	int number;
	String name;
	Student(){
	}
	Student(int number, String name){
		this.number = number;
		this.name = name;
	}
	public int getNumber(){
		return number;
	}
	public String getName(){
		return name;
	}
}
public class UniverStudent extends Student
{
	boolean isMarriage;   //子类新增的结婚属性
	UniverStudent(int number, String name, boolean b){
		super(number, name);
	}
	public boolean getIsMarriage(){
		return isMarriage;
	}
}
public class Example5_6 
{
	public static void main(String[] args) 
	{
		UniverStudent zhang = new UniverStudent(20111, "张三", false);
		int number = zhang.getNumber();
		String name = zhang.getName();
		boolean marriage = zhang.getIsMarriage();
		System.out.println(name + "的学号是:" + number);
		if(marriage == true){
			System.out.println(name + "已婚");
		}
		else{
			System.out.println(name + "未婚");
		}
	}
}

2. Llame a los métodos y variables de miembros ocultos

El uso de super para acceder a los miembros en la clase principal es similar al uso de esta palabra clave, excepto que se refiere a la clase principal de la subclase. El formato de sintaxis es el siguiente:

super.member

Entre ellos, miembro es un atributo o método de la clase principal. Utilice super para acceder a las propiedades y métodos de la clase principal sin estar en la primera línea.

Si desea utilizar variables miembro o métodos ocultos por la subclase, puede utilizar la palabra clave super . Por ejemplo, super.x , super.play () son para acceder y llamar a la variable miembro x oculta por la subclase y el método play () .

Cuando super llama a un método oculto, la variable miembro que aparece en el método se refiere a la variable miembro oculta

public class Sum 
{
	int n;
	public double f(){
		double sum = 0;
		for(int i = 1; i<= n; i++){
			sum += i;
		}
		return sum;
	}
}
public class Average extends Sum 
{
	double n;  //子类继承的int型变量n被隐藏
	public double f(){
		double c;
		super.n = (int)n;  //double类型变量n做int转换,将结果赋给隐藏的int型变量n
		c = super.f();
		return c + n;
	}
	public double g(){
		double c;
		c = super.f();
		return c - n;
	}
}
public class Example5_7 
{
	public static void main(String[] args) 
	{
		Average aver = new Average();
		aver.n = 100.5678;
		double result1 = aver.f();
		double result2 = aver.g();
		System.out.println("result1 = " + result1);
		System.out.println("result2 = " + result2);
	}
}

Si se reescribe como (orden inverso)

double result2 = aver.g();

double result1 = aver.f();

resultado de la operación:

resultado1 = 5150.5678

resultado2 = -100.5678

Debido a que "super.f ();" debe ejecutarse durante la ejecución de "aver.g ();", la n que aparece en super.f () está oculta y n aún no se ha asignado. El valor predeterminado es 0;

3. La diferencia entre super y this

esto se refiere a la referencia del objeto actual, y super es la referencia al objeto padre del objeto actual. Presentemos brevemente el uso de super y this palabras clave.

Uso de la palabra clave super:

  • super. Nombre de la propiedad principal: llame a la propiedad en la clase principal
  • super. Nombre del método principal: llame al método en la clase principal
  • super (): llama al método de construcción sin parámetros de la clase padre
  • super (parámetro): llama al método de construcción parametrizado de la clase padre

Si la primera línea de código del constructor no es this () y super (), el sistema agregará super () por defecto.


Uso de esta palabra clave:

  • this. Nombre de propiedad: representa la propiedad del objeto actual
  • this. nombre del método (parámetro): Indica el método de llamar al objeto actual

Cuando las variables locales y las variables miembro estén en conflicto, úselas this.para distinguirlas.

Acerca de las   similitudes y diferencias de Java entre esta y las súper palabras clave, se pueden resumir brevemente en los siguientes elementos.

  1. Cuando el nombre de la variable o método en la subclase y la clase principal es el mismo, use la palabra clave super para acceder. Se puede entender que super es un puntero a un objeto de su propio padre. Llame al método de construcción de la clase principal en la subclase.
  2. este es un objeto en sí mismo, que representa el objeto en sí, lo que puede entenderse como un puntero al objeto en sí. Llame a otros métodos de la misma clase.
  3. Esto y super no pueden aparecer en el mismo método de construcción al mismo tiempo, porque esto inevitablemente llamará a otros métodos de construcción, y definitivamente habrá super declaraciones en otros métodos de construcción, por lo que si hay las mismas declaraciones en el mismo método de construcción, se perderá El significado de la declaración, el compilador no pasará.
  4. Tanto this () como super () se refieren a objetos, por lo que ninguno se puede utilizar en un entorno estático, incluidas las variables estáticas, los métodos estáticos y los bloques de instrucciones estáticas.
  5. Esencialmente, este es un puntero al objeto en sí, pero super es una palabra clave de Java.

El atributo de nombre de tipo público y el atributo de nombre de tipo privado se definen respectivamente en la clase Animal y la clase Gato, y la clase Gato hereda la clase Animal. Luego, podemos usar la palabra clave super en la clase Cat para acceder al atributo de nombre en la clase padre Animal, y la palabra clave this para acceder al atributo de nombre en esta clase, como se muestra en el siguiente código:

// 父类Animal的定义
public class Animal {
    public String name; // 动物名字
}

//子类Cat的定义
public class Cat extends Animal {
    private String name; // 名字

    public Cat(String aname, String dname) {
        super.name = aname; // 通过super关键字来访问父类中的name属性
        this.name = dname; // 通过this关键字来访问本类中的name属性
    }

    public String toString() {
        return "我是" + super.name + ",我的名字叫" + this.name;
    }

    public static void main(String[] args) {
        Animal cat = new Cat("动物", "喵星人");
        System.out.println(cat);
    }
}
我是动物,我的名字叫喵星人

Supongo que te gusta

Origin blog.csdn.net/qq_43629083/article/details/108673552
Recomendado
Clasificación