Super palabra clave de Java (con ejemplos)

En este tutorial, aprenderemos sobre la palabra clave super en Java con la ayuda de ejemplos.

La superpalabra clave en Java se usa en subclases para acceder a miembros de superclase (atributos, constructores y métodos).

Antes de aprender sobre la superpalabra clave, asegúrese de conocer la herencia de Java.

Usos de super palabra clave

  1. Para llamar a métodos de la superclase que se reemplaza en la subclase.
  2. Para acceder a los atributos (campos) de la superclase si tanto la superclase como la subclase tienen atributos con el mismo nombre.
  3. Para llamar explícitamente a la superclase no-arg (por defecto) o al constructor parametrizado desde el constructor de la subclase.

Entendamos cada uno de estos usos.

1. Accede a los métodos anulados de la superclase

Si los métodos con el mismo nombre se definen tanto en la superclase como en la subclase, el método de la subclase anula el método de la superclase. A esto se le llama anulación de método.

Ejemplo 1: anulación de método

 class Animal ( // overridden method public void display()( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // overriding method @Override public void display()( System.out.println("I am a dog"); ) public void printMessage()( display(); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printMessage(); ) ) 

Salida

 yo soy un perro 

En este ejemplo, al hacer un objeto dog1 de la clase Dog, podemos llamar a su método printMessage () que luego ejecuta la display()declaración.

Dado que display()se define en ambas clases, el método de la subclase Perro anula el método de la superclase Animal. Por tanto, el display()de la subclase se llama.

¿Qué sucede si se debe llamar al método anulado de la superclase?

Usamos super.display()si se display()necesita llamar al método anulado de la superclase Animal.

Ejemplo 2: super para llamar al método de superclase

 class Animal ( // overridden method public void display()( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // overriding method @Override public void display()( System.out.println("I am a dog"); ) public void printMessage()( // this calls overriding method display(); // this calls overridden method super.display(); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printMessage(); ) ) 

Salida

 Soy un perro soy un animal 

Aquí, cómo funciona el programa anterior.

2. Atributos de acceso de la superclase

La superclase y la subclase pueden tener atributos con el mismo nombre. Usamos la superpalabra clave para acceder al atributo de la superclase.

Ejemplo 3: atributo de superclase de acceso

 class Animal ( protected String; ) class Dog extends Animal ( public String; public void printType() ( System.out.println("I am a " + type); System.out.println("I am an " + super.type); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printType(); ) ) 

Salida :

 Soy un mamifero soy un animal 

En este ejemplo, hemos definido el mismo tipo de campo de instancia tanto en la superclase Animal como en la subclase Perro.

Luego creamos un objeto dog1 de la clase Dog. Luego, printType()se llama al método usando este objeto.

Dentro de la printType()función,

  • tipo se refiere al atributo de la subclase Perro.
  • super.type se refiere al atributo de la superclase Animal.

Por lo tanto, System.out.println("I am a " + type);imprime Soy un mamífero. Y System.out.println("I am an " + super.type);grabados soy un animal.

3. Uso de super () para acceder al constructor de superclase

Como sabemos, cuando se crea un objeto de una clase, se llama automáticamente a su constructor predeterminado.

Para llamar explícitamente al constructor de superclase desde el constructor de subclase, usamos super(). Es una forma especial de la superpalabra clave.

super() solo se puede usar dentro del constructor de subclase y debe ser la primera instrucción.

Ejemplo 4: uso de super ()

 class Animal ( // default or no-arg constructor of class Animal Animal() ( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // default or no-arg constructor of class Dog Dog() ( // calling default constructor of the superclass super(); System.out.println("I am a dog"); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); ) ) 

Salida

 Soy un animal soy un perro 

Aquí, cuando se crea un objeto dog1 de la clase Dog, llama automáticamente al constructor predeterminado o sin argumentos de esa clase.

Dentro del constructor de la subclase, la super()declaración llama al constructor de la superclase y ejecuta las declaraciones dentro de él. Por lo tanto, obtenemos la salida Soy un animal.

El flujo del programa luego regresa al constructor de la subclase y ejecuta las declaraciones restantes. Así, soy un perro se imprimirá.

Sin embargo, su uso super()no es obligatorio. Incluso si super()no se usa en el constructor de subclase, el compilador llama implícitamente al constructor predeterminado de la superclase.

Entonces, ¿por qué usar código redundante si el compilador invoca automáticamente super ()?

Es necesario si el constructor parametrizado (un constructor que toma argumentos) de la superclase debe ser llamado desde el constructor de subclase.

El parametrizado super()debe ser siempre la primera sentencia en el cuerpo del constructor de la subclase, de lo contrario, obtenemos un error de compilación.

Ejemplo 5: Llamar al constructor parametrizado usando super ()

 class Animal ( // default or no-arg constructor Animal() ( System.out.println("I am an animal"); ) // parameterized constructor Animal(String type) ( System.out.println("Type: "+type); ) ) class Dog extends Animal ( // default constructor Dog() ( // calling parameterized constructor of the superclass super("Animal"); System.out.println("I am a dog"); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); ) ) 

Salida

 Tipo: Animal soy un perro 

El compilador puede llamar automáticamente al constructor no-arg. Sin embargo, no puede llamar a constructores parametrizados.

Si se debe llamar a un constructor parametrizado, necesitamos definirlo explícitamente en el constructor de subclase.

Tenga en cuenta que en el ejemplo anterior, llamamos explícitamente al constructor parametrizado super("Animal"). El compilador no llama al constructor predeterminado de la superclase en este caso.

Articulos interesantes...