Programación Orientada A Objetos
Programación Orientada A Objetos
Programacin de Sistemas
Programacin BASADA en Objetos
Escenario IV:
Declarar e implementar una clase
Ahora que ya sabes interpretar cdigo e implementar tus
propios mtodos te encargan el diseo de una clase completa
para crear un nuevo tipo de datos con sus caractersticas y
comportamiento.
Objetivo:
Ser capaz de declarar una clase con un conjunto de caractersticas
(atributos) y comportamientos (mtodos)
Ser capaz de crear objetos de una clase dada y modificar o restringir el
acceso a su estado y su comportamiento
Plan de trabajo:
Memorizar la nomenclatura bsica de la programacin orientada a objetos
Practicar el modelado de objetos con ejemplos sencillos para distinguir entre una
clase, un objeto, su estado y su comportamiento
Repasar la sintaxis java para declarar clases, atributos, constructores y mtodos
Recordar el mecanismo y la sintaxis para paso de mensajes entre objetos
Objetivos
Definir los conceptos bsicos de la
programacin basada en objetos
Clases, objetos
Miembros (atributos, mtodos)
Abstraccin y ocultacin de informacin
Clases y objetos
Encapsulacin de objetos
Abstraccin funcional
Abstraccin de datos
Miembros de una clase (atributos y mtodos)
Paso de mensajes
Sobrecarga de mtodos
Constructores
Modificadores y acceso
Qu es un objeto?
Qu es un objeto?
Abstraccin funcional
Hay cosas que sabemos
que los coches hacen
pero no cmo lo hacen:
avanzar
parar
girar a la derecha
girar a la izquierda
Abstraccin de datos
Un coche tiene adems
ciertos atributos:
color
velocidad
tamao
etc.
Qu es un objeto?
Es una forma de agrupar un conjunto de
datos (estado) y de funcionalidad
(compor tamiento) en un mismo
bloque de cdigo que luego puede ser
referenciado desde otras partes de un
programa
La clase a la que pertenece el objeto
puede considerarse como un nuevo
tipo de datos
8
Ejemplo
Clase
Objetos
Estado
Constructor
Comportamiento
Ejercicio 1
Encapsulacin de objetos
Encapsulacin: describe la vinculacin de un
comportamiento y un estado a un objeto en particular.
Encapsulacin de objetos
MIEMBROS DE UNA CLASE
Los objetos encapsulan atributos permitiendo acceso a ellos
nicamente a travs de los mtodos
Atributos (Variables): Contenedores de valores
Un objeto tiene
Normalmente:
Los mtodos son pblicos
Los atributos son privados
Puede haber mtodos privados
Definicin de objetos
Miembros pblicos
Miembros privados
describen la implementacin de
cmo lo hacen.
Ejemplo: el objeto contacto
interacciona con el circuito
elctrico del vehculo, este con
el motor, etc.
En sistemas orientados a
objetos puros todo el estado
es privado y slo se puede
cambiar a travs del interfaz
pblico.
Ej: El mtodo pblico frenar
puede cambiar el valor del
atributo privado velocidad.
13
Arrancar
Interfaz Pblica
Paso de Mensajes
Implementacin
Ejemplo
Clase Coche
Clase Motor
Clase Rueda
Paso de
mensajes
16
Clasificacin de objetos
Nombre de la clase
Mtodos (funciones)
Atributos (datos)
Nombre: Ferrari
Mtodos: arrancar , avanzar , parar, ...
Atributos: color = rojo;
velocidad 300Km/h
Sobrecarga (Overloading)
Qu es?
Podemos definir una clase con dos mtodos
con el mismo nombre si los argumentos son
distintos.
Se utiliza mucho para los constructores.
Sabemos cual de los dos mtodos tenemos
que ejecutar por los parmetros que le
pasamos cuando le llamamos.
19
Sobrecarga (Overloading)
Para qu sirve?
Clase
Objetos
Sobrecarga
20
Ejercicio 2
Sobre la clase Bicicleta, implementa los
mtodo sobrecargados cambiarPlato(), y
cambiarPion(), que no reciben argumentos y
que cambian el plato actual y el pin actual a
un valor por defecto, en concreto, 1.
21
Constructores
Cuando se crea un objeto sus miembros se inicializan con un
mtodo constructor
Los constructores:
llevan el mismo nombre que la clase
No tienen tipo de resultado (ni siquiera void)
Conviene que haya al menos 1 constructor
Pueden existir varios que se distinguirn por los parmetros que
aceptan (sobrecarga)
Si no existen se crea un constructor por defecto sin parmetros
que inicializa las variables a su valor por defecto.
Si la clase tiene algn constructor, el constructor por defecto deja
de existir. En ese caso, si queremos que haya un constructor sin
parmetros tendremos que declararlo explcitamente.
22
Constructores
Array de objetos de la clase Coche
Sobrecarga de constructores
23
Ejercicio 3
Sobre la clase Bicicleta, implementa un
constructor adicional que no recibe parmetros
y que inicializa la velocidad actual a 0, y el
plato actual y el pin actual a 1.
24
Modificadores y acceso
Static (miembros estticos)
Modificador static
Slo existen una vez por clase, independientemente del
nmero de instancias (objetos) de la clase que hayamos
creado y aunque no exista ninguna.
El mtodo o el atributo se comportan siempre de la
misma manera
Se puede acceder a los miembros estticos
utilizando el nombre de la clase.
Un mtodo esttico no puede acceder a miembros no
estticos directamente, tiene que crear primero un objeto
25
Modificadores y acceso
Static (miembros estticos)
Atributo esttico
Otros ejemplos
Atributo esttico
=> -231
=> 231-1
26
Modificadores y acceso
Static. Algunas reglas
Los miembros estticos se invocan con:
NombreClase.metodoEstatico();
NombreClase.atributoEstatico;
Para acceder a los miembros no estticos necesitamos
disponer de una instancia (objeto) de la clase
NombreClase nombreObjeto = new NombreClase();
Los miembros no estticos se invocan con:
nombreObjeto.metodoNormal();
nombreObjeto.atributoNormal;
Cuando invocacin (llamada) a un miembro esttico de la
clase se realiza dentro de la propia clase se puede omitir el
nombre de la misma. Es decir podemos escribir:
metodoEstatico(); en lugar NombreClase.metodoEstatico();
atributoEstatico; de:
NombreClase.atributoEstatico;
27
Acceso
Mtodos get() y set()
Los atributos de una clase son generalmente privados para
evitar que puedan ser accesibles / modificables desde
cualquier otra clase.
A veces nos interesa que algunas clases determinadas s
puedan acceder a los atributos.
Uso de mtodos get() y set()
28
Ejercicio 4
Sobre la clase Bicicleta, implementa los
mtodos get() y set()necesarios para poder
acceder y modificar todos los atributos.
29
MODIFICADORES
acceso
public
(friendly)
private
otros
static
clase
metodo
atributo
30
Paquetes
Un paquete agrupa clases (e interfaces)
Las jerarquas de un paquete se corresponden con las
jerarquas de directorios
Para referirse a miembros y clases de un paquete se utiliza la
notacin de separarlos por puntos.
Ej: Cuando importamos paquetes de clases matemticas
import java.math.BigDecimal
La clase BigDecimal est en el directorio java/math dentro del JDK
No es necesario importar todas las clases: paquete java/lang
String
Integer
NullPointerException
ArrayIndexOutOfBoundsException
31
Paquetes
Cmo crear mis propios paquetes?
Almaceno mis clases en un directorio con el nombre del paquete
Pongo al principio de todas las clases que
pertenezcan al paquete la instruccin
package MiPropioPaquete;
32
Programacin de Sistemas
Programacin ORIENTADA a Objetos
33
Escenario V:
Reutilizar cdigo. Herencia
Una vez que eres capaz de crear tus propias clases ests preparado para
trabajar en equipo y reutilizar cdigo de tus compaeros. Tu equipo te
proporciona un conjunto de clases y te pide que crees especializaciones o
generalizaciones de las mismas
Objetivo:
Ser capaz de crear una clase derivada aadiendo algunas caractersticas
(atributos) y comportamiento (mtodos) a una clase existente.
Ser capaz de extraer todo el cdigo comn de un conjunto de clases similares
para agruparlo en una nueva clase padre para que sea ms fcil de mantener.
Ser capaz de crear objetos, y referenciar y acceder a sus atributos y
mtodos dependiendo de su posicin en la jerarqua de herencia y sus
modificadores
Plan de trabajo:
Memorizar la nomenclatura relacionada con herencia
Memorizar la sintaxis de java relacionada con la herencia (extends), con la referencia
(super) y con modificadores de acceso avanzados (protected)
Conocer mecanismos bsicos de herencia como ocultacin de atributos, sobreescritura
de mtodos ,saber para qu sirven y cmo se usan
34
Contenidos
Conceptos bsicos de herencia
Jerarqua de herencia
Reescritura I: Ocultacin de atributos
Reescritura II: Redefinicin de mtodos
Constructores de clases derivadas
Polimorfismo
El modificador final
35
Herencia
Qu es?Para qu sirve?
Es un mecanismo para la reutilizacin de software
Permite definir a partir de una clase otras clases
relacionadas que supongan una:
Especializacin (la clase Coche como especializacin de
Vehculo)
Escenario: Tenemos que desarrollar una nueva clase que se parece mucho a una
que tenemos pero necesita informacin (caractersticas y comportamiento) adicional.
Solucin (subclase, clase hija o clase derivada): Creamos una clase derivada
y aadimos nueva funcionalidad sin tener que reescribir el cdigo comn.
Herencia
Para qu sirve?
Recurso
nombre
descripcion
decirNombre()
decirDescripcion()
Aula
nombre
descripcion
localizacion
decirNombre()
decirDescripcion()
decirLocalizacion()
Ordenador
nombre
descripcion
sistemaOperativo
decirNombre()
decirDescripcion()
decirSistemaOp()
Recurso
nombre
descripcion
decirNombre()
decirDescripcion()
Aula
localizacion
decirLocalizacion()
Ordenador
sistemaOperativo
decirSistemaOp()
Herencia
Nomenclatura
Si definimos la clase Coche a partir de la clase
Vehculo se dice que:
"Coche" hereda las variables y mtodos de "Vehiculo"
"Coche" extiende de "Vehiculo"
"Coche" es subclase de "Vehiculo"
clase derivada
clase hija
"Vehiculo" es superclase de "Coche"
clase base
clase padre
Herencia
Declaracin de clases derivadas
Persona
Alumno
Empleado
Profesor
Bedel
39
Herencia
Clase derivada (subclase)
Atributos
nombre
Mtodos
imprime
apellidos
anyoNacimiento
grupo
ponGrupo
horario
imprimeGrupo
Clase Alumno
40
Herencia
Cmo se usa? Ej.: Persona.java
protected
accesible
desde las subclases
41
Herencia
Cmo se usa? Ej.: Alumno.java
super
acceder a
atributos o mtodos de
la superclase
[email protected] 2010
42
Herencia
Cmo se usa? Ej.: Prueba.java
43
Herencia
Qu pasa si?
Defino el atributo nombre de Persona como private.
Se hereda, pero no podemos acceder a l, salvo que
implementemos mtodos para ello (p.ej. getNombre())
44
Herencia
Consecuencias de la extensin de clases
Herencia de la interfaz
La parte pblica de la clase derivada contiene la parte
pblica de la clase base. La clase Alumno contiene el
mtodo imprime()
Herencia de la implementacin
La implementacin de la clase derivada
contiene la de la clase base. Al invocar los
mtodos de la clase base sobre el objeto de la clase
derivada (unAlumno.imprime()) se produce el
comportamiento esperado
45
Ejercicio 5
Herencia
Jerarqua de herencia en Java
47
Herencia
Jerarqua de herencia en Java
Object
Boolean
Character
Integer
Long
Number
Float
Persona
Double
Alumno
Bedel
Empleado
Profesor
48
Herencia
Reescritura (o sobrescritura)
49
Reescritura I (Shadowing)
Ocultacin de atributos
Mtodos
Atributos
Alumno a = new Alumno(...);
System.out.println(a.nombre);
nombre
imprime()
apellidos
anyoNacimiento
Persona p = a;
System.out.println(p.nombre);
nombre
ponGrupo(String s)
grupo
imprimeGrupo()
horario
Clase Alumno
50
Reescritura I (Shadowing)
Ocultacin de atributos. Ejemplo
class Persona {
public String nombre = "Juan";
}
class Alumno extends Persona {
public int nombre = 10003041;
}
class Test {
public static void main (String[] args) {
} }
Imprime Juan
Imprime 10003041
51
Reescritura I (Shadowing)
Ocultacin de atributos
Si definimos en una subclase un atributo del
mismo nombre y tipo que en la superclase, la
de la superclase queda oculta.
Podemos acceder a la variable de la subclase
o de la superclase utilizando this y super.
52
Reescritura I (Shadowing)
Ocultacin de atributos
clase " Abuela "
clase padre
clase hija
Transporte
Tren
Vehiculo
Moto
Coche
variables
clase hija:
visibles
Variables
clases padre
ocultas
53
Reescritura II (Overriding)
Redefinicin de mtodos. Qu es?
Mtodos
clase hija:
visibles
mtodos
clases padre:
ocultos
54
Reescritura II (Overriding)
Redefinicin de mtodos Para qu sirve?
Recurso
Recurso
nombre
descripcion
decirNombre()
decirDescripcion()
nombre
descripcion
decirNombre()
decirDescripcion()
Aula
Ordenador
Aula
Ordenador
nombre
descripcion
localizacion
decirNombre()
decirDescripcion()
decirLocalizacion()
nombre
descripcion
sistemaOperativo
decirNombre()
decirDescripcion()
decirSistemaOp()
descripcion
localizacion
decirLocalizacion()
decirDescripcion()
sistemaOperativo
decirSistemaOp()
this.decirDescripcion()
Reescritura II (Overriding)
Redefinicin de mtodos
error
no
Object
metodo(parametros)?
no
Otro
Otro ancestro
ancestro
metodo(parametros)?
metodo(parametros)?
no
Superclase
metodo(parametros)?
metodo(parametros)?
no
mensaje
objeto
instancia
Subclase
metodo(parametros)?
metodo(parametros)
56
Reescritura II (Overriding)
Redefinicin de mtodos
57
Reescritura II (Overriding)
Redefinicin de mtodos. Ejemplo
class Persona {
public String nombre = "Juan";
public void imprimir() {
System.out.println("Persona: " + nombre);
}
}
class Alumno extends Persona {
public String nombre = "JuanGarca";
public void imprimir() {
System.out.println("Alumno: " + nombre);
}
}
class Test2 {
public static void main (String[] args) {
Alumno a = new Alumno();
Persona p = a;
a.imprimir();
p.imprimir();
Ambas imprimen:
}
}
Alumno: JuanGarcia
58
Ejercicio 6
59
60
Constructores y herencia
Para la creacin de un objeto:
1. Se crea su parte base
2. Se aade su parte derivada
Si la clase base del objeto hereda a su vez de otra, en el paso 1
se aplica el mismo orden de creacin, hasta llegar a Object
61
Constructores y herencia
En el constructor de la clase derivada
se realiza siempre una llamada al
constructor de la clase base
sta es la primera accin del
constructor (aparece en la primera lnea)
Hay dos posibilidades:
No indicarlo explcitamente
Indicarlo explcitamente
(obligatoriamente en la primera lnea)
62
Constructores y herencia
1. Si no se indica explcitamente, Java inserta
automticamente una llamada a super() en
la primera lnea del constructor de la clase
derivada
public Alumno (String nombre, String apellidos,
int anyoNacimiento, String grupo,
char horario) {
// aqu inserta Java una llamada (invisible) a super()
this.nombre = nombre;
this.apellidos = apellidos;
this.anyoNacimiento = anyoNacimiento;
this.grupo = grupo;
this.horario = horario;
}
63
Constructores y herencia
2. Indicndolo explcitamente
public Alumno (String nombre, String apellidos,
int anyoNacimiento, String grupo,
char horario) {
64
Ms sobre super
super
referencia al objeto actual como si fuera una instancia de su
superclase
A travs de la referencia a super se puede acceder
explcitamente a mtodos de la superclase
Para reescribir mtodos (no slo el constructor), puede ser
til usar la referencia a super
public class Alumno extends Persona {
// el resto permanence igual
public void imprime(){
super.imprime();
System.out.print(" Grupo " + grupo + horario);
}
}
65
Polimorfismo
Capacidad de un objeto de decidir qu mtodo
aplicar, dependiendo de la clase a la que pertenece
Una llamada a un mtodo sobre una referencia de un tipo
genrico (clase base) ejecuta la implementacin
correspondiente del mtodo dependiendo de la clase del
objeto que se cre
66
Polimorfismo
Ejemplo
67
Polimorfismo
Ligadura dinmica
Se llama al mtodo correcto, aunque nos
estemos refiriendo al objeto de la subclase a
travs de una referencia a la superclase
Este mecanismo se llama ligadura dinmica
permite detectar en tiempo de ejecucin cul es el
mtodo adecuado para llamar
68
Ejercicio 7
69
Modificadores y acceso
Final
Si no se quiere que las clases derivadas
sean capaces de modificar un mtodo o
un atributo de la clase base, se aade a
ese mtodo o atributo la palabra
reservada final
70
Modificadores y acceso
Final
El modificador final se puede aplicar a:
Parmetr o s : Indica que dentro del mtodo no podemos cambiar el valor de
dicho parmetro
public void miMetodo(final int p1, int p2){} //no podemos cambiar valor p1
MODIFICADORES
public
metodo
clase
acceso
(friendly)
protected
private
final
otros
static
atributo
No se puede heredar de
ellas. Es la hoja en el
rbol de herencia
No se puede ocultar
Es cte y no puede ser
modificado en las clases
hijas
No se puede cambiar su
valor, es cte.
Se suele utilizar en
combinacin con static
Programacin de Sistemas
Programacin ORIENTADA a Objetos (II)
73
Contenidos
Casting. Compatibilidad de tipos
Clases y mtodos abstractos
Interfaces
74
Casting (conversin)
Sintaxis y tipos
Sintaxis:(tipo) identificador
Dos tipos de casting:
Widening o upcasting: Una subclase se utiliza
como instancia de la superclase. Es implcito.
Narrowing o downcasting: La superclase se
utiliza como instancia de una subclase.
Conversin explcita.
Casting (conversin)
Widening o upcasting
1. Compatibilidad hacia arriba
(upcasting)
Un objeto de la clase derivada siempre se
podr usar en el lugar de un objeto de la
clase base (ya que se cumple la relacin
es-un)
Persona p = new Alumno();
76
Casting (conversin)
Narrowing o downcasting
2. Compatibilidad hacia abajo (downcasting)
No se produce por defecto, ya que un objeto de la
clase base no siempre es un objeto de la clase
derivada
Alumno a = new Persona(); // error
Slo es posible en los casos en los que el objeto
de la clase base realmente sea un objeto de la
clase derivada
Estos casos se tendrn que indicar
explcitamente con un casting (con una
asignacin explcita de la clase).
77
Casting (conversin)
Ejemplo
public class Prueba2 {
public static void main (String[] args) {
Persona p1;
//conversin ascendente implcita
- funciona
Alumno a1 = new Alumno();
p1 = a1;
Alumno a2;
//conversin descendente implcita No funciona
a2 = p1; //error porque no hago conversin explcita
Un alumno
siempre es una
persona
(implcito)
Una persona no
siempre es un
alumno
Casting (conversin)
Ejemplo
Persona p2 = new Persona();
Alumno a3;
//conversin descendente implcita no
a3 = p2;
//da error de compilacin
funciona
no funciona
}
}
Una persona no siempre es un alumno. No podemos
asumir implicitamente que lo sea
Una persona no
siempre es un
alumno. No
podemos asumir
implicitamente
que lo sea
Una persona a
veces es un
alumno pero si
no lo es (no lo
hemos creado
como tal) no
podemos tratarlo
como si lo fuera,
ni siquiera
aunque se lo
digamos
explicitamente
79
Casting (conversin)
El operador instanceOf
Sintaxis:
objeto instanceOf clase
Comprueba si un objeto es realmente de la
clase derivada
Ejemplo:
public Alumno comprueba (Persona p) {
Alumno a = null;
if (p instanceOf Alumno)
a = (Alumno) p;
return a;
}
80
Clases abstractas
Qu son?
Aquellas que tienen al menos un mtodo
abstracto (sin implementar, sin cdigo).
Declara la estructura de una determinada
abstraccin, sin implementar completamente
cada mtodo
Mensaje
SMS
Fax
MensajeVoz
81
Clases abstractas
Caractersticas
82
Clases abstractas
Caractersticas
No podemos crear objetos de una clase abstracta
Pueden existir referencias a clases abstractas
Pero apuntarn a objetos de clases derivadas de la clase
abstracta.
Figura fig = new Rectangulo(2,3);
Clases abstractas
Para qu sirven?: Implementaciones parciales
Las clases abstractas suelen usarse para
representar clases con implementaciones parciales
Algunos mtodos no estn implementados pero s
declarados
84
Clases abstractas
Mtodos abstractos
Mtodos declarados pero no implementados
en las clases abstractas
public abstract tipoDevuelto nombre (listaParametros);
85
Clases abstractas
Cmo se usan? Ejemplo
public abstract class Figura {
protected double dim1;
protected double dim2;
public Figura(double dim1, double dim2) {
this.dim1 = dim1;
this.dim2 = dim2;
}
public abstract double area();
}
public class Rectangulo extends Figura {
public Rectangulo(double dim1, double dim2) {
super(dim1,dim2);
}
public double area() {
return dim1*dim2;
}
}
86
Ejercicio 8
Clases abstractas
Polimorfismo
El array es de objetos de
tipo Figura (abstracto)
Interfaces
Qu son?
Los interfaces son colecciones de mtodos (y constantes)
Todos los mtodos de un interfaz son
abstractos
El acceso a un interfaz es pblico
Los atributos son public, static y final
Los mtodos son public
89
Interfaces
Qu son?
Una interfaz es un elemento puramente de
diseo
Qu se quiere hacer?
Interfaces
Declaracin
Sintaxis:
public interface nombreInterfaz {
static final tipo CONSTANTE = valor;
tipoDevuelto nombreMetodo(listaParam);
}
Interfaces
Implementacin
Si una clase implementa una interfaz, quiere decir que
implementa todos los mtodos abstractos de esa interfaz
Esto se representa con la palabra reservada
implements:
92
Interfaces
Para qu sirven? Herencia mltiple
metodoA
Class A
metodoB
Interface B
implements
extends
metodoC
Interface C
implements
Class C
Interfaces
Cmo se usan?
Figura
Dibujable
area()
dibujar()
extends
implements
Crculo
Rectngulo
area()
dibujar()
area()
dibujar()
94
Ejercicio 9
Implementa la interfaz Imprimible, la cual
contiene el mtodo imprime() que no
devuelve ningn valor.
La clase Bicicleta implementa la interfaz
Imprimible de tal forma que se imprima por
pantalla la velocidad actual el pin actual y el
plato actual.
95
Interfaces
Herencia de interfaces y polimorfismo
Las interfaces tambin pueden tener una
jerarqua de herencia
Los mtodos que debern incluir las clases
que implementen las interfaces se van
acumulando siguiendo la jerarqua
Las interfaces tambin dan soporte a la
resolucin dinmica de mtodos durante la
ejecucin (ligadura dinmica)
96
Ejercicio 10
Implementa la interfaz Definir, la cual
contiene el mtodo getAtributos() que
devuelve el valor de los atributos de un objeto.
La interfaz Imprimible hereda de Definir.
Qu cambios hay que hacer en la interfaz
Imprimible? Y en la clase Bicicleta ?
97
Clase abstracta
Al menos un mtodo no implementado,
(slo declarado)
modificador abstract
Interfaz
Nada de implementacin
palabra reservada: interface
98
Interfaz
puede extender (extends) a uno o ms
interfaces
99
MODIFICADORES
metodo
clase
public
atributo
acceso
(friendly)
protected
private
abstract
No se pueden instanciar
Son para heredar de
ellas
No tiene cdigo
Se implementa en las
subclases o clases hijas
Al menos 1 mtodo
abstracto
otros
final
static
No se puede heredar de
ellas. Es la hoja en el
rbol de herencia
No se puede ocultar
Es cte y no puede ser
modificado en las clases
hijas
No se puede cambiar su
valor, es cte.
Se suele utilizar en
combinacin con static
Es la misma para todos los
objetos de la clase.
Se utiliza:
49
NombreClase.atributo; 100