Académique Documents
Professionnel Documents
Culture Documents
Relacin de HERENCIA
Definicin
La herencia es una propiedad de la POO que permite que las clases hereden
los atributos y los mtodos de otras clases.
Notacin
Se representa con una lnea slida, que va desde una clase (llamada "HIJA")
haca otra clase, con un tringulo al final (llamada "PADRE")
Formas de lectura
Forma de implementacin
En Java se logra por medio de la palabra reservada "extends" y otorgndoles
una visibilidad de protected a los atributos y mtodos.
Ejemplo
Imaginemos que estamos realizando un programa informtico para un
colegio y necesitamos crear las clases Alumno y Profesor, en UML
podemos hacer lo siguiente:
Vemos que hay varios atributos y mtodos que se repiten, con ellos podemos
crear una tercera clase llamada Persona:
Esta clase Persona rene los atributos y mtodos comunes a las clases
Alumno y Profesor. Por ltimo slo falta agregar la relacin de HERENCIA
entre las clases:
De esta manera hacemos que la clase ALUMNO herede todos los mtodos
y atributos de la clase PERSONA, lo mismo para la clase PROFESOR.
Clase Persona.java
public class Persona{
protected String nombres;
protected String apellidos;
protected int edad;
public Persona(){
}
public String getNombres() {
return nombres;
}
public void setNombres(String nombres) {
this.nombres = nombres;
}
public String getApellidos() {
return apellidos;
}
public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}
public int getEdad() {
return edad;
}
public void setEdad(int edad) {
this.edad = edad;
}
}
Clase Alumno.java
public class Alumno extends Persona{
Clase Profesor.java
public class Profesor extends Persona{
private String dni;
public Profesor(){
}
public String getDni() {
return dni;
}
public void setDni(String dni) {
this.dni = dni;
}
}
Clase Programa.java
public class Programa{
public static void main(String[] args){
/*Creamos una alumno y un profesor*/
Alumno alumno = new Alumno();
Profesor profesor = new Profesor();
/*Les colocamos un nombre*/
alumno.setNombres("Juan Luis");
profesor.setNombres("Marco Aurelio");
/*Los mostramos en pantalla*/
System.out.println("Alumno: "+alumno.getNombres());
System.out.println("Profesor: "+profesor.getNombres());
/*Tambin es posible crear un objeto de la clase padre*/
Persona unaPersona = new Persona();
unaPersona.setNombres("Mark Twain");
System.out.println("Una persona: "+unaPersona.getNombres());
}
}
De esta manera podemos crear un alumno y un profesor para luego usar los
mtodos heredados desde la clase Persona. Tambin, si as lo quisiramos,
podemos crear un objeto de la clase Persona como si se tratase de una
clase cualquiera.
Clase Persona.java
public class Persona{
protected String nombres;
protected String apellidos;
protected int edad;
public Persona(){
}
public Persona(String nombres){
this.nombres = nombres;
}
public String getNombres() {
return nombres;
}
public void setNombres(String nombres) {
this.nombres = nombres;
}
public String getApellidos() {
return apellidos;
}
public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}
public int getEdad() {
return edad;
}
public void setEdad(int edad) {
this.edad = edad;
}
}
Clase Alumno.java
public class Alumno extends Persona{
private int grado;
public Alumno(){
}
Clase Profesor.java
public class Profesor extends Persona{
private String dni;
public Profesor(){
}
public Profesor(String nombres){
}
public String getDni() {
return dni;
}
public void setDni(String dni) {
this.dni = dni;
}
}
Clase Programa.java
public class Programa{
public static void main(String[] args){
/*Creamos una alumno y un profesor*/
Alumno alumno = new Alumno("Juan Luis");
Profesor profesor = new Profesor("Marco Aurelio");
Salida:
Alumno: null
Profesor: null
Gracias a la herencia es posible referenciar a las clases hijas con las clases
padres. Veamos el siguiente cdigo en Java que hace uso de las clases
Alumno, Profesor y Persona vistos antes:
Clase Programa.java
public class Programa{
public static void main(String[] args){
Persona persona = new Alumno();
persona.setNombres("Juan Pablo");
Alumno alumno = (Alumno) persona;
alumno.setGrado(3);
System.out.println("Nombre (desde persona): "+persona.getNombres());
System.out.println("Nombre (desde alumno): "+alumno.getNombres());
System.out.println("Grado: "+alumno.getGrado());
}
}
Vemos que una variable llamada persona que es del tipo Persona est
siendo instanciada como un tipo Alumno. Esto es posible porque la clase
padre de Alumno es Persona.
Hay que tener en cuenta que el casting que realicemos debe ser vlido. Por
ejemplo, lo siguiente producira un error:
Clase Programa.java
public class Programa{
public static void main(String[] args){
En todo caso, Java nos da una herramienta para averiguar la instancia con la
cual fue construido un objeto gracias a la palabra reservada instanceof:
Clase Programa.java
public class Programa{
public static void main(String[] args){
Persona persona = new Alumno();
persona.setNombres("Juan Pablo");
if(persona instanceof Alumno){
System.out.println("Se instanci como Alumno");
}else{
if(persona instanceof Profesor){
System.out.println("Se instanci como Profesor");
}
}
}
}
Jerarqua de herencia
Herencia mltiple
VehiculoTerrestre
VehiculoAcuatico
VehiculoAnfibio
Relacin de REALIZACIN
Definicin
La herencia es una relacin de la POO que permite definir el comportamiento
de una clase sin la necesidad de implementar los mtodos: define el qu,
no el cmo.
Notacin
Se representa con una lnea punteada, que va desde una clase haca una
interfaz, con un tringulo al final.
Interfaz
Clase
Formas de lectura
Forma de implementacin
En Java definimos una interfaz por medio de la palabra reservada interface,
y la implementamos en una clase por medio de la palabra reservada
implements.
Ejemplo
Supongamos que una fbrica especializada en la fabricacin de calculadoras
nos contrata para desarrollar su software. La fbrica produce calculadoras de
dos tipos: comunes y cientficas. Tambin nos dicen que las calculadoras
comunes pueden sumar, restar, multiplicar y dividir, mientras que las
cientficas adems de esas operaciones pueden obtener el seno, el coseno y
la tangente. Por ltimo nos informan que las calculadoras cientficas al
tratarse de aparatos usados para clculos avanzados deben implementar los
algoritmos de clculos de la forma ms eficiente posible.
Interfaz Calculadora.java
public interface Calculadora {
public
public
public
public
double
double
double
double
Clase CalculadoraComun.java
public class CalculadoraComun implements Calculadora{
public double sumar(double a, double b) {
System.out.println("Algoritmo comn de suma");
Clase CalculadoraCientifica.java
public class CalculadoraCientifica implements Calculadora{
/*Mtodos implementados*/
public double sumar(double a, double b) {
System.out.println("Algoritmo comn de suma");
return a+b;
}
public double restar(double a, double b) {
System.out.println("Algoritmo comn de resta");
return a-b;
}
public double multiplicar(double a, double b) {
System.out.println("Algoritmo comn de multiplicacin");
return a*b;
}
public double dividir(double a, double b) {
System.out.println("Algoritmo comn de divisin");
return a/b;
}
/*Mtodos propios*/
public double seno(double a){
return Math.sin(a);
}
public double coseno(double a){
return Math.cos(a);
}
Interfaz Dibujante.java
public interface Dibujante {
public void dibujarCuadrado();
public void dibujarCirculo();
public void dibujarRectangulo();
Clase DibujantePrincipiante.java
public class DibujantePrincipiante implements Dibujante{
public void dibujarCuadrado() {
System.out.println("Dibujando cuadrado");
}
public void dibujarCirculo() {
System.out.println("Dibujando circulo");
}
public void dibujarRectangulo() {
System.out.println("Dibujando rectangulo");
}
/*Este metodo tiene una implementacin vaca*/
public void dibujarFiguraHumana() {
}
}
Las interfaces
Una interfaz es una agrupacin de mtodos declarados ms no
implementados, que sirven para definir un conjunto de funcionalidades que
una clase debe implementar. Tambin debemos saber que los mtodos en
las interfaces siempre deben de tener una visibilidad del tipo public.
Recordar que una interfaz slo define el qu se hace, mas no el cmo se
hace.
Interfaz ExpertoEnNatacion.java
public interface ExpertoEnNatacion {
public void nadarEstiloLibre();
Interfaz ExpertoEnArtesMarciales.java
public interface ExpertoEnArtesMarciales {
public void darGolpeDePatada();
public void darGolpeDeMano();
public void darSaltoConPatada();
}
Clase Persona.java
public class Persona implements ExpertoEnNatacion, ExpertoEnArtesMarciales{
public void caminar(){
System.out.println("Caminando");
}
public void comer(){
System.out.println("Comiendo");
}
public void dormir(){
System.out.println("Durmiendo");
}
public void nadarEstiloLibre() {
System.out.println("Nadando estilo libre");
}
public void nadarEstiloEspalda() {
System.out.println("Nadando estilo espalda");
}
public void nadarEstiloBuceo() {
System.out.println("Nadando estilo buceo");
}
public void nadarEstiloMariposa() {
System.out.println("Nadando estilo mariposa");
}
public void darGolpeDePatada() {
System.out.println("Dando golpe de patada");
}
public void darGolpeDeMano() {
Clase Programa.java
public class Programa {
public static void main(String[] args){
/*Definimos una variable del tipo de la interfaz*/
Calculadora calculadora = null;
/*Instanciamos la interfaz con alguna de las clases que la
implementa*/
calculadora = new CalculadoraComun();
//calculadora = new CalculadoraCientifica();
/*Verificamos a qu instancia pertenece*/
if(calculadora instanceof CalculadoraComun){
System.out.println("La calculadora se cre como una comn");
}else{
if(calculadora instanceof CalculadoraCientifica){
System.out.println("La calculadora se cre como una
cientfica");
}
}
/*Llamamos a un mtodo*/
System.out.println(calculadora.sumar(1, 2));
}