La diferencia entre esta y las súper palabras clave


1. La diferencia entre esta y super palabras clave 1. ¿Por qué utilizar super?
La clase secundaria quiere acceder al método o variable de la clase principal.
La subclase llama al método de construcción de la clase principal.

esto :
esta palabra clave solo se puede usar en el cuerpo del método de un método y representa una referencia al "objeto que llama al método". Cuando se crea un objeto, la máquina virtual Java (JVM) asignará un puntero al objeto que se refiere a sí mismo, y el nombre de este puntero es este. Por lo tanto, esto solo se puede usar en métodos no estáticos en clases, y esto no debe aparecer en métodos estáticos y bloques de código estáticos.

super : la
palabra clave super es similar a esta: hace visibles las variables miembro y los métodos miembros de la clase padre oculta, o se utiliza para hacer referencia a la variable miembro y los métodos miembros de la clase padre oculta.

Dos, escenarios de uso:
1. Use super y this para llamar a las variables y métodos miembros

A veces, encontrará variables miembro o métodos en una subclase con el mismo nombre que una variable miembro o método en la clase principal. Debido a que la variable miembro o el nombre del método de la subclase tiene una prioridad alta, la variable miembro o el método del mismo nombre en la subclase oculta la variable miembro o el método de la clase principal, por lo que se necesita super. No puedo leer el código, trato de entenderlo yo mismo

class Country{
    
    
    String name;
    void value() {
    
    
        name = "china";
    }
}
public class City extends Country{
    
    
    String name;
    void value() {
    
    
        name = "Xian";
        super.value();
        //不调用此方法时,super.name返回的是父类的成员变量的值null
        System.out.println(name);
        System.out.println(super.name);
    }
    public static void main(String[] args) {
    
    
        City c=new City();
        c.value();
    }
}
//运行结果:
//Xian
//china

Para hacer referencia al nombre de la variable miembro y al valor del método () de la clase principal en la subclase, en el código se utilizan super, super.name y super.value (). Si no se llama a super.value (), super.name devuelve el valor predeterminado de la variable miembro de la clase principal a nulo. Cuando se llama a este método, el método super.value () asigna el nombre de la variable miembro a China y luego usa super.name para llamar al valor de la variable miembro de la clase principal. Además, debe tenerse en cuenta que super.name llama al valor de la variable miembro de la clase padre .

class Country{
    
    
    String name="shanxi";
    String value(String name) {
    
    
        name = "china";
        return name;
    }
}

public class City extends Country{
    
    
    String name;
    String value(String name) {
    
    
        name = "Xian";
        super.value("失败");
        //不调用此方法时,super.name返回的是父类的成员变量的值null
        System.out.println(name);
        System.out.println(super.name);
        return name;
    }
    public static void main(String[] args) {
    
    
        City c=new City();
        c.value("成功");
    }
//Xian
//shanxi

En este momento, el valor devuelto por super.name es el valor shanxi de la variable miembro de la clase principal, y el método super.value () en este momento no funciona.

2. Usa super y this para llamar al constructor


class Person{
    
    
    public static void prt(String s){
    
    
        System.out.println(s);
    }
    Person(){
    
    
        prt("A Person");
    }
    Person(String name){
    
    
        prt("A Person name is:"+name);
    }
}


public class Chinese extends Person{
    
    
    Chinese(){
    
    
        super();//调用父类的无参构造方法(1)
        prt("A chinese");//(4)

    }
    Chinese(String name){
    
    
        super(name);//调用父类具有相同形参的构造方法(2)
        prt("his name is:"+name);
    }
    Chinese(String name,int age){
    
    
        this(name);//调用当前子类中具有相同形参的构造方法(3)
        prt("his age is:"+age);

    }

    public static void main(String[] args) {
    
    
        Chinese cn=new Chinese();
        cn=new Chinese("zhiwen");
        cn=new Chinese("zhiwen",38);

    }

//A Person
//A chinese
//A Person name is:zhiwen
//his name is:zhiwen
//A Person name is:zhiwen
//his name is:zhiwen
//his age is:38

En este código, this y super ya no están conectados a un método o miembro con "." Como antes, sino que van seguidos directamente por los parámetros apropiados, por lo que su significado también tiene un nuevo cambio. Agregar un parámetro después de super indica el método de construcción utilizado para llamar al parámetro del mismo formulario en la clase principal , como (1) y (2). Agregar un parámetro después de esto significa que se llama al constructor de la clase actual con los mismos parámetros formales , como en (3). Por supuesto, en los diversos métodos de construcción sobrecargados del chino, el uso general de this y super aún se puede usar, como (4), puede reemplazarlo con "this.prt" (porque hereda el prt en la clase padre Method) o use "super.prt" (porque es un método en la clase principal y se puede acceder a él por subclases), aún puede ejecutarse, pero esto parece un poco superfluo.

3. Si desea hacer referencia a super en el método de construcción de la subclase, debe poner super en la primera línea del método.

class Base{
    
    
    Base(){
    
    
        System.out.println("Base");
    }
}
public class Checket extends Base{
    
    
    Checket(){
    
    
        super();//调用父类的构造方法,一定要放在这个方法的首个语句
        System.out.println("Checket");
    }

    public static void main(String[] args) {
    
    
        Checket c=new Checket();

    }
//Base
// Checket
}

Si desea usar super para llamar al método de la estructura de la clase principal, pero no se coloca en la primera línea, entonces la declaración antes de super debe ser una declaración de que desea completar ciertos comportamientos , pero use super para llamar a la estructura del método de la clase padre, entonces todas las modificaciones realizadas antes vuelven al anterior, es decir, se ha convertido de nuevo en el método de construcción de la clase padre.

Resumen :
1. No puede aparecer en el mismo constructor al mismo tiempo para llamar a otros constructores
super (parámetro): llamar a un cierto constructor en la clase padre, debería ser la primera instrucción en el constructor.
this (parámetro): invoca otra forma de método de construcción en esta clase, que debería ser la primera instrucción en el método de construcción.
this () 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 debe haber super declaraciones en otros métodos de construcción, y la misma declaración en el mismo método de construcción será perdido Si se cambia el significado de la declaración, la compilación no pasará.
2. La diferencia entre llamar al constructor:
super: se refiere a los miembros de la clase padre directo del objeto actual, que se utiliza para acceder a los métodos o variables de miembros ocultos en la clase padre directo. Se utiliza cuando la clase padre y la subclase tienen los mismos miembros, como super. Nombre de variable o super. Miembro nombre de método (parámetro real).
esto: representa el nombre del objeto actual, donde es probable que ocurra ambigüedad en el programa, esto debe usarse para indicar el objeto actual. Si la forma del método participa en la variable miembro de la clase con el mismo nombre, entonces esto es necesario para indicar el nombre de la variable miembro.
3. Los requisitos previos son diferentes: la
palabra clave super debe tener herencia antes de poder usarse, la
palabra clave this puede usarse sin herencia.
4. Otros: la
llamada a super () debe escribirse en la primera línea del método de construcción de la subclase, de lo contrario la compilación no pasará. La primera declaración del método de construcción de cada subclase es una llamada implícita a super (). Si
no existe tal método de construcciónen la clase principal,se informaráunerror durante la compilación.

Tanto this como super se refieren a objetos, por lo que ninguno se puede utilizar en métodos estáticos.

Supongo que te gusta

Origin blog.csdn.net/m0_46551861/article/details/112261242
Recomendado
Clasificación