Documente Academic
Documente Profesional
Documente Cultură
NOTA: en este diagrama y en adelante no vamos a poner los constructores y mtodos getter y setter con el fin de que el
diagrama nos quede grande e intendible aunque en un buen diagrama de clases deberan aparecer para respetar el
principio de encapsulacin de la POO
Como se puede observar, vemos que en las tres clases tenemos atributos y mtodos que
con iguales ya que los tres tienen los atributos id, Nombre, Apellidos y Edad; y los tres
tienen los mtodos de Viajar y Concentrarse:
public class
Futbolista
{
public class
Entrenador
{
private int
private int
id;
id;
private
String Nombre;
private
String Apellidos;
private int
Edad;
private int
dorsal;
private
String demarcacion;
private
String Nombre;
private
String Apellidos;
private int
Edad;
private
String idFederacion;
//
constructor, getter y
setter
public void
Concentrarse() {
...
}
public void
Viajar() {
//
constructor, getter y
setter
public void
Concentrarse() {
...
}
public void
Viajar() {
...
}
id;
private String
Nombre;
private String
Apellidos;
private int
Edad;
private String
Titulacion;
private int
aniosExperiencia;
//
constructor, getter y
setter
public void
Concentrarse() {
...
}
public void
Viajar() {
...
...
}
public void
jugarPartido() {
...
}
public void
entrenar() {
...
}
}
}
public void
dirigirPartido() {
...
}
public void
dirigirEntreno() {
...
}
}
public void
darMasaje() {
...
}
}
Lo que podemos ver en este punto es que estamos escribiendo mucho cdigo repetido
ya que las tres clases tienen mtodos y atributos comunes, de ahi y como veremos
enseguida, decimos que la herencia consiste en sacar factor comn para no escribir
cdigo de ms, por tanto lo que haremos sera crearnos una clase con el cdigo que es
comn a las tres clases (a esta clase se le denomina en la herencia como Clase
Padre o SuperClase) y el cdigo que es especifico de cada clase, lo dejaremos en
ella, siendo denominadas estas clases como Clases Hijas, las cuales heredan de la
clase padre todos los atributos y mtodos pblicos o protegidos. Es muy importante
decir que las clases hijas no van a heredar nunca los atributos y mtodos privados de
la clase padre, as que mucho cuidado con esto. En resumen para que veis la ventaja de
la herencia, tenemos ahora una clase padre con n lineas de cdigo y tres clases hijas
con a, b y c lineas de cdigos respectivamente, por tanto si hechis cuentas, 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 tenemos una clase ms, pero veremos un poco ms
adelante la ventaja de tener esa clase padre. En resumen, al sacar factor comn y
aplicar herencia, tenemos las siguientes clases:
public class
SeleccionFutbol
{
protected int
id;
protected
String Nombre;
protected
String Apellidos;
protected int
Edad;
// constructor,
getter y setter
public void
Concentrarse() {
...
}
public void
Viajar() {
...
}
}
Como podis observar ahora queda un cdigo mucho ms limpio, estructurado y con
menos lneas de cdigo, lo que lo hace ms legible, cosa que es muy importante y lo
que todava lo hace ms importante es que es un cdigo reutilizable, lo que significa
que ahora si queremos aadir ms clases a nuestra aplicacin como por ejemplo una
clase Mdico, Utiller@, Jefe/a de prensa etc. que pertenezcan tambin al equipo tcnico
de la seleccin Espaola, lo podemos hacer de forma muy sencilla ya que en la clase
padre (SeleccionFutbol) tenemos implementado parte de sus datos y de su
comportamiento y solo habr que implementar los atributos y mtodos propios de esa
clase. Empezis a ver la utilidad de la herencia?.
Ahora si os habis fijado bien en el cdigo que se ha escrito y sino habis tenido
experiencia con la herencia en Java, habris podido observar dos palabras reservadas
nuevas como son extends, protected y super. Pues bien, ahora vamos a
explicar el significado de ellas:
extends: Esta palabra reservada, indica a la clase hija cual va a ser su clase
padre, es decir 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 SeleccionFutbol o dicho de otra manera para que se
entienda mejor, al poner esto estamos haciendo un copy-paste 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 definicin que dimos
de que la herencia en un copy-paste dinmico.
protected: sirve para indicar un tipo de visibilidad de los atributos y mtodos de
Hasta aqu todo correcto, pero ahora vamos a ver como trabajamos con estas clases.
Para ver este funcionamiento de forma clara y sencilla vamos a trabajar con un objeto
de cada clase y vamos a ver como se crean y de que forma ejecutan sus mtodo. Para
ello empecemos mostrando el siguiente fragmento de cdigo:
Lo primero que vemos es que nos creamos un objeto de cada clase, pasndole los
atributos al constructor como parmetro y despus sorprendentemente los metemos
en un ArrayList de objetos de la clase SeleccionFutbol que es la clase padre. Esto
evidentemente te lo permite hacer ya que todos los objetos son hijos de la misma clase
padre. Luego como veis, recorremos el ArrayList y ejecutamos sus mtodos comunes
como son el Concentrarse y el Viajar. Este cdigo da como salida lo siguiente:
// ENTRENAMIENTO
System.out.println("nEntrenamiento: Solamente el entrenador y el
futbolista tiene metodos para entrenar:");
System.out.print(delBosque.getNombre()+" "+delBosque.getApellidos()+"
-> ");
delBosque.dirigirEntrenamiento();
System.out.print(iniesta.getNombre()+" "+iniesta.getApellidos()+" ->
");
iniesta.entrenar();
// MASAJE
System.out.println("nMasaje: Solo el masajista tiene el mtodo para
dar un masaje:");
System.out.print(raulMartinez.getNombre()+"
"+raulMartinez.getApellidos()+" -> ");
raulMartinez.darMasaje();
// PARTIDO DE FUTBOL
System.out.println("nPartido de Ftbol: Solamente el entrenador y el
futbolista tiene metodos para el partido de ftbol:");
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
hacen una funcin diferente en el mismo, por tanto hay que hacer mtodos diferente
para cada una de las clases. Ya veremos cuando hablemos del polimorfismo que
podremos ejecutar el mismo mtodo para clases diferentes y que esos mtodos hagan
cosas distintas. Como resultado al cdigo mostrado tenemos lo siguiente:
CONCLUSIONES Y ACLARACIONES:
Esto ha sido todo lo que hemos contado sobre la herencia en esta entrada. El tema de la
herencia es un tema que puede ser un poco ms complejo de lo que lo hemos contado
aqu, ya que solo hemos contado lo que es la herencia simple (ya que Java por el
Artculos Relacionados
Herencia en Java, con ejemplos por "www.jarroba.com" esta bajo una licencia Creative
Commons
Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.
Creado a partir de la obra en www.jarroba.com
1.
Diego Jose
o
11/01/2015 a las 18:01
Hola
Diego.
Para hacer los diagramas de clase (en esta entrada) he utilizado esta
web https://api.genmymodel.com que te permite crear algunos diagramas con UML.
SL2
RESPONDER
2.
xxxx
que lastima ivan bien, ..hasta que encontr los puntos suspensivos, y por ejemplo
getNombre no lo encontr por ningn lado.
RESPONDER
alias
o
29/12/2014 a las 19:18
Es
que
public
return
}
no
los
ponen
pero
String
van
public
String
return
}
Tienes que hacer los mtodos.
as
en
getApellidos()
la
clase
padre:
getNombre(){
this.Nombre;
{
this.Apellidos;
RESPONDER
o
30/12/2014 a las 19:42
Gracias
Alias.
Los getter y setter, de establecimiento u obtencin de valores de las variables globales,
se han obviado para que el artculo no quedara muy denso, y fuera sencillo de
entender
RESPONDER
3.
alfredo
Tengo una duda, si yo quisiera dentro de la clase hija llamar un metodo de otra clase y
ese metodo requiera el objeto herdado, de que forma podria solucionar eso.
EJemplo.
public clase1 extends clase2{
clase3
objeto=
new
clase3();
objeto.metodo1( aqui necesito enviarle el objeto heredado, es decir el objeto de tipo
clase2);
}
cabe aclarar que debe ser ese objeto. no me sirve instanciar uno nuevo. debe ser ese con
la informacion que se ha modificado en esa instancia..
por otro lado muy buena entrada, muchas gracias por compartir el conocimiento y
quisiera me pudieran responder.
Gracias
Saludos.
nuevamente.
RESPONDER
o
08/12/2014 a las 16:31
Hola Alfredo,
creo
que
te
servir
la
inferencia
tipos: https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html
de
RESPONDER
4.
Eduardo
Buenas me parece muy interesante el tutorialpero hay dos cosas que no he visto o
faltan:
1 Como es que en el for utilizas otra variable integrante ? con integrantes ya puedes
recorrer el arraylist no ? No veo la necesidad de utilizar otra variable.
2 en integrante.viajar o integrante.concentrarse tendrias que poner un print en la
definicion de cada accion no para que salga el mensaje de pantalla ?
3 No entiendo muy bien a que viene partido de futbol, no es clase ni superclase. no
habeis explicado para que se pone.
Espero ayudar a otros que tengan las mismas dudas o parecidas. Gran trabajo
Saludos
RESPONDER
5.
Ronald
Hola..!!
Excelente
explicacin.
Una pregunta la clase Futbolista tambin hereda el Id de la clase padre.?
Es decir al momento de guardar los datos en una base de datos, el Id llave primaria de la
clase
padre,
pasara
como llave fornea a la clase hija?, o tengo que crear una llave primaria para la clase
hija?
Muchas gracias.
RESPONDER
o
03/09/2014 a las 08:24
Hola
Ronald.
En la herencia se heredan todos los atributos de la clase padre, as que el id tambin lo
hereda.
Otra cosa es que te plantees (en una base de datos), meter todas las clases que heredan
de una misma clase padre en una misma tabla o en tablas diferentes. Eso ya es un tema
diferente, pero te aconsejaria que lo hicieses en tablas diferentes, salvo que utilizases
bases de datos como MongoDB que lo podrias meter todo en una misma coleccin.
Cualquier otra duda nos dices.
SL2
RESPONDER
6.
angel
diego
o
10/11/2014 a las 21:04
7.
Jazz
8.
Julin
Ser que me puede responder esta pregunta?; Puede un objeto heredar atributos y
mtodos de mas de un objeto padre? Que cualidad sustenta o impide esta posibilidad?
RESPONDER
o
15/07/2014 a las 10:48
Hola
Julin.
Eso que comentas se llama herencia mltiple y hasta la fecha Java no soporta herencia
mltiple. Hay otros lenguajes como C++ que si tienen herencia mltiple pero si te soy
sincero hasta la fecha no he hecho nada con herencia mltiple, aunque sabiendo bien el
concepto
de
herencia
seria
fcil
aplicarla.
SL2
RESPONDER
9.
Jorge
Tengo
una
duda
respecto
a
la
palabra
reservada
protected.
S que de esta manera, todos aquellos atributos de una clase que vienen precedidos del
modificador protected sern visibles desde todas las clases hijas de la clase abstracta
donde
se
declara
ese
atributo
protected.
As pues si en la clase Empleado definimos:
public
{
protected
.
}
abstract
class
int
.
Empleado
sueldo;
.
entonces desde la clase Ejecutivo (que extiende de Empleado) se puede acceder al dato
miembro sueldo, mientras que si se declara private no.
As pues de qu me sirve poner protected, si la puedo poner private y acceder a ella
mediante getters y setters???
RESPONDER
o
10/07/2014 a las 20:27
Hola Jorge,
cualquier clase, herede de algo o no, que tenga variables globales privadas no podrn ser
accedidas desde ningn sitio que no sea desde dentro de su clase, por lo que si quieres
acceder
a
stas
requieres
poner
unos
getters
y
setters.
La diferencia de poner getter o setter o poner las variables pblicas (o protected si son
heredadas) es la seguridad del objeto y por convencin de los programadores.
Un ejemplo de seguridad del objeto sera que si tienes una variable global como:
public
int
noNumeroCero
=
1;
Y por cualquier cosa requieres que nunca sea cero (por ejemplo, porque vayas a usar la
variable como divisor; sabemos que dividir entre cero da error), si pueden acceder desde
fuera directamente al ser pblica, podrn ponerte un cero y el programa fallar. Si
ponemos getter o setter podemos hacer la comprobacin en el propio
setNoNumeroCero(). Evidentemente, dependiendo de la lgica del programa, se podra
hacer la comprobacin antes de usar la variable.
Principalmente los getter y setter son por convencin, para si por ejemplo, yo te pasara
una clase, t sin tener que mirar mucho ms que los getter y setter supieras como usar la
clase.
RESPONDER
Jorge
La seguridad puede implicar no tocar las variables globales con un private y no poner
setter, esto lo que hace es que nadie fuera de la clase la pueda tocar. Con seguridad me
refiero a que no se admita cualquier valor en la variable y haya que controlar la entrada
del valor (lo que te deca en el ejemplo anterior de no permitir el cero).
De todas maneras, por norma pon siempre los getter y setter (El nico que se salva es si
programas en Android; en donde est desaconsejado el uso de getter o setter para ahorro
de tiempo de proceso, batera, etc; es la nica excepcin y an as, muchos
programadores los siguen usando).
RESPONDER
Jorge
10.
Andres
Hola
gracias
por
los
tutoriales
me
parecen
muy
buenos.
Una pregunta, por que existen dos constructores en cada una de las clases? No entiendo
por
que
uno
esta
vacio
y
el
otro
no.
Gracias!
RESPONDER
o
08/07/2014 a las 14:46
Hola
Andrs.
En este caso he puesto dos constructores uno sin atributos y otro con atributos para
poder inicializar el objeto con el propio constructor sin necesidad de crearme un objeto
y luego tener que ir llamando a cada uno de los mtodos setter para asignar un valor a
los atributos, es simplemente por eso por lo que he hecho dos constructores para escribir
algo
menos
de
cdigo
en
definitiva.
SL2
RESPONDER
Andres
Ahh
ya
entiendo,
muchas
gracias.
Los felicito por su blog hay muchas cosas en Java que me parecen excelentes.
Gracias.
RESPONDER
11.
Javier
12.
Dunkelheit
Hola, su Web y explicaciones me parecen de lo mejor. Las explicaciones son claras para
personas que empiezan en el mundo de la informtica, porque no son explicaciones con
mucho lenguaje tcnico.
RESPONDER
Dejanos tu comentario
NOMBRE: OBLIGATORIO
WEB O BLOG:
COMENTARIO:
Enviar Comentario
www.jarroba.com 2015
By Reimon & Richard