Herencia en Java, Con Ejemplos - Jarroba

9
Herencia en Java, con ejemplos El proyecto de este post lo puedes descargar pulsando AQUI. La Herencia es uno de los 4 pilares de la programación orientada a objetos (POO) junto con la Abstracción, Encapsulación yPolimorfismo. Al principio cuesta un poco entender estos conceptos característicos del paradigma de la POO porque solemos venir de otro paradigma de programación como el paradigma de la programación estructurada (ver la entrada”Paradigmas de Programación), pero se ha de decir que la complejidad está en entender este nuevo paradigma y no en otra cosa. En esta entrada vamos a explicar de la mejor manera posible que es la herencia y lo vamos a explicar con un ejemplo. Respecto a la herencia se han dado muchas definiciones como por ejemplo la siguiente: “La herencia es un mecanismo que permite la definición de una clase a partir de la definición de otra ya existente. La herencia permite compartir automáticamente métodos y datos entre clases, subclases y objetos.“. Así de primeras esta definición es un poco difícil de digerir para aquellos que estéis empezando con la POO, así que vamos a intentar digerir esta definición con un ejemplo en el que veremos que la herencia no es más que un “CopyPaste Dinámico” o una forma de “sacar factor común” al código que escribimos. El ejemplo que proponemos es un caso en el que vamos a simular el comportamiento que tendrían los diferentes integrantes de la selección española de futbol; tanto los Futbolistas como el cuerpo técnico (Entrenadores, Masajistas, etc…). Para simular este comportamiento vamos a definir tres clases que van a representaran a objetos Futbolista, Entrenador y Masajista. De cada unos de ellos vamos a necesitar algunos datos que reflejaremos en los atributos y una serie de acciones que reflejaremos en sus métodos. Estos atributos y métodos los mostramos en el siguiente diagrama de clases:

description

Herencia en Java

Transcript of Herencia en Java, Con Ejemplos - Jarroba

  • 22/3/2015 HerenciaenJava,conejemplosJarroba

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

    HerenciaenJava,conejemplos

    ElproyectodeestepostlopuedesdescargarpulsandoAQUI.

    LaHerenciaesunodelos4pilaresdelaprogramacinorientadaaobjetos(POO)juntoconla Abstraccin, Encapsulacin yPolimorfismo. Al principio cuesta un poco entender estosconceptos caractersticos del paradigma de la POO porque solemos venir de otro paradigma deprogramacin comoel paradigmade la programacinestructurada (ver la entradaParadigmas deProgramacin),perosehadedecirquelacomplejidadestenentenderestenuevoparadigmaynoenotracosa.Enestaentradavamosaexplicardelamejormaneraposiblequeeslaherenciaylovamosaexplicarconunejemplo.

    Respectoalaherenciasehandadomuchasdefinicionescomoporejemplolasiguiente:Laherenciaesunmecanismoquepermiteladefinicindeunaclaseapartirdeladefinicindeotrayaexistente.Laherenciapermitecompartirautomticamentemtodosydatosentreclases,subclasesyobjetos.. As de primeras esta definicin es un poco difcil de digerir para aquellos que estisempezandoconlaPOO,asquevamosa intentardigerirestadefinicinconunejemploenelqueveremosquelaherencianoesmsqueunCopyPasteDinmicoounaformadesacar factorcomnalcdigoqueescribimos.

    Elejemploqueproponemosesuncasoenelquevamosasimularelcomportamientoquetendranlosdiferentesintegrantesdelaseleccinespaoladefutbol tantolosFutbolistascomoelcuerpotcnico(Entrenadores,Masajistas,etc).ParasimularestecomportamientovamosadefinirtresclasesquevanarepresentaranaobjetosFutbolista,EntrenadoryMasajista.Decadaunosdeellosvamosanecesitaralgunosdatosquereflejaremosen losatributos yunaseriedeaccionesque reflejaremos en sus mtodos. Estos atributos y mtodos los mostramos en el siguientediagramadeclases:

  • 22/3/2015 HerenciaenJava,conejemplosJarroba

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

    NOTA:enestediagramayenadelantenovamosaponerlosconstructoresymtodosgetterysetterconelfindequeeldiagramanosquedegrandeeintendibleaunqueenunbuendiagramadeclasesdeberanaparecerpararespetarelprincipiodeencapsulacindelaPOO

    Comosepuedeobservar,vemosqueen las tresclasestenemosatributosymtodosquecon igualesyaque lostrestienen losatributosid,Nombre,ApellidosyEdad y los tres tienen losmtodosdeViajaryConcentrarse:

    Aniveldecdigotenemoslosiguientetrasvereldiagramadeclases:

    publicclassFutbolista{

    privateintid; privateStringNombre; privateStringApellidos; privateintEdad; privateintdorsal; privateStringdemarcacion;

    //constructor,getterysetter

    publicvoidConcentrarse()

    publicclassEntrenador{

    privateintid; privateStringNombre; privateStringApellidos; privateintEdad; privateStringidFederacion;

    //constructor,getterysetter

    publicvoidConcentrarse(){

    publicclassMasajista{

    privateintid; privateStringNombre; privateStringApellidos; privateintEdad; privateStringTitulacion; privateintaniosExperiencia;

    //constructor,getterysetter

    publicvoidConcentrarse(){

  • 22/3/2015 HerenciaenJava,conejemplosJarroba

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

    { ... }

    publicvoidViajar(){ ... }

    publicvoidjugarPartido(){ ... }

    publicvoidentrenar(){ ... }}

    ... }

    publicvoidViajar(){ ... }

    publicvoiddirigirPartido(){ ... }

    publicvoiddirigirEntreno(){ ... }}

    ... }

    publicvoidViajar(){ ... }

    publicvoiddarMasaje(){ ... }}

    Loquepodemosverenestepuntoesqueestamosescribiendomuchocdigorepetidoyaquelastresclasestienenmtodosyatributoscomunes,deahiycomoveremosenseguida,decimosquelaherenciaconsisteensacarfactorcomnparanoescribircdigodems,portantoloqueharemosseracrearnosunaclaseconelcdigoqueescomnalastresclases(aestaclasese le denomina en la herencia como Clase Padre o SuperClase) y el cdigo que esespecificodecadaclase,lodejaremosenella,siendodenominadasestasclasescomoClasesHijas, las cuales heredan de la clase padre todos los atributos y mtodos pblicos oprotegidos.Esmuyimportantedecirquelasclaseshijasnovanaheredarnuncalosatributosymtodosprivadosdelaclasepadre,asquemuchocuidadoconesto.Enresumenparaqueveislaventajadelaherencia,tenemosahoraunaclasepadreconnlineasdecdigoytresclaseshijascona, by c lineasdecdigosrespectivamente,portantosihechiscuentas,hemosreducidonuestro cdigo en 2n lneas menos ya que antes tenamos (n+a)+(n+b)+(n+c) lneas decdigoyahora trasaplicarherencia tenemos n+a+b+c lneas,aunque tambinesciertoquetenemosunaclasems,peroveremosunpocomsadelantelaventajadeteneresaclasepadre.Enresumen,alsacarfactorcomnyaplicarherencia,tenemoslassiguientesclases:

  • 22/3/2015 HerenciaenJava,conejemplosJarroba

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

    Aniveldecdigo,lasclasesquedaranimplementadasdelasiguienteforma:

    publicclassSeleccionFutbol{

    protectedintid; protectedStringNombre; protectedStringApellidos; protectedintEdad;

    //constructor,getterysetter

    publicvoidConcentrarse(){ ...

  • 22/3/2015 HerenciaenJava,conejemplosJarroba

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

    }

    publicvoidViajar(){ ... }}

    publicclassFutbolistaextendsSeleccionFutbol{ privateintdorsal; privateStringdemarcacion;

    publicFutbolista(){ super(); }

    //getterysetter

    publicvoidjugarPartido(){ ... }

    publicvoidentrenar(){ ... }}

    publicclassEntrenadorextendsSeleccionFutbol{

    privateStringidFederacion;

    publicEntrenador(){ super(); }

    //getterysetter

    publicvoiddirigirPartido(){ ... }

    publicvoiddirigirEntreno(){ ... }}

    publicclassMasajistaextendsSeleccionFutbol{

    privateStringTitulacion; privateintaniosExperiencia;

    publicMasajista(){ super(); }

    //getterysetter

    publicvoiddarMasaje(){ ... }}

    Comopodis observar ahora queda uncdigomuchoms limpio, estructurado y conmenoslneasdecdigo,loquelohacemslegible,cosaqueesmuyimportanteyloquetodavalohacems importanteesqueesuncdigoreutilizable, loquesignificaqueahorasiqueremosaadir ms clases a nuestra aplicacin como por ejemplo una claseMdico, Utiller@, Jefe/a deprensaetc.quepertenezcantambinalequipotcnicodelaseleccinEspaola,lopodemoshacerdeformamuysencillayaqueen laclasepadre(SeleccionFutbol) tenemos implementadopartedesusdatosydesucomportamientoysolohabrqueimplementarlosatributosymtodospropiosde

  • 22/3/2015 HerenciaenJava,conejemplosJarroba

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

    esaclase.Empezisaverlautilidaddelaherencia?.

    Ahorasioshabisfijadobienenelcdigoquesehaescritoysinohabistenidoexperienciacon la herencia en Java, habris podido observar dos palabras reservadas nuevas como sonextends,protectedysuper.Puesbien,ahoravamosaexplicarelsignificadodeellas:

    extends:Estapalabrareservada,indicaalaclasehijacualvaasersuclasepadre,esdecirque por ejemplo en la clase Futbolista al poner public class Futbolista extendsSeleccionFutbol leestamos indicandoa laclase Futbolistaquesuclasepadrees laclaseSeleccionFutbolodichodeotramaneraparaqueseentiendamejor,alponerestoestamoshaciendoun copypastedinmicodiciendoa laclase Futbolistaquese copie todos losatributos ymtodos pblicos o protegidos de la clase SeleccionFutbol. De aqu viene esadefinicinquedimosdequelaherenciaenuncopypastedinmico.protected:sirveparaindicaruntipodevisibilidaddelosatributosymtodosdelaclasepadrey significa que cuando un atributo es protected o protegido, solo es visible ese atributo omtododesdeunadelasclaseshijasynodesdeotraclase.super: sirve para llamar al constructor de la clase padre. Quizs en el cdigo que hemospuestonosehavistomuybien,peroacontinuacinlomostramosdeformasmsclara,viendoelconstructordelosobjetospasndolelosatributos:

    publicclassSeleccionFutbol{

    ......

    publicSeleccionFutbol(){ }

    publicSeleccionFutbol(intid,Stringnombre,Stringapellidos,intedad){ this.id=id; this.Nombre=nombre; this.Apellidos=apellidos; this.Edad=edad; } ......

    publicclassFutbolistaextendsSeleccionFutbol{ ...... publicFutbolista(){ super(); }

    publicFutbolista(intid,Stringnombre,Stringapellidos,intedad,intdorsal,Stringdemarcacion){ super(id,nombre,apellidos,edad); this.dorsal=dorsal; this.demarcacion=demarcacion; } ......

  • 22/3/2015 HerenciaenJava,conejemplosJarroba

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

    Hastaaqutodocorrecto,peroahoravamosavercomotrabajamosconestasclases.Paravereste funcionamientode formaclaraysencillavamosa trabajarconunobjetodecadaclaseyvamosavercomosecreanydequeformaejecutansusmtodo.Paraelloempecemosmostrandoelsiguientefragmentodecdigo:

    publicclassMain{

    //ArrayListdeobjetosSeleccionFutbol.Idenpendientementedelaclasehijaalaquepertenezcaelobjeto publicstaticArrayListintegrantes=newArrayList();

    publicstaticvoidmain(String[]args){

    EntrenadordelBosque=newEntrenador(1,"Vicente","DelBosque",60,"284EZ89"); Futbolistainiesta=newFutbolista(2,"Andres","Iniesta",29,6,"InteriorDerecho"); MasajistaraulMartinez=newMasajista(3,"Ral","Martinez",41,"LicenciadoenFisioterapia",18);

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

    //CONCENTRACION System.out.println("Todoslosintegrantescomienzanunaconcentracion.(Todosejecutanelmismomtodo)"); for(SeleccionFutbolintegrante:integrantes){ System.out.print(integrante.getNombre()+""+integrante.getApellidos()+">"); integrante.Concentrarse(); }

    //VIAJE System.out.println("nTodoslosintegrantesviajanparajugarunpartido.(Todosejecutanelmismomtodo)"); for(SeleccionFutbolintegrante:integrantes){ System.out.print(integrante.getNombre()+""+integrante.getApellidos()+">"); integrante.Viajar(); } ......

    Loprimeroquevemosesquenoscreamosunobjetodecadaclase,pasndolelosatributosalconstructorcomoparmetroydespussorprendentementelosmetemosenunArrayListdeobjetosde la clase SeleccionFutbolque es la clase padre.Esto evidentemente te lo permitehaceryaquetodoslosobjetossonhijosdelamismaclasepadre.Luegocomoveis,recorremosel

  • 22/3/2015 HerenciaenJava,conejemplosJarroba

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

    ArrayListyejecutamossusmtodoscomunescomosonelConcentrarseyelViajar.Estecdigodacomosalidalosiguiente:

    Todoslosintegrantescomienzanunaconcentracion.(Todosejecutanelmismomtodo)VicenteDelBosque>ConcentrarseAndresIniesta>ConcentrarseRalMartinez>Concentrarse

    Todoslosintegrantesviajanparajugarunpartido.(Todosejecutanelmismomtodo)VicenteDelBosque>ViajarAndresIniesta>ViajarRalMartinez>Viajar

    Comoveisalejecutar todoselmismomtodode laclasepadreelcdigopuesto funcionacorrectamente.

    Posteriormentevamosaejecutarcdigoespecificodelasclaseshijas,deahiqueahoranopodamosrecorrerelArrayListyejecutarelmismomtodoparatodoslosobjetosyaqueahoraesosobjetossonnicosdelaclaseshijas.Elcdigoeselsiguiente:

    //ENTRENAMIENTOSystem.out.println("nEntrenamiento:Solamenteelentrenadoryelfutbolistatienemetodosparaentrenar:");System.out.print(delBosque.getNombre()+""+delBosque.getApellidos()+">");delBosque.dirigirEntrenamiento();System.out.print(iniesta.getNombre()+""+iniesta.getApellidos()+">");iniesta.entrenar();

    //MASAJESystem.out.println("nMasaje:Soloelmasajistatieneelmtodoparadarunmasaje:");System.out.print(raulMartinez.getNombre()+""+raulMartinez.getApellidos()+">");raulMartinez.darMasaje();

    //PARTIDODEFUTBOLSystem.out.println("nPartidodeFtbol:Solamenteelentrenadoryelfutbolistatienemetodosparaelpartidodeftbol:");System.out.print(delBosque.getNombre()+""+delBosque.getApellidos()+">");delBosque.dirigirPartido();System.out.print(iniesta.getNombre()+""+iniesta.getApellidos()+">");iniesta.jugarPartido();

    Como vemos aunque el entrenador y los futbolistas asistan a un entrenamiento, los dos

  • 22/3/2015 HerenciaenJava,conejemplosJarroba

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

    hacenunafuncindiferenteenelmismo,portantohayquehacermtodosdiferenteparacadaunade las clases. Ya veremos cuando hablemos del polimorfismo que podremos ejecutar el mismomtodoparaclasesdiferentesyqueesosmtodoshagancosasdistintas.Comoresultadoalcdigomostradotenemoslosiguiente:

    Entrenamiento:Solamenteelentrenadoryelfutbolistatienemetodosparaentrenar:VicenteDelBosque>DirigeunentrenamientoAndresIniesta>Entrena

    Masaje:Soloelmasajistatieneelmtodoparadarunmasaje:RalMartinez>Daunmasaje

    PartidodeFtbol:Solamenteelentrenadoryelfutbolistatienemetodosparaelpartidodeftbol:VicenteDelBosque>DirigeunpartidoAndresIniesta>Juegaunpartido

    CONCLUSIONESYACLARACIONES:Estohasido todo loquehemoscontadosobre laherenciaenestaentrada.El temade la

    herenciaesuntemaquepuedeserunpocomscomplejodeloquelohemoscontadoaqu,yaquesolohemoscontadoloqueeslaherenciasimple(yaqueJavaporelmomentoeselnicotipodeherenciaquesoporta)ynolaherenciamltiple,queesuntipodeherenciaenlaqueunaclasehijapuedetenervariospadres,aunqueporelmomentosiestisempezandoaaprenderelconceptodelaherencia,con laherenciasimple tenismsquesuficiente.Para losqueosestis iniciandoenelmundode la ingeniera informtica,habrispodidoverquehemospuestounosejemplomostrandounosdiagramasunpocorarospuesbien,estosdiagramassellamandiagramasdeclases(queloshemos realizado con la herramienta web dewww.genmymodel.com) y sirven para representar deformagrficalosatributosymtodosdelasclasesylasrelacionesentreellos,utilizandoellenguajeUMLdelcualintentaremoshablarmsadelanteenotrostutoriales.Porltimodeciryaclararqueenestaentradaquizsnohemosutilizadounaterminologacorrectaparaexplicarlaherencia,perolohemosexplicadodeunaformaalgodistintaacomoestaexplicadaporahiparaquelosqueempeceispodaisentenderlaherenciadesdeotropuntodevista.