Subclases y superclases en Java
EJEMPLO Dadas la siguientes clases (Obra, Libro y Cuadro):
public class Obra
{
private String titulo;
private String autor;
public Obra(String titulo, String autor)
{
this.titulo = titulo;
this.autor = autor;
}
public void setTitulo(String titulo)
{
this.titulo = titulo;
}
public void setAutor(String autor)
{
this.autor = autor;
}
public String getAtributos()
{
return "El autor de \"" + titulo + "\" es " + autor + ".";
}
}
En la clase Obra se han definido dos atributos (titulo y autor), un constructor y tres métodos (setTitulo, setAutor y getAtributos).
public class Libro extends Obra
{
private int numeroDePaginas;
public Libro(String titulo, String autor, int numeroDePaginas)
{
super(titulo, autor);
this.numeroDePaginas = numeroDePaginas;
}
public String getAtributos()
{
return super.getAtributos() + "\nEl libro tiene " + numeroDePaginas + " páginas.";
}
}
En la clase Libro se ha definido un atributo (numeroDePaginas), un constructor y un método (getAtributos).
public class Cuadro extends Obra
{
private int largo;
private int alto;
public Cuadro(String titulo, String autor, int largo, int alto)
{
super(titulo, autor);
this.largo = largo;
this.alto = alto;
}
public String getAtributos()
{
return super.getAtributos() + "\nEl cuadro mide " + largo + "x" + alto + " centímetros.";
}
}
En la clase Cuadro se han definido dos atributos (largo y alto), un constructor y un método (getAtributos).
Palabra clave extends
Obsérvese que, en las signaturas de las clases Libro y Cuadro, mediante la palabra clave extends, se está indicando que dichas clases heredan todos los atributos y métodos de la clase Obra. Dicho de otro modo, las clases Libro y Cuadro son consideradas hijos (subclases o clases derivadas) de la clase Obra, considerada esta como su clase padre (superclase o clase base).
De modo que, en este ejemplo, tanto los atributos (titulo y autor) como los métodos (setTitulo, setAutor y getAtributos) definidos en la superclase Obra son también considerados miembros de las subclases Libro y Cuadro.
Por otra parte, las subclases pueden añadir nuevos atributos y/o métodos. En este caso, la subclase Libro incorpora un atributo (numeroDePaginas) y la subclase Cuadro incorpora dos atributos (largo y alto).
Polimorfismo
Nótese que, aunque –en este ejemplo– ninguna de las dos subclases (Libro y Cuadro) añade un nuevo método, sí que, ambas, redefinen –sobrescriben– el método getAtributos de la superclase (Obra).
Cuando un método de una clase base es redefinido (overriding) en una o varias subclases, se dice que se está haciendo uso del polimorfismo, que es una de las características más importantes de los lenguajes de programación orientados a objetos.
EJEMPLO { PruebaLibro } Al compilar y ejecutar el siguiente código:
import java.util.Scanner;
public class PruebaLibro
{
public static void main(String[] args)
{
String tituloDelLibro;
String autorDelLibro;
int numeroDePaginas;
Scanner teclado = new Scanner(System.in);
System.out.print("Introduzca el título del libro: ");
tituloDelLibro = teclado.nextLine();
System.out.print("Introduzca el autor del libro: ");
autorDelLibro = teclado.nextLine();
System.out.print("Introduzca el número de páginas del libro: ");
numeroDePaginas = teclado.nextInt();
Libro libro1 = new Libro(tituloDelLibro, autorDelLibro, numeroDePaginas);
System.out.printf(libro1.getAtributos());
}
}
En la pantalla se podrá ver algo similar a:
Palabra clave super
Fíjese que, al invocar al constructor de la subclase Libro, se le pasan tres parámetros:
Libro libro1 = new Libro(tituloDelLibro, autorDelLibro, numeroDePaginas);
En Java, los constructores no se heredan. Ahora bien, en el bloque de instrucciones del constructor de una subclase, la primera sentencia siempre tiene que ser, obligatoriamente, la llamada a un constructor de la superclase. Por ello, en el bloque de instrucciones del constructor de la subclase Libro se invoca al constructor de la superclase Obra y, para ello, se utiliza la palabra clave super:
public Libro(String titulo, String autor, int numeroDePaginas)
{
super(titulo, autor);
this.numeroDePaginas = numeroDePaginas;
}
Por otro lado, la palabra clave super también se puede utilizar para invocar a un método de la superclase. Por ejemplo, véase que, en el método getAtributos de la subclase Libro se ha llamado al método getAtributos de la superclase Obra:
public String getAtributos()
{
return super.getAtributos() + "\nEl cuadro mide " + largo + "x" + alto + " centímetros.";
}
Si dentro del método getAtributos de la subclase Libro, en lugar de super.getAtributos() se hubiese escrito getAtributos(), se estaría haciendo una llamada recursiva a sí mismo y, en consecuencia, esto provocaría un mal funcionamiento al ejecutar la sentencia:
System.out.printf(libro1.getAtributos());