Sei sulla pagina 1di 7

POO en Java

Relaciones de composicin y
Herencia

Caractersticas:

Composicin tiene un
Herencia es un
Polimorfismo.
Abstraccin.
Clases y objetos.

Java

Arrays y Cadenas

Java

Composicin

Composicin: clase Crculo

public class
class Punto
Punto {{
public
int xx;;
int
int yy;;
int
public Punto(
Punto(int
int x,
x, int
int y)
y) {{
public
this.x
.x == x;
x;
this
this
.y
=
y;
this .y = y;
}}
public Punto()
Punto() {{
public
// llamada
llamada al
al otro
otro constructor
constructor
//
this(-1,
(-1, --1);
1); }}
this
public
void
mostrar(){
public void mostrar(){
System.out.println(x == ++ xx +
+ yy == ++ y);
y); }}
System.out.println(x
public static
static void
void main
main(String
(String args[])
args[]) {{
public
Punto pun1
pun1 == new
new Punto();
Punto();
Punto
Punto pun2
pun2 == new
new Punto(2,3);
Punto(2,3);
Punto
System.out.println( "visualizar
"visualizar datos
datos del
del punto"
punto" );
);
System.out.println(
pun1.mostrar();
pun1.mostrar();
pun2.mostrar();}}
pun2.mostrar();}}
Java

Arrays y Cadenas

Arrays y Cadenas

public class
class Circulo
Circulo {{
public
Punto origen;
origen;
Punto
int radio;
radio;
int
public Circulo(int
Circulo(int x,
x, int
int y,
y, int
int radio)
radio) {{
public
origen == new
new Punto(x,y);
Punto(x,y);
origen
this.radio
.radio == radio;
radio;
this
}}
public void
void mostrar()
mostrar() {{
public
origen.mostrar();
origen.mostrar();
System.out.println("radio == "" ++ radio);
radio);
System.out.println("radio
}}
public static
static void
void main(
main(String
String args[])
args[]) {{
public
Circulo cir
cir == new
new Circulo(5,
Circulo(5, 5,
5, 9);
9);
Circulo
System.out.println( "visualizar
"visualizar datos
datos del
del circulo"
circulo" );
);
System.out.println(
cir.mostrar();
}}
cir.mostrar();
}}

Java

Arrays y Cadenas

Herencia: La palabra
reservada extends

Tipos de programacin

Cuando se crea un modelo de algo y luego se quiere


una versin ms actualizada:

encapsulacin

public class Empleado


{
String nombre;
Date anionac;
String puesto;
int categora;

Basado en
objetos

+ clases

Basado en
clases

+ herencia

...

Orientado a
Objetos

public class jefe


{
String nombre;
datos duplicados!
Date anionac;
String puesto;
int categora;
String departamento;
Empleado [] subordinados;

}
...
}

Java

Arrays y Cadenas

Java

Arrays y Cadenas

Herencia: La palabra
reservada extends

Herencia: La palabra
reservada extends

Se puede definir una clase a partir de otra definida


previamente.

La clase Jefe para tener todas las variables y


mtodos de la clase Empleado no tiene que
definirlos, los hereda de la clase padre.

public class Empleado {

Todo lo que se tiene que definir despus son


las caractersticas adicionales y especificar los
cambios que se quieren aplicar.

String nombre;
Date anionac;
String puesto;
int categora; }
public class Jefe extends Empleado {
String departamento;
Arrays y Cadenas}
Empleado [ ] Java
subordinados;

Ejemplo de Herencia

Cuando una clase hereda slo de otra clase,


se llama herencia simple.
Herencia simple hace que el cdigo sea
reutilizable.

Mamfero

Primate

Java proporciona las interfaces que


proporcionan las ventajas de la herencia
mltiple y no presentan sus inconvenientes.

Canino

Chimpance

Java

Perro

Lobo

Arrays y Cadenas

Los constructores no se
heredan

Java

public class
class Persona
Persona {{
public
String nombre
nombre == "";
"";
String
int edad;
edad;
int

10

Persona

public Persona(String
Persona(String nom
nom,, int
int ed)
ed) {{
public
nombre == nom;
nom;
nombre
edad
=
ed;
edad = ed;
}}

Una clase no hereda los constructores de la


superclase.

Trabajador

public void
void mostrar()
mostrar() {{
public
System.out.println("Nombre: "+
"+ nombre);
nombre);
System.out.println("Nombre:
System.out.println("Edad:
"+ edad);
edad);
System.out.println("Edad: "+
}}
public static
static void
void main(String
main(String args[])
args[]) {{
public
Persona yo=
yo= new
new Persona(Luis",
Persona(Luis", 32);
32);
Persona
yo.mostrar();
yo.mostrar();
}
}

Slo hay dos formas de que una clase tenga


constructor:
Utilizar el constructor por defecto.
Escribir uno o ms constructores explcitos.
Arrays y Cadenas

Arrays y Cadenas

Herencia: clase Persona

Una subclase hereda de una superclase (la


clase padre), todos los mtodos y las
variables.

Java

Herencia simple

Animal

Gorila

Es una buena manera de generar cdigo fcil


de mantener y de actualizar. Las
modificaciones sobre la clase Empleado
repercuten sobre la clase Jefe nicamente
compilando.
Java
Arrays y Cadenas

11

}}

Java

Arrays y Cadenas

12

Herencia: clase Trabajador

Herencia: constructores

public class
class Trabajador
Trabajador extends
extends Persona
Persona {{
public
float sueldoHora;
sueldoHora;
float
int numHoras
numHoras;;
int

Persona
Persona

public Trabajador(
Trabajador(String
String nom,
nom, int
int ed
ed,, float
float suel,
suel, int
int num)
num) {{
public
super(nom,
(nom, ed);
ed); //
// llamada
llamada al
al constructor
constructor de
de Persona
Persona
super
sueldoHora == suel
suel;;
sueldoHora
numHoras == num
num;}
;}
numHoras

Trabajador
Trabajador

public double
double sueldo()
sueldo() {{
public
return sueldoHora
sueldoHora ** numHoras;
numHoras; }}
return
public static
static void
void main(
main(String
String args[])
args[]) {{
public
Trabajador yo=
yo= new
new Trabajador(Luis",
Trabajador(Luis", 32,
32, 200.5f,
200.5f, 45);
45);
Trabajador
yo.mostrar(); //
// se
se invoca
invoca al
al metodo
metodo heredado
heredado mostrar
mostrar
yo.mostrar();
double pelas
pelas == yo.sueldo();
yo.sueldo();
double
System.out.println("Cobra:
println("Cobra: "" ++ euros);
euros);
System.out.
}}
Java
Arrays y Cadenas
}}

Bedel
Bedel
13

Reescritura de un mtodo
n

Arrays y Cadenas

Arrays y Cadenas

14

Ejemplo

La signatura de un mtodo viene dada por su


nombre y el tipo y nmero de los parmetros
w El tipo devuelto no forma parte de la signatura
Cuando se reescribe un mtodo en una clase
derivada
w La signatura debe ser la misma que el mtodo
de la clase base
w El tipo devuelto debe ser el mismo que el del
mtodo de la clase base
w El atributo de acceso del mtodo de la clase
derivada tiene que ser igual o mas general que
el de la clase base (NO puede ser mas
restrictivo)
Java

Java

//En Persona
Persona redefinimos
redefinimos el
el mtodo
mtodo mostrar()
mostrar()
//En
public class
class Trabajador
Trabajador extends
extends Persona
Persona {{
public
float sueldoHora;
sueldoHora;
float
int numHoras;
numHoras;
int
public Trabajador(String
Trabajador(String nom,
nom, int
int ed,
ed, float
float suel,
suel, int
int num)
num) {{
public
super(nom, ed);
ed); //
// llamada
llamada al
al constructor
constructor de
de Persona
Persona
super(nom,
sueldoHora == suel;
suel;
sueldoHora
numHoras == num;}
num;}
numHoras
// sobrecarga
sobrecarga completa
completa de
de mostrar
mostrar
//
//
nombre
y
edad
son
atributos heredados
heredados de
de Persona
Persona
// nombre y edad son atributos
public void
void mostrar()
mostrar() {{
public
System.out.println("Nombre: "+
"+ nombre);
nombre);
System.out.println("Nombre:
System.out.println("Edad: "+
"+ edad);
edad);
System.out.println("Edad:
System.out.println("Sueldo por
por hora:
hora: "+
"+ sueldoHora);
sueldoHora);
System.out.println("Sueldo
System.out.println("Horas trabajadas:
trabajadas: "+
"+ numHoras);}}
numHoras);}}
System.out.println("Horas

15

Sobrecarga de mtodo

Java

Arrays y Cadenas

16

Sobrecarga de mtodo

Sobrecarga parcial ampliando el mtodo


heredado

public class
class Trabajador
Trabajador extends
extends Persona
Persona {{
public
float sueldoHora
sueldoHora;;
float
int numHoras;
numHoras;
int
public Trabajador(String
Trabajador(String nom
nom,, int
int ed,
ed, float
float suel,
suel, int
int
public
num) {{
num)

w El mtodo de la subclase puede llamar al

super(nom, ed
ed);
); //
// llamada
llamada al
al constructor
constructor de
de Persona
Persona
super(nom,
sueldoHora == suel;
suel;
sueldoHora
numHoras == num;}
num;}
numHoras
// sobrecarga
sobrecarga parcial
parcial de
de mostrar
mostrar
//
// nombre
nombre yy edad
edad son
son atributos
atributos heredados
heredados de
de Persona
Persona
//
public
void
mostrar()
{
public void mostrar() {
super.mostrar(); //llamada
//llamada al
al mtodo
mtodo de
de la
la clase
clase padre
padre
super.mostrar();
System.out.println("Sueldo por
por hora:
hora: "+
"+ sueldoHora
sueldoHora);
);
System.out.println("Sueldo
System.out.println("Horas
trabajadas:
"+
numHoras);}
System.out.println("Horas trabajadas: "+ numHoras);}

mtodo de la superclase

}}
Java

Arrays y Cadenas

17

Java

Arrays y Cadenas

18

La clase genrica Object

La clase genrica Object


Object define un conjunto de mtodos tiles,
que pueden ser redefinidos en cada clase. En
particular:

Todas las clases en Java heredan


implcitamente de la clase Object. De
esta forma, Object es la raiz de la
jerarqua de herencia (de
implementacin) en Java.

Java

Arrays y Cadenas

public boolean equals(Object o): Permite definir el


criterio de igualdad utilizado para los objetos de
una determinada clase (el operador ==
nicamente chequea la igualdad de referencias).
En Object, equals se define directamente como la
identidad de referencias.
public String toString(): Permite decidir la
representacin externa de un objeto como una
cadena. Por defecto es el valor de su referencia,
etiquetada con el nombre de la clase.

19

La clase genrica Object

Java

Arrays y Cadenas

20

API de Object
Method Summary

toString()
equals()

protected
Object

Object

boolean

protected
void

Class

int

no se necesita extends para heredar de Object


String

Java

Arrays y Cadenas

21

Ejemplo

clone()
Creates and returns a copy of this object.
equals (Object obj)
Indicates whether some other object is "equal to" this one.
finalize()
Called by the garbage collector on an object when garbage collection
determines that there are no more references to the object.
getClass()
Returns the runtime class of an object.
hashCode()
Returns a hash code value for the object.
toString()
Returns a string representation of the object.
Java
Arrays y Cadenas

22

Ejemplo

public class Alumno{


String nombre;
String apellidos;
public Alumno(String nombre, String apellidos){
this.nombre= nombre;
this.apellidos= apellidos;
}
public boolean equals(Alumno al){
if (apellidos.equals(al.apellidos))
return true;
else return false;
}

Java

Arrays y Cadenas

23

public static void main(String args[]) {


Alumno alum = new Alumno("Julian", "Fdez");
Class tipoObjeto = alum.getClass();
System.out.println("nombre de la clase: " +
tipoObjeto .getName());
Alumno alum2 = alum;
alum2.apellidos = "Rodriguez ";
System.out.println("son el mismo objeto?:"+
(alum==alum2));
alum2 = new Alumno("Antonio", "Rodriguez ");
System.out.println("son iguales los
objetos?:"+ alum.equals(alum2));
}}

Java

Arrays y Cadenas

24

Copias de Objetos

clone( )

La asignacin en Java simplemente copia


A'
A
la referencia
Copia superficial:
15

23
"abc"

Copia en profundidad:
A

B
23
"abc"

15

42

Java

15

A'

B'
23
"abc"

42

15

C'

Crea un objeto que es copia superficial del


objeto actual independientemente de su tipo.
El tipo objeto a copiar debe haber declarado
que es susceptible de copia implementando el
interfaz vaco Clonable
Es un mtodo protegido de Object, por tanto
para que pueda ser invocado desde otro
paquete hay que redeclararlo como pblico y
simplemente invocar a la clase base.

42

Arrays y Cadenas

25

clone( )

Java

Arrays y Cadenas

26

clone( )

public class
class ClaseClonable
ClaseClonable
public
implements Cloneable
Cloneable {{
implements
// Otro
Otro cdigo
cdigo de
de la
la clase
clase
//
public Object
Object clone
clone ()
()
public
throws CloneNotSupportedException
CloneNotSupportedException
throws
{{
return super.clone();
super.clone();
return
}}
}}

Java

Arrays y Cadenas

27

clone( )

public abstract class Transaction implements


Cloneable{
private long amount;
private Date date;
public Object clone(){
Object o = null;
try{
o = super.clone(); //copia superficial
}
catch(CloneNotSupportedException e){
throw new InternalError(); }
return o;
Java
Arrays y Cadenas
28
}

clone( )

Si los miembros de una clase son otros


objetos que necesiten copia profunda
habr que aadir el cdigo necesario
w Llamada a los mtodos clone() de cada uno de

los objetos implicados para crear una copia

Java

Arrays y Cadenas

29

public abstract class Transaction


implements Cloneable{
private long amount;
private Date date;
public Object clone(){
Transaction t = null;
try{
t = (Transaction)super.clone();//superf
t.date = (Date)t.date.clone();//profund
}
catch(CloneNotSupportedException e){
throw new InternalError(); }
return t;
Java
Arrays y Cadenas
30
}

clone( )

Ejemplo

Reglas generales
n

Implementar el interfaz Cloneable si se desea que


la clase se pueda copiar
No utilizar constructores en la implementacin de
clone() si no llamadas a los mtodos clone() de
los otros objetos a copiar
w Puede existir problemas en el tipo de objeto creado

Todas las subclases de una clase Clonable


tambin son susceptibles de ser clonadas.
w Deben reescribir el mtodo clone()
Java

Arrays y Cadenas

31

Ejemplo (cont.)

public class
class Alumno
Alumno implements
implements Cloneable
Cloneable {{
public
String nombre;
nombre;
String
String
apellidos;
String apellidos;
public Alumno(String
Alumno(String nombre,
nombre, String
String apellidos){
apellidos){
public
this.nombre= nombre;
nombre;
this.nombre=
this.apellidos= apellidos;
apellidos;
this.apellidos=
}}
public
boolean
equals
(Alumno
al){
public boolean equals (Alumno al){
if (apellidos.equals(al.apellidos))return
(apellidos.equals(al.apellidos))return true
true;;
if
else return
return false;
false;
else
}}
public Object
Object clone
clone ()
() throws
throws
public
CloneNotSupportedException{
CloneNotSupportedException{
return super.clone();
super.clone();
return
}}
public String
String toString
toString(){
(){
public
return nombre
nombre
Java
apellidos ++ "" ";
"; 32}}
return
++ ""Arrays
"" ++y Cadenas
apellidos

Referencia esttica

public static
static void
void main(String
main(String args[])
args[]) {{
public
Alumno alum
alum == new
new Alumno("Julian",
Alumno("Julian", ""Fdez");
Fdez");
Alumno
Class tipoObjeto
tipoObjeto == alum.
alum.getClass();
getClass();
Class
System.out.println
.out.println("nombre
("nombre de
de la
la clase:"
clase:" ++tipoObjeto
tipoObjeto.getName());
.getName());
System
Alumno alum2
alum2 == alum;
alum;
Alumno
alum2.apellidos == "Rodriguez";
"Rodriguez";
alum2.apellidos
System.out.println
.out.println("son
("son el
el mismo
mismo objeto?:"+
objeto?:"+ ((alum
alum==alum2));
==alum2));
System
alum2 == new
new Alumno("Antonio",
Alumno("Antonio", "Rodriguez");
"Rodriguez");
alum2
System.out.println
.out.println("son
("son iguales
iguales os
os objetos?:"+
objetos?:"+
System
alum.equals(alum2));
.equals(alum2));
alum
try {{ alum2
alum2 == (Alumno)alum.clone();
(Alumno)alum.clone();
try
}catch (CloneNotSupportedException
(CloneNotSupportedException e){
e){
}catch
System.out.println("no tiene
tiene implementada
implementada la
la clonacion");
clonacion");
System.out.println("no
}}
alum.nombre="Fran";
alum.nombre="Fran";
alum2.nombre="Moises";;
alum2.nombre="Moises"
System.out.println
.out.println("objetos:
("objetos: "+
"+ alum
alum ++ alum2);
alum2);
System
}}
Java
Arrays y Cadenas
33
}}

Referencia dinmica

La referencia esttica se fija en tiempo de


compilacin
Rectangle r = new Rectangle();
Circle c = new Circle();
...
c = r; //Error

Java

Arrays y Cadenas

34

Enlace dinmico

Programador es un Empleado

Empleado

e
mit
per
Se

extends

Programador

El mtodo a ejecutarse se determina en


ejecucin en funcin de la referencia
dinmica (no de la esttica)

Empleado e = new Programador();


Empleado es referencia esttica
Revisada por el compilador
Programador es referencia dinmica
Sus mtodos se eligen en tiempo
de ejecucin
Java

Arrays y Cadenas

35

Java

Arrays y Cadenas

36

Enlace dinmico
Cuenta

CCorriente

Cuenta [ ]accArray = new Cuenta[10];


accArray[0] = new CAhorro();
accArray[1] = new CCorriente();
...

retirar()

CAhorro

retirar()

Enlace dinmico
class Shape{
Shape{ ...
... double
double getArea(){...};}
getArea(){...};}
class
class Rectangle
Rectangle extends
extends Shape{
Shape{ ...
... double
double
class
getArea(){...};}
getArea(){...};}
class Triangle
Triangle extends
extends Shape
Shape{{ ...
... double
double
class
getArea(){...};}
getArea(){...};}
Shape s;
s; Rectangle
Rectangle r;
r; Triangle
Triangle t;
t;
Shape
// ...
...
//
if
(/*...*/)
s
=
r;
else
s
=
t;
if (/*...*/) s = r; else s = t;
double answer
answer == s.getArea();
s.getArea(); //
// Cual
Cual ejecuta?
ejecuta?
double

accArray[i].retirar()

retirar()
enlace dinmico

s; //
// legal?
legal?
rr == s;

Java

Arrays y Cadenas

Enlace dinmico

37

Persona

public static
static void
void main(String
main(String args[])
args[]) {{
Trabajador
public
Persona per;
per;
Persona
Trabajador yo=
yo= new
new Trabajador("Balta",
Trabajador("Balta", 99,
99, 200.5f,
200.5f, 45);
45);
Trabajador
per == yo;
yo;
// Asignacion
Asignacion legal
legal
per
//
// se
se ejecuta
ejecuta el
el mtodo
mtodo mostrar
mostrar de
de Trabajador
Trabajador
//
per.mostrar(); //
// per
per se
se trata
trata como
como cualquier
cualquier Trabajador
Trabajador
per.mostrar();
pelas == per.sueldo();
per.sueldo();
pelas
//
Ilegal
(sueldo
se
define
en
Trabajador)
// Ilegal (sueldo se define en Trabajador)
boolean b1,
b1, b2;
b2;
boolean
b1 == (per
(per instanceof
instanceof Persona);
Persona); //
// True
True
b1
b2 == (per
(per instanceof
instanceof Trabajador);
Trabajador); //
// True
True
b2
System.out.println("b1:
"+
b1
+
"
b2:
"+ b2);
b2);
System.out.println("b1: "+ b1 + " b2: "+
}
}
Java

Arrays y Cadenas

39

La palabra reservada super


n

Arrays y Cadenas

Arrays y Cadenas

38

Enlace dinmico
Nota:
Nota:
En
En C++
C++ slo
slo hay
hay enlce
enlce dinmico
dinmico
en
en los
los mtodos
mtodos virtual
virtual
En
En Java,
Java, todos
todos los
los mtodos
mtodos son
son
virtuales
virtuales

Java

Arrays y Cadenas

40

La palabra reservada super

Una clase utiliza super para apuntar a su


superclase.
Super se utiliza para apuntar a los
miembros de la superclase.
Los mtodos de la superclase se invocan
como si el objeto fuera parte de la
subclase.

Java

Java

41

public class Empleado{


private String nombre;
private int salario;
public String getDetails(){
return "Nombre: "+ nombre + "\nsalario: "
+ salario; }}
public class Jefe extends Empleado {
private String departamento;
public String getDetails(){
return super.getDetails()+
"\nDepartamento: " + departamento;
//llama al mtodo del padre
}}
Java
Arrays y Cadenas
42

Potrebbero piacerti anche