Java súper
Súper Java
En este tutorial, aprenderemos sobre la palabra clave super en Java con la ayuda de ejemplos.
El super
La palabra clave en Java se usa en las subclases para acceder a los miembros de la superclase (atributos, constructores y métodos).
Antes de aprender sobre el super
palabra clave, asegúrese de conocer la herencia de Java.
Usos de la palabra clave super
- Para llamar a métodos de la superclase anulada en la subclase.
- Para acceder a los atributos (campos) de la superclase si tanto la superclase como la subclase tienen atributos con el mismo nombre.
- Para llamar explícitamente a la superclase sin argumentos (predeterminado) o al constructor parametrizado desde el constructor de la subclase.
Comprendamos cada uno de estos usos.
1. Acceder a métodos anulados de la superclase
Si se definen métodos con el mismo nombre tanto en la superclase como en la subclase, el método de la subclase anula el método de la superclase. Esto se denomina anulación de métodos.
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
I am a dog
En este ejemplo, al hacer un objeto dog1 de Perro class, podemos llamar a su método printMessage() que luego ejecuta el display()
declaración.
Desde display()
está definido en ambas clases, el método de la subclase Dog anula el método de la superclase Animal . Por lo 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 el método anulado display()
de la superclase Animal necesita ser llamado.
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
I am a dog I am an 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 el super
palabra clave para acceder al atributo de la superclase.
Ejemplo 3:Acceso al atributo de superclase
class Animal {
protected String type="animal";
}
class Dog extends Animal {
public String type="mammal";
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 :
I am a mammal I am an animal
En este ejemplo, hemos definido el mismo campo de instancia tipo tanto en la superclase Animal y la subclase Perro .
Luego creamos un objeto dog1 del Perro clase. Luego, el printType()
se llama al método usando este objeto.
Dentro del printType()
función,
- tipo se refiere al atributo de la subclase Perro .
- super.tipo 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);
imprime
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 la superclase desde el constructor de la subclase, usamos super()
. Es una forma especial del super
palabra clave.
super()
solo se puede usar dentro del constructor de la 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
I am an animal I am a dog
Aquí, cuando un objeto dog1 de Perro se crea la clase, llama automáticamente al constructor predeterminado o sin argumentos de esa clase.
Dentro del constructor de la subclase, el super()
instrucción llama al constructor de la superclase y ejecuta las instrucciones dentro de ella. Por lo tanto, obtenemos la salida
Soy un animal
.
Luego, el flujo del programa regresa al constructor de la subclase y ejecuta las instrucciones restantes. Así, soy un perro se imprimirá.
Sin embargo, usando super()
no es obligatorio. Incluso si super()
no se usa en el constructor de la 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 llamarse desde el constructor de la subclase.
El super()
parametrizado siempre debe ser la primera declaración 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
Type: Animal I am a dog
El compilador puede llamar automáticamente al constructor sin argumentos. Sin embargo, no puede llamar a constructores parametrizados.
Si se debe llamar a un constructor parametrizado, debemos definirlo explícitamente en el constructor de la 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.
Java