Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
4
respuestas

uso de super

cuando doy this.salario en la clase de gerente el codigo no compila, sin embargo si hago this.getSalario y super.getSalario los dos funcionan cual es la diferencia?

4 respuestas

Hola!

super sirve para poder acceder a un atributo o método de una "clase padre", this se utiliza para especificar que el atributo o método que se intenta llamar corresponde al de la subclase, me parece que tu atributo salario se encuentra definido en la clase padre, por lo que no es posible acceder a él mediante this

Saludos!

Es interesante, porque antes de que terminara la explicación yo probé con return getSalario() y compiló bien también. Si entiendo bien: super accede a atributos o métodos de la clase superior, forzando los privados. Si accedemos a uno público da lo mismo usar o no super. Además creo que el this se usa para especificar atributos, en un método único de la clase estaría de más ponerlo también.

Si tuvieramos que aaceder directamente al salario sin pasar por ningún método, si se usan super y this.

Es mi interpretación, pido la corrección de los instructores o compañeros más preparados en el tema.

Yo tengo la misma duda, me funciona perfectamente usar el "super.getSalario" y usar solo "getSalario". "getSalario" es un método publico creo que por eso funciona con o sin el uso de super, pero intente poner "getSalario" private y de igual modo no funciona el "super.getSalario", justamente me dice que el método no es visible. No me ha quedado claro el uso de super, porque también intento acceder directamente a salario usando super y me indica que no es posible porque salario es private. Por fa si nos pueden aclarar. Muchas gracias.

¡Hola muchachos!

Bueno, vayamos aclarando varias cosas con ejemplos para despejar dudas, pero vamos de a poco.

Modificadores de acceso

  • public: Los métodos y atributos con este modificador serán accesibles para cualquier clase dentro del proyecto.
  • private: Los métodos y atributos con este modificador serán accesibles solo para la clase donde fueron definidos.
  • protected: Los métodos y atributos con este modificador serán accesibles solo para la clase donde fueron definidos y sus clases hijas.
  • default: Modificador por defecto. El acceso se aplica solo para elementos del mismo package.

Entonces, entiendiendo cómo operan los modificadores de acceso, veamos qué es this

  • this es una palabra reservada en Java.
  • this nos ayuda a referenciar explícitamente a miembros de una misma instancia.

Ahora, vamos a ver un ejemplo práctico de todo esto:

Tenemos una clase Animal, como se muestra a continuación:

public class Animal {

    private String nombre;
    private int edad;

    public Animal(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public int getEdad() {
        return edad;
    }

    public void setEdad(int edad) {
        this.edad = edad;
    }
}

Y tenemos una clase hija, llamada Gato, a continuación:

public class Gato extends Animal{

    private String raza;

    public Gato(String nombre, int edad, String raza) {
        super(nombre, edad);
        this.raza = raza;
    }

    public String getRaza() {
        return raza;
    }

    public void setRaza(String raza) {
        this.raza = raza;
    }

    public void mostrarEdad(){
        System.out.println(this.getEdad());
    }

    public void mostrarNombre(){
        System.out.println(super.getNombre());
    }

    public void mostrarRaza(){
        System.out.println(this.getRaza());
    }
}

Bien, vamos revisando poco a poco.

  • La clase Animal es padre de la clase Gato.

  • Los atributos de la clase Animal están encapsulados. Esto quiere decir que como son privados, no tendremos acceso a ellos desde la clase Gato.

  • Los métodos de la clase Animal son públicos, por lo que tendremos acceso a ellos desde nuestras clases hijas, como Gato.

  • La clase Gato, en el constructor, está utilizando la palabra reservada super para acceder al constructor de la clase padre Animal de modo que a través de él, heredará sus atributos y métodos. Entonces los métodos públicos de la clase Animal podremos utilizarlos en la clase Gato porque fueron heredados. Los atributos privados de la clase Animal también fueron heredados a la clase Gato pero no tendremos acceso a ellos porque son privados.

  • En la clase Gato existen 3 métodos interesantes, mostrarEdad(), mostrarNombre y mostrarRaza.

  • El método mostrarEdad() hace uso de la palabra reservada this para especificar explícitamente que queremos hacer referencia a la edad del Gato.

  • Espera espera... No me confundas. Dijiste que la palabra reservada this hacía referencia a los miembros de una instancia, es decir, a los elementos de la clase Gato, pero ahí se está haciendo referencia a un elemento de la clase padre, Animal, que es getEdad.

Pues, esto sucede porque cuando Gato, en el constructor, utilizó la palabra reservada super, realmente se trajo a esta instancia sus elementos, así que por consiguiente ahora getEdad es un método propio de esta instancia también y puede ser accedido a través de la palabra reservada this.

  • Sigamos, el método mostrarNombre() está haciendo uso de la palabra reservada super para especificar explícitamente que quiere referencia no al miembro de esta instancia sino que al miembro directo de la clase padre, getNombre().

  • Espera espera, ok. Déjame ver si lo entiendo bien. Entonces this.getNombre y super.getNombre ¿Son elementos diferentes?

No, el elemento es exactamente el mismo en una instancia, pero su referencia es distinta. Por eso entregan el mismo resultado. Verás, ambos atributos están alojados en el mismo espacio de memora, pero son accedidos desde distintos puntos del código, uno desde la clase Animal y el otro desde la clase Gato.

  • Finalmente el método mostrarRaza() solo funciona con this y no con super, porque para este caso getRaza es un método que solo existe en la clase hija Gato, no es un método heredado.

Y así es como operan las palabras reservadas:

  • this
  • super