this
y
super
son dos palabras clave especiales en Java que representan la instancia actual de una clase y su superclase, respectivamente. Los programadores de Java a menudo confunden estas palabras y muestran poco conocimiento de sus propiedades especiales, sobre las cuales a menudo se pregunta en las entrevistas de Java Core. Por ejemplo, un par de preguntas que me vienen a la mente inmediatamente son sobre
this
y
super
¿Es posible asignar un significado diferente a una palabra clave
this
en Java? y cuál es la diferencia entre palabras clave
this
y
super
en Java. ¿No lo sé? Bueno, no voy a dar la respuesta aquí; se puede encontrar al final del artículo.
Entonces, como dije al principio, la principal diferencia entre
this
y
super
en Java es que
this
la instancia actual de una clase representa, mientras que
super
la instancia actual de la clase principal representa. Aquí hay un ejemplo del uso de variables
this
y
super
probablemente ya haya visto ejemplos de cómo llamar a los constructores de uno desde otro, los llamados. llamar a constructores en una cadena, esto es posible mediante el uso de palabras clave
this
y
super
. Dentro de una clase, para llamar a su constructor sin argumentos, se usa
this()
, mientras que
super()
se usa para llamar al constructor sin argumentos, o como también se le llama, el constructor predeterminado de la clase padre. Por cierto, de esta manera puedes llamar no solo a un constructor sin argumentos, sino también a cualquier otro constructor pasándole los parámetros apropiados. Pronto veremos un ejemplo de este
this
uso
super
. También en
this
Java
super
se utilizan para acceder a variables de una instancia de clase y su padre. De hecho, se puede acceder a ellas sin los prefijos
super
y
this
, pero sólo si en el bloque actual dichas variables no se superponen con otras variables, es decir si no contiene variables locales con los mismos nombres, de lo contrario tendrás que usar nombres con prefijos, pero esto no importa, porque De esta forma son aún más legibles. Un ejemplo clásico de este enfoque es utilizar
this
un constructor interno que toma un parámetro con el mismo nombre que la variable de instancia. Más adelante en el artículo descubriremos qué otras diferencias existen entre
super
y
this
y veremos algunos ejemplos de su uso.
En qué se parecen esto y super
Antes de analizar las diferencias entre las palabras clave
this
y
super
, veamos algunas de sus similitudes:
- Tanto
this
, como super
son variables no estáticas, por lo que no se pueden usar en un contexto estático, lo que significa que no se pueden usar en el método principal. this
Esto dará como resultado un error en tiempo de compilación " no se puede hacer referencia a una variable no estática desde un contexto estático". Lo mismo sucede si usas la palabra clave en el método principal super
.
- Ambos
this
, y super
se pueden usar dentro de los constructores para llamar a otros constructores en una cadena, por ejemplo, this
() y super
() llaman al constructor sin argumentos de las clases heredera y principal, respectivamente.
En el siguiente ejemplo, primero pasamos una llamada de un constructor sin argumentos de la clase B a un constructor de la misma clase B que toma un único parámetro de tipo
String
, que a su vez
super("")
llama al constructor de un argumento de la superclase.
class A{
A(){
System.out.println("Конструктор без аргументов класса A");
}
A(String args){
System.out.println("Конструктор с одним аргументом класса A");
}
}
class B extends A{
B(){
this("");
System.out.println("Конструктор без аргументов класса B");
}
B(String args){
super("");
System.out.println("Конструктор с одним аргументом класса B");
}
}
public class Test {
public static void main(String args[]) {
B b = new B();
}
}
Salida: Constructor de un argumento de clase A Constructor de un argumento de clase B Constructor sin argumentos de clase B
- Dentro del constructor
this
, y super
debe aparecer encima de todas las demás expresiones, al principio; de lo contrario, el compilador emitirá un mensaje de error. De lo cual se deduce que un constructor no puede contener tanto this()
, como super()
.
Diferencias entre super y esto
Ahora sabemos cómo utilizar las palabras clave
super
y
this
entendemos para qué sirven. Pero hay otra opción para usar estas palabras clave que no mencioné: en las clases internas, donde con su ayuda es muy conveniente referirse a una clase externa usando la forma de notación externa.
this
para su instancia actual y externa.
super
- para sus padres. No olvide reemplazar Outer con el nombre de la clase externa. Ahora enumeremos brevemente las principales diferencias entre palabras clave
this
y
super
- una variable
this
se refiere a la instancia actual de la clase en la que se usa, mientras que se super
refiere a la instancia actual de la clase principal.
- Cada constructor, en ausencia de llamadas explícitas a otros constructores, llama implícitamente
super()
al constructor sin argumentos de su clase principal, pero siempre tiene la opción de llamar explícitamente a cualquier otro constructor con this()
, o super()
.
Probablemente esto sea todo lo que se puede decir sobre las diferencias entre las palabras clave
this
y
super
en Java y cómo se utilizan en los programas. Como hemos visto, su objetivo principal es llamar a un constructor desde otro y hacer referencia a variables de instancia declaradas en la clase actual y su clase padre. No olvide que estas no son exactamente variables ordinarias, y ahora, la respuesta a mi pregunta que hice en el primer párrafo. No, a una variable
this
no se le puede asignar un nuevo valor porque está declarada final. Puede intentar hacer esto en el IDE; recibirá un error de compilación "no puede asignar un nuevo valor a una variable
this
; se declara final".
Artículo original aquí .
GO TO FULL VERSION