English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriales básicos de Java

Control de flujo Java

Java Arreglo

Java Orientado a Objetos(I)

Java Orientado a Objetos(II)

Java Orientado a Objetos(III)

Manejo de excepciones en Java

Java Lista(Lista)

Java Queue(Cola)

Conjuntos de Java Map

Conjuntos de Java

Entrada y salida de Java (I/O)

Reader de Java/Writer

Otras temáticas de Java

Palabra clave super de Java

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 继承.

Uso de la palabra clave super

  1.  Llamar al método sobrescrito del padre en la subclase.

  2. Si la superclase (superclass) y la subclase (subclass) tienen propiedades con el mismo nombre, se accede a las propiedades de la superclase (campos).

  3. 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.

1.acceder a métodos sobrescritos 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 cubre el método de la superclase. Esto se llama: sobrescritura de métodos.

Ejemplo1: 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().

Ejemplo2: llamada a método de la superclase

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.

2.acceder a las propiedades del super( padre) clase

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.

Ejemplo3: acceder a 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".

3. Utilice super() para acceder al constructor de la superclase

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.

Ejemplo4: Utilice super()

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.

Ejemplo5Utilice super() para llamar al constructor parametrizado

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"),显式地调用参数化构造函数。在这种情况下,编译器不会调用超类的默认构造函数。