English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En este tutorial, aprenderemos sobre la palabra clave super en Java mediante ejemplos.
La palabra clave super en Java se utiliza en la subclase para acceder a los miembros de la clase padre (propiedades, constructores y métodos).
Asegúrese de que ya haya entendidoJava 继承.
Llamar al método sobrescrito del padre en la subclase.
Si la superclase (superclass) y la subclase (subclass) tienen propiedades con el mismo nombre, se accede a las propiedades de la superclase (campos).
Llamar explícitamente desde el constructor de la subclase al constructor sin parámetros o con parámetros de la superclase.
Vamos a entender todos estos usos.
Si se definen métodos con el mismo nombre tanto en la superclase como en la subclase, el método de la subclase cubre el método de la superclase. Esto se llama: sobrescritura de métodos.
class Animal { //método public void display(){ System.out.println("Soy un animal"); } } class Dog extends Animal { //método sobrescrito @Override public void display(){ System.out.println("Soy un perro"); } public void printMessage(){ display(); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); perro1.printMessage(); } }
输出结果
Soy un perro
En este ejemplo, se crea un objeto de la clase Dog llamado dog1podemos llamar a su método printMessage(), y luego ese método ejecuta la sentencia display().
Dado que display() se define en ambas clases, el método de la subclase Dog sobrescribe el método de la superclase Animal. Por lo tanto, se llama al método display() de la subclase.
¿Qué hacer si es necesario llamar al método sobrescrito de la superclase?
Si es necesario llamar al método sobrecargado display() de la superclase Animal, utilice super.display().
class Animal { //método public void display(){ System.out.println("Soy un animal"); } } class Dog extends Animal { //método sobrescrito @Override public void display(){ System.out.println("Soy un perro"); } public void printMessage(){ //Esto llama al método sobrescrito display(); // Esto llama al método de la clase padre super.display(); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); perro1.printMessage(); } }
输出结果
Soy un perro Soy un animal
Aquí está cómo funciona el programa anterior.
La superclase y la subclase pueden tener propiedades con el mismo nombre. Utilizamos la palabra clave super para acceder a las propiedades de la superclase.
class Animal { protected String type="Animal"; } class Dog extends Animal { public String type="Mamífero"; public void printType() { System.out.println("Soy un " + "" + type); System.out.println("Soy un " + "" + super.type); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); perro1.printType(); } }
Imprimir:
Soy un mamífero Soy un animal
En este caso, definimos el mismo tipo de campo de instancia en la superclase Animal y la subclase Dog.
Luego creamos el objeto dog de la clase Dog1. Luego, se llama al método printType() utilizando este objeto.
Dentro de la función printType(),
type - se refiere a las propiedades de la subclase Dog.
super.type - se refiere a las propiedades de la superclase Animal.
Por lo tanto, System.out.println("Soy " + type);Imprimir "Soy un mamífero"y, System.out.println("Soy un " + super.tipo); imprimirImprimir "Soy un animal".
Es conocido que al crear un objeto de una clase, se llama automáticamente su constructor por defecto.
Para llamar explícitamente al constructor de la superclase desde el constructor de la subclase, utilizamos super(). Esta es una forma especial del keyword super.
Nota: super() solo se puede usar en el constructor de la subclase y debe ser la primera instrucción.
class Animal { //Constructor por defecto o sin parámetros de la clase Animal Animal() { System.out.println("Soy un animal"); } } class Dog extends Animal { // Constructor por defecto o sin parámetros de la clase Dog Dog() { //llama al constructor por defecto de la superclase super(); System.out.println("Soy un perro"); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); } }
输出结果
Soy un animal Soy un perro
Aquí, cuando se crea el objeto dog de la clase Dog1al crearse, llama automáticamente al constructor por defecto o sin parámetros de la clase.
En el constructor de la subclase, la instrucción super() llama al constructor de la superclase y ejecuta las instrucciones dentro de él. Por lo tanto, obtenemos el resultado"Soy un animal".
Luego, el flujo del programa vuelve al constructor de la subclase y ejecuta el resto de las instrucciones. Por lo tanto, se imprime "Soy un perro".
Pero no es necesario usar super(). Incluso si no se utiliza super() en el constructor de la subclase, el compilador llama implícitamente al constructor por defecto de la superclase.
Entonces, ¿por qué usarlo explícitamente, con código redundante, si el compilador llama automáticamente a super()?
Si es necesario llamar al constructor de la superclase desde el constructor de la subclaseConstructor parametrizado (constructor con parámetros)por lo que debe utilizarse explícitamente.
super() con parámetrosdebe ser siemprecuerpo del constructor de la subclasede laLa primera instrucciónde lo contrario, se producirá un error de compilación.
class Animal { //Función constructora por defecto o sin parámetros Animal() { System.out.println("Soy un animal"); } //Función constructora parametrizada Animal(String tipo) { System.out.println("Tipo: ")}+type); } } class Dog extends Animal { //默认构造函数 Dog() { //调用超类的参数化构造函数 super("Animal"); System.out.println("Soy un perro"); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); } }
输出结果
Tipo: Animal Soy un perro
编译器可以自动调用无参数构造函数。但是,它不能调用带有参数的构造函数。
如果必须调用参数化的构造函数,则需要在子类构造函数中显式定义它,如上面代码中的语句:
super("Animal");
请注意,在上面的示例中,我们使用了super("Animal"),显式地调用参数化构造函数。在这种情况下,编译器不会调用超类的默认构造函数。