Upload
others
View
8
Download
0
Embed Size (px)
Citation preview
1
{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ } Kybele, 2007 ©
Tema 2: Programación basada en Objetos
Programación Orientada a Objetos
Marcos López Sanz
Máster en Informática Gráfica, Juegos y Realidad Virtual
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Índice
� Objetivos
� Introducción
� Vista Pública� Clases� Objetos
� Vista Privada� Clases� Objetos
� Miembros de instancia vs. de Clase
� Normas de estilo
2
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Objetivos
� Presentar el nnúúcleo de Java cleo de Java
� Codificar clases (atributos y métodos) y objetos (estado y mensajes)
� Manejo de clases y objetos de forma aislada (visivisióón no n no colaborativacolaborativa de un programa)
�� Aspectos globalesAspectos globales del conjunto de objetos de una clase
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Introducción
� Aplicación del principio de encapsulación:� Diferencia entre vista pública y privada� Según el ámbito de accesibilidad
� Conceptos:� Accesible: que se puede mencionar, utilizar o conocer� Vista Pública (interfaz o protocolo):
• Público: accesible desde cualquier punto del programa, anterior o posterior a su declaración
• Establece las únicas vías de actuación con los objetos
� Vista Privada (implantación o implementación)• Privado: accesible sólo desde la implementación de la clase
• Reúne los detalles de atributos (estructuras de datos) y métodos (algoritmos)
� Son los mecanismos que sustentan los principios de abstracción (v. pública), encapsulación (v. privada) y modularidad (combinación de vistas en una clase)
3
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Introducción
L. Fernández, F. Arroyo. Programación II: Teoría y práctica del módulo de programación orientada a objetos
Metodo_3
Metodo_2
Metodo_1
OBJETO
CLASE
Mensaje_1
Mensaje_3
Atributo_2
Atributo_1
Atributo_2
Atributo_1
CLASES: VISTA PUBLICA
OBJETOS: VISTA PUBLICA
CLASES: VISTA PRIVADA
OBJETOS: VISTA PRIVADA
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Vista Pública: Clases
�� NombreNombre de la clase:� Único (en un paquete)� Identificador que comienza por letra mayúscula (convención de
estilo)� Patrón de creación (Java):
<modificadores> class <idClase> <herencia>{…}
� Miembros de una clase:� Métodos� Atributos (“campos”)� Clases o interfaces anidadas (dependiente del lenguaje)
public class Esfera extends Figura
{…}
4
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Vista Pública: Clases
� Tipos de métodos:
� Constructores� Funciones (“métodos estándar”)� Destructores
�� ConstructoresConstructores: para crear nuevos objetos
• Su nombre coincide con el de la clase
• No devuelven valores (ni siquiera void) � el valor devuelto por un constructor es el propio objeto
• Su ejecución es implícita al crear un objeto
• No es obligatorio definirlos
• Generalmente se utilizan para inicializar el estado de un objeto
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Vista Pública: Clases
�� FuncionesFunciones: para comunicarse con una objeto instancia de la clase• Nombre personalizado
• Pueden devolver valores (básicos, objetos y estructuras)
• Ejecución mediante la “notación punto”• Devuelven/No devuelven valor.
• Con/Sin parámetros
�� DestructoresDestructores• Su nombre siempre es finalize (en java)
• No devuelven valores (tampoco void) � en algunos lenguajes pueden devolver un valor booleano indicando la correcta destrucción del objeto
• Ejecución implícita a la destrucción de un objeto
• Raramente existen
5
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Vista Pública: Clases
� Métodos:� Cabecera
• Modificador: public/private (protected en C++) � visibilidad• Tipo devuelto
• Nombre
• Lista de parámetros (opcional)
• Manejadores de excepciones (opcionales)
� Dentro de cada método está implícito el uso del propio objeto que lo invoca
� Finalización de un método:• Terminar el código
• Ejecutar una sentencia return: return ‘[‘<expresión>’];• Lanzar una excepción no controlada
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Vista Pública: Clases
� Métodos� Tipos de datos básicos (parámetros y valores devueltos en java)
� boolean: los valores de verdad ‘true’ y ‘false’
� char: caracteres del código Unicode 3.0 (J2SE 1.4) o Unicode 4.0 (J2SE 5.0) de 16 bits.
� byte: número entero de 8 bits con signo
� short: número entero de 16 bits con signo
� int: número entero de 32 bits con signo
� long: número entero de 64 bits con signo
� float: número con coma flotante de 32 bits (norma IEEE 754-1985)
� double: número con coma flotante de 64 bits (norma IEEE 754-1985)
� void: cuando no se quiere devolver ningún valor (sólo se puede utilizar como valor devuelto)
6
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Vista Pública: Clases
� Sobrecarga de métodos:
� Def.: Cualidad que permite tener 2 o más
métodos con el mismo nombre en la misma
clase o en diferentes.
import java.lang.*;
public class Prueba
{
public void probar(Integer i){
System.out.println("Integer");
}
public void probar(Number i){
System.out.println("Number");
}
public static void main() {
Prueba p = new Prueba();
p.probar(new Short("3"));
}
}
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Vista Pública: Objetos
� Forma en que dichos objetos aparecen (se construyen), existen (reciben mensajes) y
desaparecen (se destruyen)
� “Todo objeto es dinámico” � creación, destrucción y paso de mensajes a través de referencias a ellos �
�� INSTANCIACIINSTANCIACIÓÓN: N: creación de un objeto (apuntado por una referencia)
� Referencia = dirección memoria del objeto � asignable y evaluable
<Clase> <referencia> [ = <expresion> ];
<Clase> <identificador>[ ] [ = <expresion> ];
<Clase> <identificador>[ ] = { <expresion>, <expresion>, … };
new <tipo de objeto> ([ parámetros ]); (java)
7
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Vista Pública: Objetos
� Destrucción de un objeto � Automática� Recolector de basura: libera la memoria reservada a objetos inútiles (no
accesibles mediante una referencia)
� Paso de mensajes: notación punto� Una vez instanciado un objeto es posible pasarle mensajes (= invocar) los
métodos definidos en su clase
� Parámetros: siempre por valor. Si se pasa una referencia, la referencia en sí no varía pero puede hacerlo el estado del objeto apuntado
<referencia>.<método> ([<parámetros>])
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Vista Privada: Clases
�� VistaVista privadaprivada: se encapsulan los atributos (estructuras de datos) y los algoritmos (definición de métodos)
� El orden en la declaración de atributos y en la definición de métodos no influye en su acceso
� Definición de atributos:: para seguir el principio de encapsulación deben ser definidos como privados (sólo accesibles desde dentro de la clase):� private <tipo/clase><identificador> [ = <expresion>];
� private final <tipo/clase><identificador> [ = <expresion>];
� “final”:� Forma de definir constantes� El valor asignado a una variable final no varía mientras el código está en ejecución:
final float vLuz;... // sigue el programa... vLuz = 3e+5F; // este valor se mantendrá hasta el final
8
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Vista Privada: Clases
� Definición de métodos:� Método:
• Algoritmo mediante el cual se implementa el comportamiento de un objeto
• Flujo de ejecución en el cual se manipulan variables y se lanzan mensajes a objetos accesibles
� Ley estricta de Demeter:• Desde la definición de los métodos de una clase se tiene acceso a:
– Los atributos de la clase
– Los parámetros del método
– Las declaraciones locales al métodos que se está definiendo
– “this”:
» Referencia al supuesto objeto que recibe el mensaje correspondiente al método que se está implantando
» Ofrece la posibilidad de eliminar las colisiones entre variableslocales/parámetros y atributos de una clase con el mismo nombre
» Como norma de estilo se recomienda usar this.nombre_atributo en todo caso (aunque no haya colisión)
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Vista Privada: Clases
� Ejemplo: clase intervalo
class Intervalo {
// Atributos
private double extremoInferior;
private double extremoSuperior;
private final double ORIGEN = 0.0;
…
// Métodos privados
…
// Métodos públicos
…
}
9
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Vista Privada: Clases
� Ejemplo: clase intervalo
// Métodos privados
private double getExtremoInferior (){
return this.extremoInferior;
}
private double getExtremoSuperior (){
return this.extremoSuperior;
}
private void setExtremoInferior (double extremoInferior){
this.extremoInferior = extremoInferior;
}
private void setExtremoSuperior (double extremoSuperior){
this.extremoSuperior = extremoSuperior;
}
private void setExtremos (double extremoInferior, double
extremoSuperior){
this.putExtremoInferior(extremoInferior);
this.putExtremoSuperior(extremoSuperior);
}
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Vista Privada: Clases
� Ejemplo: clase intervalo
// Métodos públicos: Constructores
public Intervalo (){
this.putExtremos(ORIGEN,ORIGEN);
}
public Intervalo (double extremo){
this.putExtremos(ORIGEN,extremo);
}
public Intervalo (double extremoInferior, double extremoSuperior){
this.putExtremos(extremoInferior,extremoSuperior);
}
public Intervalo (Intervalo intervalo){
this.putExtremos(intervalo.getExtremoInferior(),
intervalo.getExtremoSuperior());
}
10
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Vista Privada: Clases
� Ejemplo: clase intervalo
// Métodos públicos: funciones
public double longitud (){
return this.getExtremoSuperior() – this.getExtremoInferior();
}
public double puntoMedio (){
return (this.getExtremoSuperior() + this.getExtremoInferior())/2;
}
public Intervalo copia (){
return new Intervalo(this.getExtremoInferior(), this.getExtremoSuperior());
}
public boolean incluye (double punto) {
return (this.getExtremoInferior() <= punto &&
punto <= this.getExtremoSuperior());
}
public void desplazar (double desplazamiento){
this.setExtremoInferior (this.getExtremoInferior()+desplazamiento);
this.setExtremoSuperior (this.getExtremoSuperior()+desplazamiento);
}
public boolean igual (Intervalo intervalo) {…}
public boolean incluye (Intervalo intervalo) {…}
public boolean intersecta (Intervalo intervalo) {…}
public Intervalo union (Intervalo intervalo) {…}
// precondición: existe interseccion
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Vista Privada: Objetos
� Vista privada de objetos: ver qué sucede internamente en los objetos �creación, destrucción y paso de mensajes
� Creación de un objeto� Reserva de memoria para cada atributo definido en la clase del objeto �
desencadenamiento de “instanciaciones”� Inicialización de cada atributo: asignación de valores, creación de objetos y tablas� Ejecución de un constructor (opcionalmente)
� Destrucción de un objeto� Liberación de recursos de memoria� Borrado de objetos referenciados por el recolector de basura
� Paso de mensajes� Reserva de memoria para los parámetros y asignación del valor � Ejecución de las sentencias del método� Liberación de la reserva de memoria al finalizar la ejecución
11
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Vista Privada: Objetos
� Valores de inicialización (java)
nullReferencia
+0.0double
+0.0ffloat
0byte, short, int, long
‘\ u 0000’char
falseboolean
Valor inicialValor inicialTipoTipo
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Vista Privada: Objetos
� Consideraciones:
� Creación de un objeto ≈ Desencadenamiento de:
• Instanciaciones � new / atributos
• Paso de mensajes � inicialización / constructor
� Paso de un mensaje ≈ Desencadenamiento de:
• Paso de mensajes � ejecución en sí del método
• Instanciaciones � posibles new en la ejecución del método
12
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Miembros de Instancia vs. de Clase
� Miembros de instancia � La clase describe el comportamiento particular de cada uno de los objetos
creados: atributos y métodos
� Miembros de clase o estáticos� Atributos y métodos globales a todos los objetos� Su uso indiscriminado convierte la POO en técnicas de programación
tradicional
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Miembros de Instancia vs. de Clase
� Atributos estáticos<public/private> static <tipo> <idAtributo> = <expresion>;
� La inicialización es obligatoria� Globalidad:
• Están compartidos por todos los objetos de la clase
• Son accesibles desde cualquier método de objeto
• Cualquier efecto sobre su valor repercute en todos los objetos de esa clase (en ejecución)
� Reserva de memoria e inicialización: al principio de la ejecución del programa (incluso si no hay objetos de esa clase)
� Notación de acceso: <clase>.<atributo>
13
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Miembros de Instancia vs. de Clase
� Métodos estáticos<public/private> static <tipo> <idMétodo> ([<parámetros>]){…};
� Globalidad:
• No tienen acceso a this y por tanto a sus atributos (por la ausencia de
objeto)
• Sólo tiene acceso a atributos y métodos estáticos de la clase
� Notación de ejecución: <clase>.<metodo>(<argumentos>);
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Miembros de Instancia vs. de Clase
� Código estático
� Utilizado para inicializaciones complejas (calculadas) de atributos estáticos
� Solución propuesta por java:static { … }
• Permite declaración de vbles. auxiliares y sentencias de ejecución
• Acceso: únicamente a atributos estáticos
• El código se ejecuta al principio del programa
14
Kybele, 2007 ©{ MARCOS L{ MARCOS LÓÓPEZ SANZ }PEZ SANZ }
Agradecimientos
Parte de los contenidos y gráficas recogidas en estas transparencias han sido extraídos del libro:
Programación II: Teoría y práctica del módulo de programación orientada a objetos
ISBN: 84-87238-39-4
Es por ello que queremos agradecer a Luís Fernández Muñoz la posibilidad de reproducir parte de su contenido