JavaRush /Blog Java /Random-ES /Diferencia entre esto y súper palabras clave en Java
grishin
Nivel 27
Харьков

Diferencia entre esto y súper palabras clave en Java

Publicado en el grupo Random-ES
thisy superson 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 thisy super¿Es posible asignar un significado diferente a una palabra clave thisen Java? y cuál es la diferencia entre palabras clave thisy superen Java. ¿No lo sé? Bueno, no voy a dar la respuesta aquí; se puede encontrar al final del artículo. Diferencia entre estas y súper palabras clave en Java - 1Entonces, como dije al principio, la principal diferencia entre thisy superen Java es que thisla instancia actual de una clase representa, mientras que superla instancia actual de la clase principal representa. Aquí hay un ejemplo del uso de variables thisy superprobablemente 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 thisy 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 thisuso super. También en thisJava superse utilizan para acceder a variables de una instancia de clase y su padre. De hecho, se puede acceder a ellas sin los prefijos supery 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 thisun 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 supery thisy veremos algunos ejemplos de su uso.

En qué se parecen esto y super

Antes de analizar las diferencias entre las palabras clave thisy super, veamos algunas de sus similitudes:
  1. Tanto this, como superson 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. thisEsto 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.

  2. Ambos this, y superse 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(""); // вызов конструктора с одним аргументом класса B
        System.out.println("Конструктор без аргументов класса B");
    }

   B(String args){
        super(""); // вызов конструктора с одним аргументом класса A
        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
  1. Dentro del constructor this, y superdebe 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 supery thisentendemos 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. thispara 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 thisysuper
  1. una variable thisse refiere a la instancia actual de la clase en la que se usa, mientras que se superrefiere a la instancia actual de la clase principal.

  2. 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 thisy superen 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 thisno 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í .
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION