Anda di halaman 1dari 9

22/3/2015

HerenciaenJava,conejemplosJarroba

HerenciaenJava,conejemplos
ElproyectodeestepostlopuedesdescargarpulsandoAQUI.
LaHerenciaesunodelos4pilaresdelaprogramacinorientadaaobjetos(POO)juntocon
la Abstraccin, Encapsulacin yPolimorfismo. Al principio cuesta un poco entender estos
conceptos caractersticos del paradigma de la POO porque solemos venir de otro paradigma de
programacin como el paradigma de la programacin estructurada (ver la entradaParadigmas de
Programacin),perosehadedecirquelacomplejidadestenentenderestenuevoparadigmayno
enotracosa.Enestaentradavamosaexplicardelamejormaneraposiblequeeslaherenciaylo
vamosaexplicarconunejemplo.
Respectoalaherenciasehandadomuchasdefinicionescomoporejemplolasiguiente:La
herenciaesunmecanismoquepermiteladefinicindeunaclaseapartirdeladefinicindeotraya
existente.Laherenciapermitecompartirautomticamentemtodosydatosentreclases,subclases
y objetos.. As de primeras esta definicin es un poco difcil de digerir para aquellos que estis
empezandoconlaPOO,asquevamosaintentardigerirestadefinicinconunejemploenelque
veremosquelaherencianoesmsqueunCopyPasteDinmicoounaformadesacar factor
comnalcdigoqueescribimos.
El ejemplo que proponemos es un caso en el que vamos a simular el comportamiento que
tendranlosdiferentesintegrantesdelaseleccinespaoladefutboltantolosFutbolistascomoel
cuerpotcnico(Entrenadores,Masajistas,etc).Parasimularestecomportamientovamosadefinir
tresclasesquevanarepresentaranaobjetosFutbolista,EntrenadoryMasajista.Decadaunosde
ellos vamos a necesitar algunos datos que reflejaremos en losatributos y una serie de acciones
que reflejaremos en sus mtodos. Estos atributos y mtodos los mostramos en el siguiente
diagramadeclases:

data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 1/9

22/3/2015

HerenciaenJava,conejemplosJarroba

NOTA:enestediagramayenadelantenovamosaponerlosconstructoresymtodosgetterysetter
conelfindequeeldiagramanosquedegrandeeintendibleaunqueenunbuendiagramadeclases
deberanaparecerpararespetarelprincipiodeencapsulacindelaPOO
Comosepuedeobservar,vemosqueenlastresclasestenemosatributosymtodosque
conigualesyaquelostrestienenlosatributosid, Nombre, Apellidos y Edad y los tres tienen los
mtodosdeViajaryConcentrarse:

Aniveldecdigotenemoslosiguientetrasvereldiagramadeclases:

publicclassFutb
olista
{

publicclassEntr
enador
{

publicclassMasaj
ista
{

privatei
ntid;

privateS
tringNombre;

privateS
tringApellidos;

privatei
ntEdad;

privatei
ntdorsal;

privateS
tringdemarcacio
n;

privatei
ntid;

privateS
tringNombre;

privateS
tringApellidos;

privatei
ntEdad;

privateS
tringidFederacio
n;

privatein
tid;

privateSt
ringNombre;

privateSt
ringApellidos;

privatein
tEdad;

privateSt
ringTitulacion;

privatein
taniosExperienci
a;

//constr
uctor,getterys
etter

publicvo
idConcentrarse()

//constr
uctor,getterys
etter

publicvo
idConcentrarse()
{

//constru
ctor,getteryset
ter

publicvoi
dConcentrarse(){

data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 2/9

22/3/2015

...

HerenciaenJava,conejemplosJarroba

publicvo
idViajar(){

...

publicvo
idjugarPartido()
{

...

publicvo
identrenar(){

...

}
}

...

publicvo
idViajar(){

...

publicvo
iddirigirPartid
o(){

...

...

publicvoi
dViajar(){

...

publicvoi
ddarMasaje(){

...

}
}

publicvo
iddirigirEntren
o(){

...

}
}

Lo que podemos ver en este punto es que estamos escribiendo mucho cdigo repetido ya
quelastresclasestienenmtodosyatributoscomunes,deahiycomoveremosenseguida,decimos
quelaherenciaconsisteensacarfactorcomnparanoescribircdigodems,portantoloque
haremosseracrearnosunaclaseconelcdigoqueescomnalastresclases(aestaclase
se le denomina en la herencia como Clase Padre o SuperClase) y el cdigo que es
especificodecadaclase,lodejaremosenella,siendodenominadasestasclasescomoClases
Hijas, las cuales heredan de la clase padre todos los atributos y mtodos pblicos o
protegidos.Esmuyimportantedecirquelasclaseshijasnovanaheredarnuncalosatributosy
mtodosprivadosdelaclasepadre,asquemuchocuidadoconesto.Enresumenparaqueveis
laventajadelaherencia,tenemosahoraunaclasepadreconnlineasdecdigoytresclaseshijas
cona,byclineasdecdigosrespectivamente,portantosihechiscuentas,hemos reducido
nuestro cdigo en 2n lneas menos ya que antes tenamos (n+a)+(n+b)+(n+c) lneas de
cdigo y ahora tras aplicar herencia tenemos n+a+b+c lneas, aunque tambin es cierto que
tenemosunaclasems,peroveremosunpocomsadelantelaventajadeteneresaclasepadre.En
resumen,alsacarfactorcomnyaplicarherencia,tenemoslassiguientesclases:

data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 3/9

22/3/2015

HerenciaenJava,conejemplosJarroba

Aniveldecdigo,lasclasesquedaranimplementadasdelasiguienteforma:

publicclassSele
ccionFutbol
{

protected
intid;

protected
StringNombre;

protected
StringApellidos;

protected
intEdad;

//constr
uctor,getterys
etter

publicvo
idConcentrarse()
{

...
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 4/9

22/3/2015

HerenciaenJava,conejemplosJarroba

publicvo
idViajar(){

...

}
}

publicclassFutb
olistaextendsSe
leccionFutbol
{

privatei
ntdorsal;

privateS
tringdemarcacio
n;
publicFu
tbolista(){

s
uper();

//getter
ysetter

publicvo
idjugarPartido()
{

...

publicvo
identrenar(){

...

}
}

publicclassEntr
enadorextendsSe
leccionFutbol
{

publicclassMasaj
istaextendsSelec
cionFutbol
{

privateS
tringidFederacio
n;

privateSt
ringTitulacion;

privatein
taniosExperienci
a;

publicEn
trenador(){

s
uper();

//getter
ysetter

publicvo
iddirigirPartid
o(){

...

publicvo
iddirigirEntren
o(){

...

}
}

publicMas
ajista(){

su
per();

//getter
ysetter

publicvoi
ddarMasaje(){

...

}
}

Como podis observar ahora queda un cdigo mucho ms limpio, estructurado y con
menoslneasdecdigo,loquelohacemslegible,cosaqueesmuyimportanteyloquetodava
lohacemsimportanteesqueesuncdigoreutilizable, lo que significa que ahora si queremos
aadir ms clases a nuestra aplicacin como por ejemplo una clase Mdico, Utiller@, Jefe/a de
prensaetc.quepertenezcantambinalequipotcnicodelaseleccinEspaola,lopodemoshacer
deformamuysencillayaqueenlaclasepadre(SeleccionFutbol)tenemosimplementadopartede
susdatosydesucomportamientoysolohabrqueimplementarlosatributosymtodospropiosde
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 5/9

22/3/2015

HerenciaenJava,conejemplosJarroba

esaclase.Empezisaverlautilidaddelaherencia?.
Ahorasioshabisfijadobienenelcdigoquesehaescritoysinohabistenidoexperiencia
con la herencia en Java, habris podido observar dos palabras reservadas nuevas como son
extends,protectedysuper.Puesbien,ahoravamosaexplicarelsignificadodeellas:
extends:Estapalabrareservada,indicaalaclasehijacualvaasersuclasepadre,esdecir
que por ejemplo en la clase Futbolista al poner public class Futbolista extends
SeleccionFutbol le estamos indicando a la clase Futbolista que su clase padre es la clase
SeleccionFutbolodichodeotramaneraparaqueseentiendamejor,alponerestoestamos
haciendo un copypaste dinmico diciendo a la clase Futbolista que se copie todos los
atributos y mtodos pblicos o protegidos de la clase SeleccionFutbol. De aqu viene esa
definicinquedimosdequelaherenciaenuncopypastedinmico.
protected:sirveparaindicaruntipodevisibilidaddelosatributosymtodosdelaclasepadre
y significa que cuando un atributo es protected o protegido, solo es visible ese atributo o
mtododesdeunadelasclaseshijasynodesdeotraclase.
super: sirve para llamar al constructor de la clase padre. Quizs en el cdigo que hemos
puestonosehavistomuybien,peroacontinuacinlomostramosdeformasmsclara,viendo
elconstructordelosobjetospasndolelosatributos:
publicclassSeleccionFutbol{

......

publicSeleccionFutbol(){
}

publicSeleccionFutbol(intid,Stringnombre,String
apellidos,intedad){

this.id=id;

this.Nombre=nombre;

this.Apellidos=apellidos;

this.Edad=edad;

......
publicclassFutbolistaextendsSeleccionFutbol{

......

publicFutbolista(){

super();

publicFutbolista(intid,Stringnombre,Stringapell
idos,intedad,intdorsal,Stringdemarcacion){

super(id,nombre,apellidos,edad);

this.dorsal=dorsal;

this.demarcacion=demarcacion;

......
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 6/9

22/3/2015

HerenciaenJava,conejemplosJarroba

Hastaaqutodocorrecto,peroahoravamosavercomotrabajamosconestasclases.Para
ver este funcionamiento de forma clara y sencilla vamos a trabajar con un objeto de cada clase y
vamosavercomosecreanydequeformaejecutansusmtodo.Paraelloempecemosmostrando
elsiguientefragmentodecdigo:
publicclassMain{

//ArrayListdeobjetosSeleccionFutbol.Idenpendient
ementedelaclasehijaalaquepertenezcaelobjeto

publicstaticArrayList<SeleccionFutbol>integrantes
=newArrayList<SeleccionFutbol>();

publicstaticvoidmain(String[]args){

EntrenadordelBosque=newEntrenador(1,"Vic
ente","DelBosque",60,"284EZ89");

Futbolistainiesta=newFutbolista(2,"Andre
s","Iniesta",29,6,"InteriorDerecho");

MasajistaraulMartinez=newMasajista(3,"Ra
l","Martinez",41,"LicenciadoenFisioterapia",18);

integrantes.add(delBosque);
integrantes.add(iniesta);
integrantes.add(raulMartinez);

//CONCENTRACION

System.out.println("Todoslosintegrantescom
ienzanunaconcentracion.(Todosejecutanelmismomtodo)");

for(SeleccionFutbolintegrante:integrante
s){

System.out.print(integrante.getNombr
e()+""+integrante.getApellidos()+">");

integrante.Concentrarse();

//VIAJE

System.out.println("nTodoslosintegrantesvi
ajanparajugarunpartido.(Todosejecutanelmismomtod
o)");

for(SeleccionFutbolintegrante:integrante
s){

System.out.print(integrante.getNombr
e()+""+integrante.getApellidos()+">");

integrante.Viajar();

......

Loprimeroquevemosesquenoscreamosunobjetodecadaclase,pasndolelosatributos
alconstructorcomoparmetroydespussorprendentementelosmetemosenunArrayListde
objetos de la clase SeleccionFutbol que es la clase padre. Esto evidentemente te lo permite
haceryaquetodoslosobjetossonhijosdelamismaclasepadre.Luegocomoveis,recorremosel
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 7/9

22/3/2015

HerenciaenJava,conejemplosJarroba

ArrayListyejecutamossusmtodoscomunescomosonelConcentrarseyelViajar.Estecdigo
dacomosalidalosiguiente:

Todoslosintegrantescomienzanunaconcentracion.(Todosejecutanelmismomtodo)
VicenteDelBosque>Concentrarse
AndresIniesta>Concentrarse
RalMartinez>Concentrarse
Todoslosintegrantesviajanparajugarunpartido.(Todosejecutanelmismomtodo)
VicenteDelBosque>Viajar
AndresIniesta>Viajar
RalMartinez>Viajar

Como veis al ejecutar todos el mismo mtodo de la clase padre el cdigo puesto funciona
correctamente.
Posteriormentevamosaejecutarcdigoespecificodelasclaseshijas,deahiqueahorano
podamosrecorrerelArrayListyejecutarelmismomtodoparatodoslosobjetosyaqueahoraesos
objetossonnicosdelaclaseshijas.Elcdigoeselsiguiente:
//ENTRENAMIENTO
System.out.println("nEntrenamiento:Solamenteelentrenadory
elfutbolistatienemetodosparaentrenar:");
System.out.print(delBosque.getNombre()+""+delBosque.getApell
idos()+">");
delBosque.dirigirEntrenamiento();
System.out.print(iniesta.getNombre()+""+iniesta.getApellido
s()+">");
iniesta.entrenar();
//MASAJE
System.out.println("nMasaje:Soloelmasajistatieneelmtod
oparadarunmasaje:");
System.out.print(raulMartinez.getNombre()+""+raulMartinez.ge
tApellidos()+">");
raulMartinez.darMasaje();
//PARTIDODEFUTBOL
System.out.println("nPartidodeFtbol:Solamenteelentrenad
oryelfutbolistatienemetodosparaelpartidodeftbo
l:");
System.out.print(delBosque.getNombre()+""+delBosque.getApell
idos()+">");
delBosque.dirigirPartido();
System.out.print(iniesta.getNombre()+""+iniesta.getApellido
s()+">");
iniesta.jugarPartido();

Como vemos aunque el entrenador y los futbolistas asistan a un entrenamiento, los dos
data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 8/9

22/3/2015

HerenciaenJava,conejemplosJarroba

hacenunafuncindiferenteenelmismo,portantohayquehacermtodosdiferenteparacadauna
de las clases. Ya veremos cuando hablemos del polimorfismo que podremos ejecutar el mismo
mtodoparaclasesdiferentesyqueesosmtodoshagancosasdistintas.Comoresultadoalcdigo
mostradotenemoslosiguiente:

Entrenamiento:Solamenteelentrenadoryelfutbolistatienemetodosparaentrenar:
VicenteDelBosque>Dirigeunentrenamiento
AndresIniesta>Entrena
Masaje:Soloelmasajistatieneelmtodoparadarunmasaje:
RalMartinez>Daunmasaje
PartidodeFtbol:Solamenteelentrenadoryelfutbolistatienemetodosparaelpartido
deftbol:
VicenteDelBosque>Dirigeunpartido
AndresIniesta>Juegaunpartido

CONCLUSIONESYACLARACIONES:
Esto ha sido todo lo que hemos contado sobre la herencia en esta entrada. El tema de la
herenciaesuntemaquepuedeserunpocomscomplejodeloquelohemoscontadoaqu,yaque
solohemoscontadoloqueeslaherenciasimple(yaqueJavaporelmomentoeselnicotipode
herenciaquesoporta)ynolaherenciamltiple,queesuntipodeherenciaenlaqueunaclasehija
puedetenervariospadres,aunqueporelmomentosiestisempezandoaaprenderelconceptodela
herencia, con la herencia simple tenis ms que suficiente. Para los que os estis iniciando en el
mundodelaingenierainformtica,habrispodidoverquehemospuestounosejemplomostrando
unosdiagramasunpocorarospuesbien,estosdiagramassellamandiagramasdeclases(quelos
hemos realizado con la herramienta web dewww.genmymodel.com) y sirven para representar de
formagrficalosatributosymtodosdelasclasesylasrelacionesentreellos,utilizandoellenguaje
UMLdelcualintentaremoshablarmsadelanteenotrostutoriales.Porltimodeciryaclararqueen
estaentradaquizsnohemosutilizadounaterminologacorrectaparaexplicarlaherencia,perolo
hemosexplicadodeunaformaalgodistintaacomoestaexplicadaporahiparaquelosqueempeceis
podaisentenderlaherenciadesdeotropuntodevista.

data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 9/9