Sábado sabadete, aquí va otro tutorialete… xD para los que esten siguiendo estos minitutoriales para aprender a programar en Java, vamos a continuar con los conocimientos indispensables antes de empezar a hacer programas más o menos grandes. O si ya te has enfrascado con alguno y necesitas saber ésto de los extends espero que aclare las cosas.
Ésta vez voy a explicar cómo reutilizar código, para no tener que hacer una y otra vez lo mismo o para mantener el código bien organizado utilizando la herencia y polimorfismo.
Vamos a ver cómo crear clases reutilizando el código de clases ya creadas, de manera que podremos ampliar su uso añadiendo nuevas funciones o miembros de la clase, o podremos modificar los existentes. Todo ésto se hace con la palabra reservada extends.
A saber, al utilizar extends, la clase que extiende a otra hereda todas las variables y funciones de la otra. A ésto se le llama herencia. Y por otro lado, en la clase que ha heredado, por ejemplo una función, podemos volver a declararla en la clase que extiende, de manera que haga otra cosa. A ésto otro se le llama polimorfismo.
Ésto es todo lo que hay que saber, ahora lo vamos a ver todo de una vez con un ejemplo sencillo que incluya todo ésto que hemos visto. Al grano:
package javaMedio;
public class JavaMedio2Extends {
public static void main(String[] args) {
Circulo ci = new Circulo();
ci.coordenadaX = 0;
ci.coordenadaY = 1;
ci.color = «verde»;
ci.radio = 2;
Cuadrado cu = new Cuadrado();
cu.coordenadaX = 2;
cu.coordenadaY = 3;
cu.color = «rojo»;
cu.lado = 2;
ci.escribir();
cu.escribir();
}
}
class Objeto {
byte coordenadaX, coordenadaY;
String color;
public void escribir() {
System.out.println(«(» + coordenadaX + «, » + coordenadaY + «) «
+ color);
}
}
class Circulo extends Objeto {
int radio;
}
class Cuadrado extends Objeto {
int lado;
public void escribir() {
System.out.println(«Esto es un cuadrado de color » + color);
}
}
Éste programilla nos va a dar de resultado:
(0, 1) verde
Esto es un cuadrado de color rojo
Vamos a ver ahora el porqué por ejemplo podemos escribir ci.escribir(); si la clase Circulo no tiene una función escribir(). En el main hemos declarado la variable ci de tipo Circulo:
Circulo ci = new Circulo();
… y en la clase Circulo tenemos:
class Circulo extends Objeto {
int radio;
}
… notad que sólo hay una variable llamada radio, y en el main estamos utilizando la siguiente instrucción:
ci.escribir();
… y no nos da error. Esto es porque Circulo extiende la clase Objeto y la clase Objeto SÍ que tiene la función escribir():
class Objeto {
byte coordenadaX, coordenadaY;
String color;
public void escribir() {
System.out.println(«(» + coordenadaX + «, » + coordenadaY + «) «
+ color);
}
}
Podemos ver que la clase Circulo ha heredado la función escribir(), de igual manera del resto de variables coordenadaX, coordenadaY y color. Estan declaradas en la clase Objeto pero se usan con la variable ci que es de tipo Circulo:
ci.coordenadaX = 0;
ci.coordenadaY = 1;
ci.color = «verde»;
…
ci.escribir();
Círculo ha heredado todo de la clase Objeto y le ha añadido la variable radio. Sin embargo Cuadrado he heredado también pero en vez de tener radio, lo que tienes es lado.
Ahora vamos con el polimorfismo, que en ejemplo lo tenemos con el Cuadrado. Ya tenemos una función escribir() en la clase Objeto, al declarar Cuadrado que hereda de Objeto tendrá la función escribir() ya de por sí, pero al haberla declarado dentro de Cuadrado y haber hecho que haga algo diferente entonces está ocurriendo el llamado polimorfismo. Poli-morfismo, que significa varias formas, viene a decir que el Cuadrado y Circulo, aunque los dos sean Objetos tienen distinta forma porque la función escribir funciona de diferente manera. Por ésto cuando en el main pusimos:
ci.escribir();
cu.escribir();
Nos escribe cosas diferentes, porque el Circulo utiliza la función escribir() de Objeto, mientras que Cuadrado utiliza la suya propia que se ha reprogramado:
(0, 1) verde <- resultado de ci.escribir();
Esto es un cuadrado de color rojo <- resultado de cu.escribir();
Ya a partir de aquí hay que seguir con las interfaces, las clases abstractas y otras cosas más, pero no es objetivo de éste post. Tal vez más adelante en otro.
Espero que sirva para aprender si eres nuevo, o te haya aclarado algo si estas refrescando la memoria.
Un servidor se va a ver una peli…
Saludos