{"id":2357,"date":"2016-02-22T06:55:57","date_gmt":"2016-02-22T05:55:57","guid":{"rendered":"http:\/\/karstieltopia.com\/?p=2357"},"modified":"2016-02-22T06:55:57","modified_gmt":"2016-02-22T05:55:57","slug":"herencia-y-jerarquia","status":"publish","type":"post","link":"http:\/\/karstieltopia.com\/programacion\/java\/herencia-y-jerarquia\/","title":{"rendered":"Herencia y jerarqu\u00eda"},"content":{"rendered":"
Anteriormente hemos visto que son las clases (aqu\u00ed<\/a>) y tambi\u00e9n hemos visto algunos detalles sobre la clase String usando ejemplos (aqu\u00ed<\/a>) pero hay cosas m\u00e1s importantes que tendr\u00edamos que saber sobre las clases antes de poder trabajar con ellas. Los conceptos m\u00e1s importantes son la herencia y jerarqu\u00eda. Y s\u00ed, ha llegado el temible momento en que aprenderemos como podemos tener cosas de un tipo \u00a1\u00a1\u00a1pero que a la vez son de otro tipo!!! Es decir, como he dicho anteriormente, magia negra.<\/span><\/p>\n Uno de los conceptos m\u00e1s importantes de la POO (programaci\u00f3n orientada a objectos) es la herencia, la cual nos permite reusar un mont\u00f3n de c\u00f3digo de una manera correcta. B\u00e1sicamente esto significa que algunas clases estar\u00e1n basadas en otras clases y su relaci\u00f3n ser\u00e1 una relaci\u00f3n de jerarqu\u00eda, siendo siempre el primer elemento de todas las jerarqu\u00edas la clase Object.<\/p>\n Siempre he pensado que la mejor manera de entender las cosas es con un ejemplo, as\u00ed que aqu\u00ed vamos a ver un ejemplo de herencia en d\u00f3nde podremos ver como se va estructurando la jerarqu\u00eda entre las clases que creemos.<\/p>\n Aqu\u00ed tenemos un interfaz. Un interfaz es una clase especial que solamente tiene la firma de los m\u00e9todos y campos y es muy \u00fatil porque nos permite crear una buena jerarqu\u00eda entre nuestras clases, dado que no es posible instanciar un objeto directamente y obliga a que sus implementaciones tengan los mismos m\u00e9todos y campos con el c\u00f3digo que consideremos oportuno.<\/p>\n En este caso, este interfaz tiene solamente un m\u00e9todo, getWheels, que devuelve un valor de tipo int y que no tiene ning\u00fan par\u00e1metro.<\/p>\n Lo siguiente es una clase abstracta. Este es otro tipo especial de clase que se parece bastante m\u00e1s a una clase de las que hemos visto anteriormente pero que no es posible crear un objeto a partir de \u00e9l.<\/p>\n Si miramos el c\u00f3digo de abajo, veremos que tenemos un “implements VehicleDesign” junto al nombre de la clase. Esto significa que implementar\u00e1 la definici\u00f3n del interfaz VehicleDesign, es decir, tendr\u00e1 los mismos m\u00e9todos y variables que su padre.<\/p>\n Una de las mayores ventajas que tienen las clases abstractas es que son muy \u00fatiles para compartir m\u00e9todos con sus hijos.<\/p>\n Y ahora veremos dos hijos de las clase que hemos visto previamente. La clase Car es un hijo de la clase Vehicle y hereda todo el contenido de su padre. Esto no es del todo real, porque depender\u00eda de la visibilidad de cada m\u00e9todo y de cada variable, pero por ahora nos sirve como aproximaci\u00f3n (supondremos que todos los m\u00e9todos y campos son de tipo “public”) y ya hablaremos de este tema en una pr\u00f3xima entrega.<\/p>\n Lo que vemos al observar la clase es que extendemos la clase abstracta Vehicle que hab\u00edamos declarado anteriormente y esto lo hacemos con la palabra reservada “extend” y el nombre de su antecesor.<\/p>\n Dentro de esta clase, nosotros podemos llamar directamente al m\u00e9todo getWheels porque es una parte de su definici\u00f3n, ya que lo hereda de su padre. De la misma manera se podr\u00eda hacer con cualquier otro m\u00e9todo o campo que tuviera. En otras entradas hemos visto lo que es un constructor<\/a>, pero ahora que estamos hablando de los hijos y de herencia, quiz\u00e1s pensemos que funcionan de manera diferente, pero la realidad es que el funcionamiento es el mismo salvo por el detalle de que podemos llamar al constructor de su clase padre a trav\u00e9s del comando “super”. En este ejemplo, llamamos al constructor del padre pas\u00e1ndole el valor de 4.<\/p>\n Y esta otra clase, Motorbike, es tambi\u00e9n una hija de la clase Vehicle y llamamos al constructor del padre con el valor de 2.<\/p>\n
\n
\n
\nLas clases de Java, la \u00faltima frontera. M\u00e1s o menos es lo que deber\u00edamos pensar, porque todo el tiempo que estemos cerca del mundo de Java estaremos viendo clases y herencia por todas partes.<\/span><\/p>\npublic interface VehicleDesign {\r\n int getWheels();\r\n}<\/pre>\n
public abstract class Vehicle implements VehicleDesign {\r\n int wheels;\r\n\r\n public Vehicle (int number) {\r\n this.wheels = number;\r\n }\r\n\r\n public int getWheels() {\r\n return wheels;\r\n }\r\n}<\/pre>\n
public class Car extends Vehicle {\r\n\r\n public Car() {\r\n super(4);\r\n }\r\n\r\n public boolean isFerrari() {\r\n return false;\r\n }\r\n}<\/pre>\n
public class Motorbike extends Vehicle {\r\n\r\n public Motorbike () {\r\n super(2);\r\n }\r\n\r\n}<\/pre>\n