- 1 1. Relación entre la herencia y super
- 1.1 1.1 ¿Qué es la herencia en Java? (Conceptos básicos de extends)
- 1.2 1.2 ¿Por qué necesitamos super?
- 1.3 1.3 Sobrescritura y super (Manteniendo el comportamiento del padre)
- 1.4 1.4 Cuando la clase padre y la hija tienen el mismo nombre de campo
- 1.5 1.5 Qué significa realmente super (Definición simple)
- 2 2. Cómo usar super (3 patrones básicos)
- 2.1 2.1 Llamar a un constructor de la clase padre (super() / super(args…))
- 2.1.1 2.1.1 Repaso rápido: ¿Qué es un constructor?
- 2.1.2 2.1.2 En la herencia, el constructor de la clase padre se ejecuta primero
- 2.1.3 2.1.3 super() se inserta automáticamente (cuando es posible)
- 2.1.4 2.1.4 Cuando la clase padre solo tiene un constructor parametrizado
- 2.1.5 2.1.5 super(...) debe ser la primera línea del constructor
- 2.2 2.2 Llamar a un método de la clase padre (super.method())
- 2.3 2.3 Acceder a un campo de la clase padre (super.field)
- 2.4 2.4 Resumen de los 3 patrones
- 2.1 2.1 Llamar a un constructor de la clase padre (super() / super(args…))
- 3 3. Ejemplos prácticos para dominar super
- 3.1 3.1 Ejemplo 1: Orden de llamada al constructor (Padre → Hijo)
- 3.2 3.2 Ejemplo 2: La clase padre tiene solo un constructor parametrizado
- 3.3 3.3 Example 3: Calling a parent method after overriding (super.method())
- 3.4 3.4 Example 4: Accessing a hidden parent field (super.field)
- 3.5 3.5 Example 5: Calling both parent and child versions clearly
- 3.6 3.6 A realistic example: shared logic in the parent class
- 3.7 3.7 Section summary
- 4 4. Difference Between this and super
- 4.1 4.1 this se refiere al objeto actual (la instancia hija)
- 4.2 4.2 super se refiere al lado de la clase padre
- 4.3 4.3 La forma más simple de recordar la diferencia
- 4.4 4.4 Usando this y super con campos
- 4.5 4.5 Usando this y super con métodos
- 4.6 4.6 Constructores: this() vs super()
- 4.7 4.7 No puedes usar this() y super() juntos
- 4.8 4.8 Recordatorio importante: super no crea un nuevo objeto
- 4.9 4.9 Resumen de la sección
- 5 5. Errores y Trampas Comunes (Cómo Evitar Errores)
- 5.1 5.1 Escribir super(...) en el lugar equivocado (regla del constructor)
- 5.2 5.2 Olvidar super(args...) cuando la clase padre no tiene constructor sin argumentos
- 5.3 5.3 Intentar usar tanto this() como super() en el mismo constructor
- 5.4 5.4 Intentar usar super dentro de un método estático
- 5.5 5.5 Confundir super con “crear un objeto padre”
- 5.6 5.6 Usar super.campo con demasiada frecuencia (ocultar campos suele ser una mala idea)
- 5.7 5.7 “Si llamo a super.method(), solo se ejecuta la lógica del padre” (no siempre)
- 5.8 5.8 Lista rápida de verificación (para evitar errores de principiante)
- 6 6. Conclusión (Puntos clave)
- 6.1 6.1 ¿Qué significa super en Java?
- 6.2 6.2 Las 3 formas más importantes de usar super
- 6.3 6.3 this vs super (la forma más fácil de entenderlo)
- 6.4 6.4 La mayoría de los errores ocurren alrededor de los constructores
- 6.5 6.5 Conclusión final: super te ayuda a reutilizar y ampliar la lógica del padre de forma segura
- 7 7. Preguntas frecuentes (FAQ)
- 7.1 7.1 ¿Cuándo debería usar super en Java?
- 7.2 7.2 ¿Qué ocurre si no escribo super()?
- 7.3 7.3 ¿Cuál es la diferencia entre super() y this()?
- 7.4 7.4 ¿Puedo usar tanto this() como super() en el mismo constructor?
- 7.5 7.5 ¿Puedo usar super dentro de un método estático?
- 7.6 7.6 ¿super crea un nuevo objeto padre?
- 7.7 7.7 Si llamo a super.method(), ¿siempre ejecuta solo la lógica del padre?
- 7.8 7.8 ¿Debería usar super.field con frecuencia?
- 7.9 7.9 ¿Se puede usar super con interfaces?
- 7.10 7.10 ¿Cuál es la forma más rápida de dominar super?
1. Relación entre la herencia y super
Para comprender la palabra clave super de Java, primero debes entender la herencia.
super no es algo que memorices de forma aislada; su significado se vuelve claro una vez que ves cómo una clase hija y una clase padre trabajan juntas.
En esta sección aprenderás qué es la herencia y por qué super existe en primer lugar, usando explicaciones amigables para principiantes y ejemplos de código sencillos.
1.1 ¿Qué es la herencia en Java? (Conceptos básicos de extends)
En Java, la herencia permite crear una nueva clase a partir de una clase existente.
- Clase padre (superclase) : la clase base
- Clase hija (subclase) : la clase que hereda de la clase padre
Cuando una clase hija extiende una clase padre, puede reutilizar los campos y métodos del padre sin volver a escribirlos.
Sintaxis básica de herencia (extends)
class Parent {
void hello() {
System.out.println("Hello from Parent");
}
}
class Child extends Parent {
}
Aquí, Child hereda el método hello() de Parent.
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.hello(); // calling a method inherited from Parent
}
}
Salida:
Hello from Parent
Así que, aunque Child no define hello(), aún puede llamarlo porque lo heredó.
1.2 ¿Por qué necesitamos super?
En este punto, podrías pensar:
“Si la clase hija ya hereda todo del padre, ¿por qué necesitamos
superen absoluto?”
En muchos casos, no es necesario escribir super explícitamente.
Sin embargo, super se vuelve necesario cuando quieres acceder claramente a la versión del padre de algo.
Situaciones comunes incluyen:
- La clase hija sobrescribe un método, pero aún deseas llamar a la versión del padre
- La clase hija y la clase padre tienen campos con el mismo nombre
- Necesitas invocar un constructor específico del padre pasando argumentos
En resumen:
superse usa cuando deseas referirte explícitamente al lado de la clase padre.
1.3 Sobrescritura y super (Manteniendo el comportamiento del padre)
Una de las razones más comunes para usar super es la sobrescritura de métodos.
Sobrescribir significa que la clase hija proporciona su propia versión de un método que ya existe en la clase padre.
Ejemplo: sobrescribir un método
class Parent {
void greet() {
System.out.println("Parent: Hello!");
}
}
class Child extends Parent {
@Override
void greet() {
System.out.println("Child: Hi!");
}
}
Ahora, si llamas a greet() sobre un objeto Child:
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.greet();
}
}
Salida:
Child: Hi!
Se ejecuta la versión de la hija, porque la sobrescritura le da prioridad a la clase hija.
Llamar a la versión del padre con super.greet()
A veces no quieres reemplazar completamente el comportamiento del padre; solo deseas añadir lógica extra.
Ahí es donde super.method() resulta útil:
class Parent {
void greet() {
System.out.println("Parent: Hello!");
}
}
class Child extends Parent {
@Override
void greet() {
super.greet(); // call parent version
System.out.println("Child: Hi!");
}
}
Salida:
Parent: Hello!
Child: Hi!
Este es un patrón muy práctico:
- La clase padre maneja comportamiento común
- La clase hija añade comportamiento personalizado
1.4 Cuando la clase padre y la hija tienen el mismo nombre de campo
Otra situación en la que super es importante es cuando una clase padre y una clase hija tienen campos con el mismo nombre.
Ejemplo:
class Parent {
int value = 100;
}
class Child extends Parent {
int value = 200;
void printValue() {
System.out.println(value);
}
}
Aquí, value se refiere al campo de la clase hija, por lo que la salida será:
200
.
Si deseas acceder al campo de la clase padre, usa super.value:
class Child extends Parent {
int value = 200;
void printValue() {
System.out.println(value); // child value
System.out.println(super.value); // parent value
}
}
Salida:
200
100
Conclusión clave:
value→ campo de la clase hijasuper.value→ campo de la clase padre
1.5 Qué significa realmente super (Definición simple)
Ahora puedes resumir super así:
superes una palabra clave que permite acceder explícitamente a la versión de la clase padre de campos, métodos y constructores.
Si solo recuerdas una línea, recuerda esto:
supersignifica “usar la versión de la clase padre”.
En la siguiente sección, aprenderás las 3 formas más importantes de usar super, con ejemplos claros para cada una.
2. Cómo usar super (3 patrones básicos)
Ahora que entiendes qué significa super, centrémonos en cómo se usa realmente en Java.
En código del mundo real, super aparece en tres patrones principales:
- Llamar a un constructor de la clase padre (
super()/super(args…)) - Llamar a un método de la clase padre (
super.method()) - Acceder a un campo de la clase padre (
super.field)
Una vez que aprendas estos tres, super será muy fácil de reconocer y usar correctamente.
2.1 Llamar a un constructor de la clase padre (super() / super(args…))
2.1.1 Repaso rápido: ¿Qué es un constructor?
Un constructor es un método especial que se ejecuta cuando creas un objeto.
class Person {
Person() {
System.out.println("Person constructor");
}
}
Los constructores se usan para la inicialización, como establecer valores de campos.
2.1.2 En la herencia, el constructor de la clase padre se ejecuta primero
En la herencia de Java, crear un objeto hijo siempre comienza inicializando primero la parte de la clase padre.
Eso significa:
Constructor de la clase padre → Constructor de la clase hija
Ejemplo:
class Parent {
Parent() {
System.out.println("Parent constructor");
}
}
class Child extends Parent {
Child() {
System.out.println("Child constructor");
}
}
public class Main {
public static void main(String[] args) {
new Child();
}
}
Salida:
Parent constructor
Child constructor
Aunque no escribimos super(), el constructor de la clase padre se ejecutó de todos modos.
2.1.3 super() se inserta automáticamente (cuando es posible)
Si la clase padre tiene un constructor sin argumentos, Java inserta automáticamente esta línea al inicio del constructor de la clase hija:
super();
Así, estos dos constructores son efectivamente equivalentes:
Child() {
System.out.println("Child constructor");
}
Child() {
super(); // implicitly inserted by the compiler
System.out.println("Child constructor");
}
2.1.4 Cuando la clase padre solo tiene un constructor parametrizado
Este es uno de los errores más comunes entre principiantes.
Si la clase padre no tiene un constructor sin argumentos, Java no puede insertar super() automáticamente.
Ejemplo (esto provocará un error de compilación):
class Parent {
Parent(int x) {
System.out.println("Parent: " + x);
}
}
class Child extends Parent {
Child() {
System.out.println("Child created");
}
}
¿Por qué falla?
- El compilador intenta insertar
super(); - Pero
Parent()no existe
✅ Solución: llamar explícitamente al constructor correcto de la clase padre
class Child extends Parent {
Child() {
super(10);
System.out.println("Child created");
}
}
Salida:
Parent: 10
Child created
2.1.5 super(...) debe ser la primera línea del constructor
Java exige que super(...) sea la primera instrucción dentro de un constructor.
❌ Incorrecto:
Child() {
System.out.println("Something first");
super(10); // compile error
}
✅ Correcto:
Child() {
super(10);
System.out.println("Child logic");
}
Razón:
- La clase padre debe inicializarse antes de que la clase hija pueda ejecutar de manera segura su propia lógica.
2.2 Llamar a un método de la clase padre (super.method())
Otro caso de uso muy común es llamar al método de la clase padre después de sobrescribirlo.
2.2.1 Ejemplo básico
class Parent {
void show() {
System.out.println("Parent show()");
}
}
class Child extends Parent {
@Override
void show() {
System.out.println("Child show()");
}
void test() {
super.show(); // parent version
show(); // child version
}
}
public class Main {
public static void main(String[] args) {
new Child().test();
}
}
Salida:
Parent show()
Child show()
2.2.2 ¿Cuándo es esto útil?
super.method() es útil cuando:
- El método de la clase padre contiene lógica común
- El método de la clase hija necesita extender el comportamiento en lugar de reemplazarlo
- Quieres evitar copiar y pegar la lógica de la clase padre en la clase hija
Ejemplo:
class Parent {
void process() {
System.out.println("Common processing");
}
}
class Child extends Parent {
@Override
void process() {
super.process();
System.out.println("Child-specific processing");
}
}
Este patrón mantiene tu código limpio y mantenible.
2.3 Acceder a un campo de la clase padre (super.field)
Los campos funcionan de manera similar. Si tanto la clase padre como la clase hija tienen un campo con el mismo nombre, el campo de la clase hija oculta el campo de la clase padre.
Ejemplo:
class Parent {
int value = 100;
}
class Child extends Parent {
int value = 200;
void print() {
System.out.println(value); // child field
System.out.println(super.value); // parent field
}
}
public class Main {
public static void main(String[] args) {
new Child().print();
}
}
Salida:
200
100
2.3.1 ¿Deberías hacer esto en proyectos reales?
Generalmente, tener el mismo nombre de campo en la clase padre y la clase hija no es una gran idea porque puede confundir a los lectores.
Sin embargo, puede suceder cuando:
- Estás manteniendo código heredado
- Estás obligado a coincidir con un diseño de clase padre existente
- Necesitas diferenciar claramente los valores de la clase padre vs. clase hija
En esos casos, super.field es la herramienta correcta.
2.4 Resumen de los 3 patrones
Puedes recordar super así:
super()/super(args...)→ llamar al constructor de la clase padresuper.method()→ llamar al método de la clase padresuper.field→ acceder al campo de la clase padre
En la siguiente sección, profundizaremos con ejemplos de código prácticos para que puedas ver claramente cómo se comportan estos patrones cuando se ejecutan.
3. Ejemplos prácticos para dominar super
En este punto, ya conoces las tres formas principales de usar super.
Ahora hagamos que ese conocimiento se fije ejecutando ejemplos prácticos.
Esta sección se centra en:
- Orden de ejecución
- Qué se llama y por qué
- Cómo
supercambia el comportamiento en código real
3.1 Ejemplo 1: Orden de llamada al constructor (Padre → Hijo)
La regla más importante que recordar:
Al crear un objeto de la clase hija, Java siempre inicializa la parte de la clase padre primero.
class Parent {
Parent() {
System.out.println("Parent constructor");
}
}
class Child extends Parent {
Child() {
super(); // optional here, but allowed
System.out.println("Child constructor");
}
}
public class Main {
public static void main(String[] args) {
new Child();
}
}
Salida:
Parent constructor
Child constructor
Punto clave:
Incluso si eliminas super(), el resultado es el mismo (siempre y cuando la clase padre tenga un constructor sin argumentos).
3.2 Ejemplo 2: La clase padre tiene solo un constructor parametrizado
Si la clase padre no tiene un constructor sin argumentos, la clase hija debe llamar explícitamente al correcto.
class Parent {
Parent(String name) {
System.out.println("Parent: " + name);
}
}
class Child extends Parent {
Child() {
super("Taro");
System.out.println("Child creado");
}
}
public class Main {
public static void main(String[] args) {
new Child();
}
}
Output:
Parent: Taro
Child creado
Key point:
If you forget super("Taro"), Java tries to insert super() automatically and fails.
3.3 Example 3: Calling a parent method after overriding (super.method())
This is one of the most useful patterns in real projects.
class Parent {
void greet() {
System.out.println("Hola desde Parent");
}
}
class Child extends Parent {
@Override
void greet() {
super.greet(); // llamar comportamiento del padre
System.out.println("Hola desde Child");
}
}
public class Main {
public static void main(String[] args) {
new Child().greet();
}
}
Output:
Hola desde Parent
Hola desde Child
Key point:
You can extend parent behavior without rewriting it.
3.4 Example 4: Accessing a hidden parent field (super.field)
If parent and child both define a field with the same name, the child version hides the parent version.
class Parent {
int value = 100;
}
class Child extends Parent {
int value = 200;
void printValues() {
System.out.println("Valor de Child: " + value);
System.out.println("Valor de Parent: " + super.value);
}
}
public class Main {
public static void main(String[] args) {
new Child().printValues();
}
}
Output:
Valor de Child: 200
Valor de Parent: 100
Key point:
valuerefers to the child’s fieldsuper.valuerefers to the parent’s field
3.5 Example 5: Calling both parent and child versions clearly
This is a great example to remove confusion.
class Parent {
void show() {
System.out.println("Parent show()");
}
}
class Child extends Parent {
@Override
void show() {
System.out.println("Child show()");
}
void test() {
super.show(); // versión del padre
this.show(); // versión del hijo (igual que llamar solo a show())
}
}
public class Main {
public static void main(String[] args) {
new Child().test();
}
}
Output:
Parent show()
Child show()
Key point:
super.show()= parentthis.show()= child
3.6 A realistic example: shared logic in the parent class
In real applications, parent classes often contain common logic such as logging, validation, or setup steps.
class BaseService {
void execute() {
System.out.println("[LOG] Inicio de ejecución");
}
}
class UserService extends BaseService {
@Override
void execute() {
super.execute(); // reutilizar comportamiento compartido
System.out.println("Lógica de UserService en ejecución...");
}
}
public class Main {
public static void main(String[] args) {
new UserService().execute();
}
}
Output:
[LOG] Inicio de ejecución
Lógica de UserService en ejecución...
Why this is useful:
- You avoid duplicating common behavior
- The child focuses only on what’s unique
- Your code becomes easier to maintain
3.7 Section summary
From these examples, you should remember:
- Parent constructors run before child constructors
super(args...)is required if the parent has no no-arg constructorsuper.method()is perfect for reusing and extending behaviorsuper.fieldhelps when parent and child fields share the same name
Next, we’ll clarify one of the most confusing topics for beginners:
What’s the difference between
thisandsuper?
4. Difference Between this and super
When learning Java’s super, you will almost always see this at the same time.
Both are reference keywords, so it’s easy for beginners to mix them up.
In this section, you’ll learn:
- Qué significa
this - Qué significa
super - Cómo usarlos correctamente con campos, métodos y constructores
4.1 this se refiere al objeto actual (la instancia hija)
this significa:
“la instancia del objeto actual”
Se usa más comúnmente cuando un nombre de campo y un parámetro del constructor tienen el mismo nombre.
class User {
String name;
User(String name) {
this.name = name; // field = parameter
}
}
Aquí:
name(lado derecho) es el parámetro del constructorthis.name(lado izquierdo) es el campo de instancia
Así this te ayuda a evitar confusiones.

4.2 super se refiere al lado de la clase padre
super se refiere a la parte de la clase padre (superclase) del objeto actual.
Significa:
“usar la versión de la clase padre”
Principalmente lo usas cuando quieres acceder a miembros de la clase padre que están ocultos o sobrescritos.
4.3 La forma más simple de recordar la diferencia
Una forma amigable para principiantes de memorizar:
this→ el lado de la clase hijasuper→ el lado de la clase padre
No son dos objetos diferentes.
Son dos “vistas” diferentes del mismo objeto.
4.4 Usando this y super con campos
Si tanto la clase padre como la hija definen un campo con el mismo nombre, puedes elegir claramente cuál quieres.
class Parent {
int value = 100;
}
class Child extends Parent {
int value = 200;
void print() {
System.out.println(this.value); // child field
System.out.println(super.value); // parent field
}
}
public class Main {
public static void main(String[] args) {
new Child().print();
}
}
Salida:
200
100
Punto clave:
this.value= campo hijosuper.value= campo padre
Además, en Java, this a menudo es opcional:
System.out.println(value);
es lo mismo que:
System.out.println(this.value);
4.5 Usando this y super con métodos
Los métodos son el área más común donde importa this vs super—especialmente con la sobrescritura.
class Parent {
void show() {
System.out.println("Parent show()");
}
}
class Child extends Parent {
@Override
void show() {
System.out.println("Child show()");
}
void test() {
this.show(); // child method (same as show())
super.show(); // parent method
}
}
public class Main {
public static void main(String[] args) {
new Child().test();
}
}
Salida:
Child show()
Parent show()
Punto clave:
this.show()→ versión hijasuper.show()→ versión padre
4.6 Constructores: this() vs super()
Esta es una de las partes más confusas para principiantes, pero es muy importante.
this()llama a otro constructor en la misma clasesuper()llama a un constructor en la clase padre
4.6.1 Ejemplo de this() (encadenamiento de constructores dentro de la misma clase)
class User {
String name;
int age;
User() {
this("NoName", 0); // call another constructor
}
User(String name, int age) {
this.name = name;
this.age = age;
}
}
Esto es útil porque evita repetir la lógica de inicialización.
4.6.2 Ejemplo de super() (llamando al constructor padre)
class Parent {
Parent() {
System.out.println("Parent constructor");
}
}
class Child extends Parent {
Child() {
super(); // initialize parent
System.out.println("Child constructor");
}
}
Salida:
Parent constructor
Child constructor
4.7 No puedes usar this() y super() juntos
Muchos principiantes intentan algo como esto:
Child() {
this(1);
super(); // error
}
Esto no está permitido.
Razón:
- Tanto
this()comosuper()deben ser la primera línea en el constructor - Solo uno de ellos puede ser el primero
Así que debes elegir uno.
4.8 Recordatorio importante: super no crea un nuevo objeto
super no crea un objeto padre separado.
En su lugar:
this= objeto actual visto como hijosuper= mismo objeto visto como padre
Por eso super se debe entender mejor como una palabra clave de referencia, no como un creador de objetos.
4.9 Resumen de la sección
thishace referencia al objeto actual (lado del hijo)superhace referencia al lado de la clase padrethis()llama a otro constructor de la misma clasesuper()llama a un constructor de la clase padrethis()ysuper()no pueden usarse juntos
A continuación, cubriremos errores comunes y patrones de fallos para que puedas evitar las trampas más frecuentes para principiantes.
5. Errores y Trampas Comunes (Cómo Evitar Errores)
La palabra clave super de Java es poderosa, pero también es fácil de usar incorrectamente, sobre todo cuando aún estás aprendiendo herencia y constructores.
En esta sección aprenderás los errores más habituales que cometen los principiantes y cómo corregirlos rápidamente.
5.1 Escribir super(...) en el lugar equivocado (regla del constructor)
Una de las reglas más importantes:
super(...)debe ser la primera instrucción dentro de un constructor.
❌ Incorrecto (error de compilación):
class Parent {
Parent(int x) {}
}
class Child extends Parent {
Child() {
System.out.println("Do something first");
super(10); // ERROR: must be first line
}
}
✅ Correcto:
class Child extends Parent {
Child() {
super(10);
System.out.println("Child logic");
}
}
¿Por qué?
Porque la parte padre del objeto debe inicializarse antes de que se ejecute la lógica del hijo.
5.2 Olvidar super(args...) cuando la clase padre no tiene constructor sin argumentos
Si la clase padre solo tiene un constructor parametrizado, Java no puede insertar automáticamente super().
❌ Incorrecto:
class Parent {
Parent(String name) {}
}
class Child extends Parent {
Child() {
// compiler tries to insert super() here -> ERROR
}
}
✅ Correcto:
class Child extends Parent {
Child() {
super("Taro");
}
}
Este es un error de compilación muy frecuente entre principiantes, así que siempre revisa los constructores de la clase padre.
5.3 Intentar usar tanto this() como super() en el mismo constructor
Los principiantes a menudo piensan:
“Quiero llamar a otro constructor Y al constructor del padre.”
Pero Java no lo permite.
❌ Incorrecto:
class Parent {
Parent() {}
}
class Child extends Parent {
Child() {
this(1);
super(); // ERROR
}
Child(int x) {}
}
Razón:
this()ysuper()deben ser la primera línea- Sólo uno puede estar primero
Por lo tanto, debes diseñar tus constructores de modo que sólo se use uno directamente.
5.4 Intentar usar super dentro de un método estático
super está ligado a la instancia actual del objeto, por lo que no funciona en métodos estáticos.
❌ Incorrecto (conceptualmente):
class Parent {
void hello() {}
}
class Child extends Parent {
static void test() {
super.hello(); // ERROR
}
}
Punto clave:
- Los métodos estáticos pertenecen a la clase, no a una instancia
superse refiere a la parte padre de una instancia
Por eso Java lo impide.
5.5 Confundir super con “crear un objeto padre”
Algunos principiantes asumen:
“Usar
supercrea un objeto padre separado.”
Eso no es cierto.
super no crea un objeto nuevo.
Simplemente accede al lado de la clase padre del mismo objeto.
Piénsalo así:
this= mismo objeto, vista de hijosuper= mismo objeto, vista de padre
5.6 Usar super.campo con demasiada frecuencia (ocultar campos suele ser una mala idea)
Sí, super.campo existe, pero en la mayoría de los proyectos reales deberías evitar crear campos en padre e hijo con el mismo nombre.
Ejemplo (diseño confuso):
class Parent {
int value = 100;
}
class Child extends Parent {
int value = 200; // hides parent field
}
Aunque super.valor funciona, este diseño dificulta la lectura y el mantenimiento del código.
Mejor práctica:
- Usa nombres de campo diferentes
- Mantén los campos privados y expónlos mediante métodos (getters)
- Evita ocultar campos a menos que sea absolutamente necesario
5.7 “Si llamo a super.method(), solo se ejecuta la lógica del padre” (no siempre)
Esto es un poco más avanzado, pero útil de saber.
Cuando llamas a super.method(), definitivamente llamas al método del padre.
Sin embargo, dentro de ese método del padre, si llama a otro método que el hijo sobrescribe, puede ejecutarse la versión del hijo.
Ejemplo:
class Parent {
void a() {
b(); // calls b()
}
void b() {
System.out.println("Parent b()");
}
}
class Child extends Parent {
@Override
void b() {
System.out.println("Child b()");
}
}
public class Main {
public static void main(String[] args) {
Child c = new Child();
c.a();
}
}
Salida:
Child b()
Aunque a() está en el padre, llama a b(), y b() está sobrescrito en el hijo.
Conclusión para principiantes:
super.method() llama a la versión del padre de ese método, pero las llamadas a métodos dentro de él pueden seguir usando las reglas de sobrescritura.
5.8 Lista rápida de verificación (para evitar errores de principiante)
Antes de usar super, verifica lo siguiente:
- ¿Es
super(...)la primera línea del constructor? - ¿Tiene la clase padre un constructor sin argumentos?
- ¿Estás intentando usar tanto
this()comosuper()? - ¿Estás usando
superdentro de un método estático? - ¿Estás ocultando campos con el mismo nombre innecesariamente?
6. Conclusión (Puntos clave)
En este artículo, aprendiste qué es la palabra clave super de Java, por qué existe y cómo usarla correctamente en código real.
Vamos a resumir todo con los puntos más importantes que debes recordar.
6.1 ¿Qué significa super en Java?
super es una palabra clave que te permite acceder explícitamente a la parte de clase padre (superclase) de un objeto.
Se usa principalmente en la herencia (extends) cuando deseas referirte a la versión del padre de:
- constructores
- métodos
- campos
En términos simples:
supersignifica “usar la versión de la clase padre.”
6.2 Las 3 formas más importantes de usar super
Puedes memorizar super en estos tres patrones:
1) Llamar al constructor del padre
super()super(args...)
Esto se usa cuando necesitas inicializar correctamente la clase padre, especialmente si el padre requiere argumentos.
2) Llamar al método del padre
super.method()
Esto es útil cuando sobrescribes un método pero aún deseas reutilizar el comportamiento del padre.
3) Acceder al campo del padre
super.field
Esto se usa cuando tanto el padre como el hijo tienen un campo con el mismo nombre y deseas referirte claramente al del padre.
6.3 this vs super (la forma más fácil de entenderlo)
Muchos principiantes confunden estas dos palabras clave, pero la diferencia es simple:
this→ el objeto actual (vista desde el hijo)super→ la vista del padre del mismo objeto
No representan dos objetos diferentes.
6.4 La mayoría de los errores ocurren alrededor de los constructores
Si deseas evitar los errores más comunes, recuerda estas reglas:
super(...)debe ser la primera línea dentro de un constructor- Si el padre no tiene un constructor sin argumentos, debes escribir
super(args...) - No puedes usar
this()ysuper()juntos en el mismo constructor superno funciona en métodos estáticos
6.5 Conclusión final: super te ayuda a reutilizar y ampliar la lógica del padre de forma segura
El verdadero poder de super es que te permite:
- mantener la lógica compartida en la clase padre
- ampliar el comportamiento en la clase hija
- evitar copiar y pegar código
- hacer que la herencia sea más limpia y fácil de mantener
Si recuerdas una sola frase de todo este artículo, recuerda esto:
superes la palabra clave que usas cuando quieres la versión de la clase padre.
7. Preguntas frecuentes (FAQ)
.Aquí están las preguntas más comunes que los principiantes hacen al aprender la palabra clave super de Java.
Si aún te sientes inseguro acerca de ciertas partes, esta sección debería aclararlas rápidamente.
7.1 ¿Cuándo debería usar super en Java?
Normalmente usas super en estas situaciones:
- Cuando deseas llamar a un constructor padre (
super()/super(args...)) - Cuando sobrescribes un método pero aún quieres llamar al método padre (
super.method()) - Cuando la clase padre y la hija tienen el mismo nombre de campo y deseas el campo padre (
super.field)
Para los principiantes, el caso más común y útil es:
sobrescribir un método y llamar a la lógica del padre usando
super.method().
7.2 ¿Qué ocurre si no escribo super()?
Si la clase padre tiene un constructor sin argumentos, Java inserta automáticamente:
super();
en la parte superior del constructor de la subclase.
Así que en muchos casos, no necesitas escribirlo manualmente.
Sin embargo, si la clase padre no tiene un constructor sin argumentos, el código fallará a menos que llames explícitamente al correcto con argumentos.
7.3 ¿Cuál es la diferencia entre super() y this()?
Llaman a constructores diferentes:
super()→ llama a un constructor en la clase padrethis()→ llama a un constructor en la misma clase
Idea de ejemplo:
- Usa
this()para reducir código duplicado en constructores - Usa
super()para inicializar correctamente la parte padre del objeto
7.4 ¿Puedo usar tanto this() como super() en el mismo constructor?
No, no puedes.
Razón:
- Tanto
this()comosuper()deben ser la primera instrucción en el constructor - Solo una instrucción puede ser la primera
Así que Java te obliga a elegir una.
7.5 ¿Puedo usar super dentro de un método estático?
No (en general).
super está relacionado con la instancia actual del objeto, pero los métodos estáticos pertenecen a la propia clase y no tienen una referencia a una instancia.
Por eso usar super en métodos estáticos produce un error de compilación.
7.6 ¿super crea un nuevo objeto padre?
No.
super no crea ningún objeto nuevo.
Simplemente accede a la vista de la clase padre del mismo objeto.
Una forma útil de pensarlo:
this= mismo objeto visto como hijosuper= mismo objeto visto como padre
7.7 Si llamo a super.method(), ¿siempre ejecuta solo la lógica del padre?
super.method() siempre llama a la versión del padre de ese método.
Sin embargo, si el método padre internamente llama a otro método que la subclase sobrescribe, entonces la versión de la subclase puede ejecutarse debido a las reglas de sobrescritura de Java.
Conclusión para principiantes:
super.method()llama a la versión del padre, pero las llamadas a métodos dentro de él pueden seguir siendo afectadas por la sobrescritura.
7.8 ¿Debería usar super.field con frecuencia?
Normalmente, no.
Si con frecuencia necesitas super.field, puede significar que tu diseño es confuso porque la clase padre y la hija comparten el mismo nombre de campo.
En proyectos reales, es mejor evitar ocultar campos a menos que tengas una razón fuerte (como código heredado o restricciones externas).
7.9 ¿Se puede usar super con interfaces?
En la herencia normal (extends), super se refiere a la clase padre.
Sin embargo, Java también permite una sintaxis especial para llamar a un método predeterminado de una interfaz:
InterfaceName.super.method();
Esto es más avanzado, así que si eres principiante, concéntrate primero en:
- herencia de clases
super()/super.method()/super.field
7.10 ¿Cuál es la forma más rápida de dominar super?
Una ruta de aprendizaje sencilla:
- Escribe una clase padre/hija básica y confirma el orden de los constructores
- Sobrescribe un método y llama a
super.method() - Compara
thisvssupercon campos y métodos - Practica corrigiendo errores relacionados con constructores
La mejor práctica es escribir pequeños ejemplos y ejecutarlos.

