this

this es un objeto de sí mismo, representa al objeto en sí, puede entenderse como:un puntero que apunta al objeto en sí.。

El uso de this en Java puede dividirse aproximadamente en 3 tipos:

1. Referencia directa ordinaria

Esto no hace falta explicarlo, this equivale a apuntar al objeto actual en sí.

2. Cuando los parámetros formales y los nombres de los miembros coinciden, se usa this para distinguirlos:

Ejemplo

class Person { private int age = 10; public Person(){ System.out.println("Inicializar la edad:"+age); } public int GetAge(int age){ this.age = age; return this.age; } } public class test1 { public static void main(String[] args) { Person Harry = new Person(); System.out.println("Harry's age is "+Harry.GetAge(12)); } }

Resultado de la ejecución:

初始化年龄:10
Harry's age is 12

Se puede ver que aquí age es el parámetro formal del método miembro GetAge, y this.age es la variable miembro de la clase Person.

3. Referenciar el constructor

Esto se explica junto con super, ver más abajo.


super

super puede entenderse como un puntero que apunta al objeto de su superclase (clase padre), y esta superclase se refiere a la clase padre más cercana a sí misma.

super también tiene tres usos:

1. Referencia directa ordinaria

Similar a this, super equivale a apuntar a la clase padre del objeto actual, de modo que se puede usarsuper.xxxpara referenciar a los miembros de la clase padre.

2. Cuando las variables miembro o métodos de la subclase tienen el mismo nombre que los de la clase padre

Ejemplo

class Country { String name; void value() { name = "China"; } } class City extends Country { String name; void value() { name = "Shanghai"; super.value(); //Llamar al método de la clase padre System.out.println(name); System.out.println(super.name); } public static void main(String[] args) { City c=new City(); c.value(); } }

Resultado de la ejecución:

Shanghai
China

Se puede ver que aquí se llama tanto al método de la clase padre como a la variable de la clase padre. Si no se llama al método value() de la clase padre y solo se llama a la variable name de la clase padre, el valor de name de la clase padre será el valor predeterminado null.

3. Referenciar el constructor

  • super(parámetros): llama a uno de los constructores de la clase padre (debe ser la primera declaración del constructor).
  • this(parámetros): llama a otra forma de constructor de esta clase (debe ser la primera declaración del constructor).

Ejemplo

class Person { public static void prt(String s) { System.out.println(s); } Person() { prt("Clase padre · constructor sin parámetros:"+"A Person."); }//Constructor (1) Person(String name) { prt("Clase padre · constructor con un parámetro:"+"A person's name is " + name); }//Constructor (2) } public class Chinese extends Person { Chinese() { super(); //Llamar al constructor de la clase padre (1) prt("Subclase · llamar al "constructor sin parámetros" de la clase padre:"+"A chinese coder."); } Chinese(String name) { super(name);//Llamar al constructor de la clase padre con los mismos parámetros formales (2) prt("Subclase · llamar al "constructor con un parámetro" de la clase padre:"+"his name is " + name); } Chinese(String name, int age) { this(name);//Llamar al constructor con los mismos parámetros formales (3) prt("Subclase: llamar al constructor de la subclase con los mismos parámetros formales: his age is" + age); } public static void main(String[] args) { Chinese cn = new Chinese(); cn = new Chinese("codersai"); cn = new Chinese("codersai", 18); } }

Resultado de la ejecución:

父类·无参数构造方法: A Person.
子类·调用父类”无参数构造方法“: A chinese coder.
父类·含一个参数的构造方法: A person's name is codersai
子类·调用父类”含一个参数的构造方法“: his name is codersai
父类·含一个参数的构造方法: A person's name is codersai
子类·调用父类”含一个参数的构造方法“: his name is codersai
子类:调用子类具有相同形参的构造方法:his age is 18

En este ejemplo se puede ver que se pueden usar super y this para llamar respectivamente al constructor de la clase padre y a otras formas de constructor de esta clase.

En el ejemplo, el tercer constructor de la clase Chinese llama al segundo constructor de esta clase, y el segundo constructor llama al de la clase padre. Por lo tanto, primero se debe llamar al constructor de la clase padre, luego al segundo de esta clase y, finalmente, se sobrescribe el tercer constructor.


Similitudes y diferencias entre super y this

  • super(parámetros): llama a uno de los constructores de la clase base (debe ser la primera declaración del constructor)
  • this(parámetros): llama a otra forma de constructor de esta clase (debe ser la primera declaración del constructor)
  • super: hace referencia a los miembros de la clase padre directa del objeto actual (se usa para acceder a los datos o funciones de miembros de la clase padre directa que están ocultos, cuando la clase base y la clase derivada tienen definiciones de miembros iguales, como: super.nombreVariable super.nombreFunciónMiembro(argumentos) this: representa el nombre del objeto actual (en lugares del programa donde es fácil que haya ambigüedad, se debe usar this para indicar el objeto actual; si los parámetros formales de una función tienen el mismo nombre que los datos miembro de la clase, entonces se necesita usar this para indicar el nombre de la variable miembro)
  • La llamada a super() debe escribirse en la primera línea del constructor de la subclase, de lo contrario no compilará. La primera declaración de cada constructor de subclase llama implícitamente a super(); si la clase padre no tiene esta forma de constructor, se producirá un error en la compilación.
  • super() y this() son similares; la diferencia es que super() llama al constructor de la clase padre desde la subclase, mientras que this() llama a otros métodos dentro de la misma clase.
  • Tanto super() como this() deben colocarse en la primera línea del constructor.
  • Aunque se puede usar this para llamar a un constructor, no se pueden llamar a dos.
  • this y super no pueden aparecer al mismo tiempo en un constructor, porque this inevitablemente llamará a otro constructor, y ese otro constructor también tendrá una declaración super. Por lo tanto, si hay la misma declaración en el mismo constructor, pierde su significado y el compilador no lo aceptará.
  • Tanto this() como super() hacen referencia a objetos, por lo que no pueden usarse en entornos estáticos. Esto incluye: variables static, métodos static y bloques de declaraciones static.
  • En esencia, this es un puntero que apunta a este objeto, mientras que super es una palabra clave de Java.

Enlace original: https://www.cnblogs.com/hasse/p/5023392.html