Objetos - Informática y Sistemas de Computación

Download Report

Transcript Objetos - Informática y Sistemas de Computación

Unidad 2.- Fundamentos del paradigma orientado a objetos.
2.1 Introducción a la Programación orientada a objetos.
2.1.1 Orígenes de la POO.
2.1.2 Beneficios de la POO.
2.2 Clases.
2.2.1 Encapsulamiento.
2.2.1.1 Concepto de caja negra.
2.2.1.2 Concepto de interfaz.
2.2.2 Abstracción.
2.2.2.1 Abstracción efectiva.
2.2.2.2 Ocultamiento de información.
2.2.2.3 Atributos
2.2.2.4 Métodos
2.2.2.5 Mensajes
2.2.3 Diseño de una clase
2.3 Objetos
2.3.1 Ciclo de vida de un objeto.
2.3.2 Estado y comportamiento de los objetos.
2.4 Herencia y Polimorfismo.
2.4.1 Conceptos básicos.
2.4.2 Relación entre herencia y el polimorfismo.
Abstracción
Las abstracciones son una manera fundamental que tenemos los humanos de
manejarnos con la complejidad. Estas devienen del reconocimiento de las similaridades
entre ciertos objetos, situaciones o procesos en el mundo real, y la decisión de
concentrarse en estas similaridades ignorando las diferencias. Una abstracción es una
descripción simplificada de un sistema que enfatiza algunos de sus detalles o
propiedades mientras suprime otros. Una buena abstracción es la que enfatiza detalles
que son significantes al lector, y suprime los que no lo son.
Una abstracción se enfoca sobre una vista externa del objeto, y sirve para separar su
comportamiento esencial de su implementación.
Un cliente es un objeto que usa
recursos de otro objeto. El
comportamiento de un objeto se
puede caracterizar por las
operaciones que sus clientes
pueden realizar sobre él, y las
operaciones que él puede realizar
sobre otros objetos. El conjunto de
operaciones que un cliente puede
requerir de un objeto define su
protocolo.
La abstracción enfoca las características esenciales de algún
objeto, relativa a la perspectiva del observador
Encapsulamiento
La abstracción de un objeto debería preceder a su implementación. Una vez que la
implementación es seleccionada, esta debería tratarse como un secreto de la abstracción
y ocultársela a la mayoría de los clientes.
Abstracción y encapsulamiento son conceptos complementarios: la abstracción enfoca la
vista externa de un objeto, y el encapsulamiento (ocultamiento de la información) previene
que los clientes vean la parte interna, donde el comportamiento de la abstracción es
implementada.
Entonces, "El encapsulamiento es el proceso de ocultar todos los detalles de un objeto
que no contribuyen a sus características esenciales.
El encapsulamiento oculta detalles de implementación de un objeto
Los aspectos principales de la programación orientada a objetos son:
1) Objetos
2) Clasificación
3) Instanciación
4) Generalización
5) Abstracción
6) Encapsulación
7) Modularidad
8) Extensibilidad
9) Polimorfismo
10) Reuso de Código
Objetos
• El objeto es la entidad básica del modelo orientado a objetos,
• El objeto integra una estructura de datos (atributos) y un
comportamiento (operaciones)
• Los objetos se distinguen entre sí por medio de su propia
identidad, aunque internamente los valores de sus atributos sean
iguales.
Clasificación
• Las clases describen posibles objetos, comunes en su estructura
y comportamiento.
• Los objetos que contienen los mismos atributos y operaciones
pertenecen a la misma clase.
• La estructura de clases integra las operaciones con los atributos
a los cuales se aplican.
Instanciación
• El proceso de crear objetos pertenecientes a cierta clase se llama
instanciación.
• El objeto es la instancia de una clase.
• Pueden ser instanciados un número indefinido de objetos de cierta
clase.
Generalización
• En una jerarquía de clases, se comparten atributos y operaciones entre
clases basados en la generalización de clases.
• El mecanismo para describir la jerarquía de generalización de clases es
la herencia.
• Las clases más generales se conocen como superclases.
• Las clases más especializadas se conocen como subclases.
• La herencia puede ser sencilla o múltiple.
Abstracción
• Se concentra en lo primordial de una entidad y no en sus propiedades
secundarias.
• Se concentra en lo que el objeto hace y no en cómo lo hace.
• Se da énfasis a cuales son los objetos y no cómo son usados, logrando
el desarrollo de sistemas más estables.
Encapsulación
• Encapsulación o encapsulamiento es la separación de las propiedades
externas de un objeto de los detalles de implementación internos del
objeto.
• Se separa la interface del objeto de sus implementación, limitando la
complejidad al mostrarse sólo la información relevante.
• Se limita el impacto a cambios en la implementación, ya que los cambios
a las propiedades internas del objeto no afectan su interacción externa.
• Se reduce el esfuerzo en migrar el sistema a diferentes plataformas.
• Se protege al objeto contra posibles errores, y se permite hacer
extensiones futuras en su implementación.
Modularidad
• El encapsulamiento de los objetos da lugar a gran modularidad.
• Cada módulo se concentra en una sola clase de objetos.
• Los módulos tienden a ser pequeños y concisos.
• La modularidad facilita encontrar y corregir problemas.
• La complejidad del sistema se reduce facilitando su mantenimiento.
Extensibilidad
• La extensibilidad permite hacer cambios en el sistema sin afectar lo que ya
existe.
• Nuevas clases pueden ser definidas sin tener que cambiar la interface del
resto del sistema.
• La definición de los objetos existentes puede ser extendida sin necesidad de
cambios más allá del propio objeto.
Polimorfismo
• Polimorfismo permite definir las mismas operaciones con diferente
comportamiento en diferentes clases.
• Se permite llamar una operación sin preocuparse de cuál implementación es
requerida en que clase, siendo la responsabilidad de la jerarquía de clases y
no del usuario.
Reuso de Código
• La orientación a objetos apoya el reuso de código en el sistema.
• Los componentes orientados a objetos se pueden utilizar para estructurar
librerías reusables.
• El reuso reduce el tamaño del sistema durante la creación y ejecución.
• Al corresponder varios objetos a una misma clase, se guardan los
atributos y operaciones una sola vez por clase, y no por cada objeto.
• Por medio de la generalización y especialización, las subclases heredan
atributos y operaciones comunes, definidos en las superclases.
• La herencia es uno de los factores más importantes contribuyendo al
incremento en el reuso de código dentro de un proyecto o entre múltiples
proyectos.
• Nuevas subclases de clases previamente definidas se pueden crear en el
reuso de una clase, pudiéndose crear nuevas operaciones, o modificar las
ya existentes.
Definición de clase
Clase : Es una descripción de atributos y comportamientos de un conjunto de
objetos similares. Los objetos de una clase o tipo determinado comparten los
mismos comportamientos y atributos. Las clases actúan en forma muy
parecida a una plantilla o molde para galletas en el sentido de que una clase
se utiliza para crear o instanciar objetos
 Los atributos son características externas y visibles de una clase. El color
de los ojos y del cabello de una persona, son ejemplos de atributos.
 Un método (comportamiento) es la acción que realiza un objeto cuando
se le pasa un mensaje o en respuesta a un cambio de estado; es algo que
realiza un objeto.
 Un objeto puede ejercer el comportamiento de otro objeto ejecutando una
operación sobre este último. Los términos llamada a método, llamada a
función o paso de mensaje se utilizan en lugar de realizar una operación,
cada una de estas acciones activa el comportamiento de un objeto
Definición de clase (continuación)
 La sintaxis de una simple definición o declaración de clase es:
[ modificadores ] class nombre-clase [extends claseSuperior ]
[implements interfaz1, interfaz2, ...interfazn ]
{
}
cuerpo
Donde:
modificadores es opcional y puede ser uno más de las siguientes tres palabras reservadas:
{ public, abstract, final, synchronizable }
class es una palabra reservada que se utiliza para definir o declarar una clase
nombre-clase es cualquier identificador válido
extends es una palabra reservada que indica si la clase tiene herencia o es subclase o
extensión de una claseSuperior o superclase
claseSuperior es un identificador o nombre de la superclase de la que hereda atributos y
comportamientos
implements es una palabra reservada que indica si la clase implementa una o varias
interfaces
cuerpo es una secuencia de declaraciones de variables, constantes , constructores y
métodos
Atributos (o Variables)
Los atributos o variables son elementos en los programas que cambian su valor
en el transcurso de ejecución del programa. Los atributos guardan valores de
cierto tipo que pueden ser valores de tipo primitivos u objetos. En Java
podemos clasificar los atributos en:
•Instancias de atributos. Son miembros de la clase y se crean al
instanciar un objeto de la clase.
•Atributos de una clase. Son miembros de la clase y son algo similar a
variables globales, utilizan el modificador static.
•Atributos locales a métodos. Su ámbito es dentro del método.
La declaración de atributos en Java se hace de forma similar al C / C++.
La sintaxis de una simple declaración de un atributo es:
[ modificadores ]
nombre-del-tipo nombre-de-atributo;
Donde:
modificadores es opcional y puede ser uno más de las siguientes siete palabras
reservadas:
{ static, final, transient, volatile, public , protected, private }
Cabe señalar que el único modificador que puede ponérsele a una variable local a un
método es el modificador final.
nombre-del-tipo
es una de las ocho siguientes palabras reservadas ( pero también
pueden ser el nombre de una clase p.ej. String, Alumno, Date, etc. ):
{ boolean, byte, char, short, int, long, float, double }
nombre-de-atributo
es cualquier identificador válido.
Métodos
Los métodos son algo parecido a las funciones del lenguaje C /C++, pero en
Java no se permiten colocar métodos fuera de la definición de clase . Con los
métodos implementamos el comportamiento de los objetos.
Hay varios tipos de métodos:
•Métodos de instancia. Son miembros de la clase y son métodos que
pueden ser utilizados cuando se crea un objeto de la clase a la que
pertenecen, esto es, cuando se crea una instancia de la clase.
•Métodos de clase. Son miembros de la clase y son métodos que pueden
ser invocados sin necesitar crear una instancia de la clase, y los
identificamos fácilmente porque tienen el modificador. STATIC
•Métodos constructores. Como veremos más adelante, son métodos con
el nombre de la clase y que son invocados al instanciar un objeto o crear un
ejemplar de la clase al que pertenecen con el operador new.
Métodos (Continuación)
La sintáxis de una simple declaración de un método es:
[modificadores] tipo-de-retorno nombre-método (lista-de-parámetros) [ throws
claseExcepcion1,.., claseExcepcionN ]
{
}
cuerpo
Donde:
modificadores es opcional y puede ser uno más de las siguientes ocho palabras
reservadas:
{ static, abstract, final, native, synchronized, public , protected, private }
tipo-de-retorno es cualquier nombre de clase o una de los siguientes nueve palabras
reservadas:
{ void, boolean, byte, char, short, int, long, float, double }
nombre-método es cualquier identificador válido
lista-de-parámetros es una secuencia de declaraciones de parámetros
[ throws claseExcepcion1,.., claseExcepcionN ] es una lista de posibles excepciones que
en un momento dado el código del método puede lanzar.
Cuerpo es una secuencia de declaraciones de variables e instrucciones que son ejecutadas
por el método cuando se le invoca.
Métodos (Continuación)
Ejemplo:
public static void main(String args[]) throws IOException
{
/* aquí van las sentencias del cuerpo */
}
Vamos a aprovechar el ejemplo para definir un concepto importante conocido
como firma del método.
Firma de un método: Es la definición del método, excluyendo el cuerpo, es
algo parecido al concepto de función prototipo del lenguaje C. En el ejemplo
anterior, la firma del método es:
public static void main(String args[]) throws IOException
El concepto es importante, porque la documentación de las API's de Java
vemos listadas, cientos de miles de firmas de métodos y las clases a los que
pertenecen.
Creación de objetos
Objeto. Un objeto es una cosa, generalmente extraída del vocabulario del
espacio del problema o del espacio de la solución .
Todo objeto tiene:
Identidad (puede nombrarse o distinguirse de alguna manera de otros objetos )
Estado ( generalmente hay algunos datos asociados a él)
Comportamiento ( se pueden hacer cosas al objeto, y él puede a su vez puede
hacer cosas a otros objetos)
Creación de Objetos. Todo en Java se trata como un objeto. Se puede
manipular objetos a través de handles (referencias, identificadores)
El handle o referencia no necesariamente está conectado a un objeto. Ejemplo:
String s;
Solo es creado la referencia pero hay que inicializarlo:
String s = “Curso de Java”;
Creación de objetos (continuación)
Para conectar un handle o referencia a un objeto se usa la palabra llave new
que es una palabra reservada de Java y significa mas o menos lo siguiente
“creame un nuevo objeto de éste tipo” o, " créame una nueva instancia o
ejemplar de éste tipo" Ejemplo:
String s = new String(“Curso de Java”);
El caso de objetos de la clase String es especial, porque puede crearse o
instanciarse un objeto de esta clase sin el operador new, porque es una clase
muy utilizada.
El efecto de crear un objeto con el operador new se traduce en la asignación de
memoria para ese objeto en el heap de la RAM.
Definición de clase
● Una clase se define mediante
―La palabra reservada class
―Seguida por el nombre de la clase que vamos definir
―el cuerpo de la clase estará rodeado de llaves ({ })
class Alumno
{
…
}
● Una clase está compuesta de atributos y métodos
Atributos
● Variables que definen el estado de un objeto
― De tipo primitivo o de tipo referencias
class Alumno
{
String nombre;
String apellidos;
int añoDeNacimiento;
int númeroPersonal; //identificativo único
String grupo;
char horario; //’M’: mañana, ‘T’: tarde
...
}
Alumno alumno1 = new Alumno();
alumno1.nombre = “Pedro”;
Métodos
● Definen el comportamiento del objeto, es decir, determinan los mensajes
que puede recibir un objeto
● Ejemplo:
class Alumno
{
...
public String dameGrupo ( )
{
...
}
public void ponGrupo(String nuevoGrupo)
{
...
}
...
}
Alumno alumno1 = new Alumno();
alumno1.ponGrupo(“7031-91”);
System.out.println(“El grupo de “ + alumno1.nombre + “ “ +
alumno1.apellidos + “ es el “ + alumno1.dameGrupo());
Interfaz pública de una clase
● La interfaz pública de una clase (y de un objeto) está formada
por:
― Sus atributos públicos (no debería haber, salvo que sean
constantes)
― Sus métodos públicos – el usuario sólo necesita conocer la
signatura
Derechos de acceso
● Java proporciona un mecanismo para definir distintos derechos de
acceso tanto a la clase como a sus elementos (atributos y métodos)
1. Acceso privado
2. Acceso de paquete
3. Acceso protegido
4. Acceso público
Acceso privado
● Se representa con la palabra reservada private
● Los elementos privados sólo pueden ser usados dentro de la clase
que los define
―No son accesibles desde el exterior
―Pero pueden ser accedidos por otro objeto de la misma clase
Acceso protegido
• Se representa con la palabra reservada protected
● Estos elementos pueden ser usados en la clase que los define, en las
de su paquete y en las que heredan de ella
Acceso público
• Se representa con la palabra reservada public
● Se puede acceder a este elemento desde cualquier clase.
Acceso de paquete
• Es el acceso por defecto, es decir, si no se utiliza ninguna palabra
reservada
― También llamado acceso amistoso
● Los elementos son accesibles desde dentro del paquete que los
define
Niveles de acceso
Elementos de clase (static)
● Elementos estáticos de clase: Métodos y atributos que pertenecen a
la clase
― No se los invoca sobre un objeto concreto, sino que están
disponibles siempre, sin necesidad de crear previamente un
objeto de la clase
― Precedidos por la palabra clave reservada static
Definición de métodos
visibilidad Tipo nombreMétodo (listaArgumentos)
{
// cuerpoMétodo
}
● Visibilidad
― Desde qué partes del programa se va a poder acceder al método.
Un ejemplo de identificador de visibilidad es public
● Tipo
― Tipo primitivo o clase del resultado del método
― El resultado del método se define en la sentencia return
● Lista de parámetros
― Tipo y nombre de 0, 1 o varios parámetros pasados al método
― Si son varios, van separados por comas
● Cuerpo del método
― Qué acciones se realizan al llamar a dicho método
class Alumno
{
String nombre;
String apellidos;
int añoDeNacimiento;
int númeroPersonal
String grupo;
char horario = ‘M’;
Visibilidad
Cuerpo
}
public String dameGrupo ()
{
return grupo;
}
Tipos devueltos
Nombres método
Lista de parámetros
public void ponGrupo(String nuevoGrupo)
{
grupo = nuevoGrupo;
}
// otras definiciones de métodos
Parámetros del método
● Parámetros: datos que un método necesita para su ejecución
● Permiten generalizar el comportamiento
int cuadrado()
{
return 10 * 10;
}
int cuadrado (int i)
{
return i*i;
}
● Parámetros (parámetros formales):
― Variables que se detallan en la cabecera del método
― El ámbito de los parámetros es el cuerpo del método
● Argumentos (parámetros reales)
― Valores concretos que se pasan para esos parámetros en
la llamada al método
Argumentos del método
● Cualquier expresión del tipo del parámetro
1. Valor literal
alumno1.ponNombre(“Pedro”);
2. Variable
alumno1.ponNombre(nombreAlumno1);
3. Operación
alumno1.ponNombre(“Pe” + finalNombre);
4. Resultado de una llamada a método
alumno1.ponNombre(alumno3.dameNombre());
Paso de parámetros
● En la llamada a un método, se copian los valores de los
argumentos en los parámetros
― Es lo que se conoce en programación como paso por valor
― Los cambios que el método haga sobre el parámetro no afectan
al valor original del atributo
― Ejemplo:
void cambiaParametro (int i)
{
i++;
}
● Si llamamos a este método:
int i = 1;
ejemplo.cambiaParametro(i);
System.out.println(i);
● Imprimirá un 1.
Resultado de la llamada al método
● Un método es ejecutado en un objeto receptor como reacción al
mensaje mandado por un objeto llamante
― El método puede devolver un resultado (respuesta al mensaje)
● Se define en la sentencia return
― Tras ejecutarse, el método termina
● Tres formas básicas de terminar un método:
1. Escribiendo la palabra reservada return seguida del valor resultante
public String dameGrupo ()
{
return grupo;
}
2. Para métodos que no devuelven resultados (tipo resultado void)
return;
3. Para métodos que no devuelven resultados (tipo resultado void,
como en caso anterior) es posible suprimir la sentencia return.
La ejecución del método termina cuando se llega al final del
cuerpo del método (})
Resultado de la llamada al método
● El valor resultado de la llamada al método puede usarse directamente
en el programa llamante
― Tipo del resultado compatible con el tipo de la variable asignada
String grupoAlumno1 = alumno1.dameGrupo();
― O bien en cualquier lugar donde se espere un valor del tipo devuelto
System.out.println(alumno1.dameGrupo());
Constructores
● Método especial que se llama para crear un objeto
● El objetivo del constructor suele ser inicializar el objeto
alumno1 = new Alumno();
―con new se reserva la memoria necesaria
―con el constructor Alumno() se inicializa el objeto
―con el operador de asignación = se asigna la dirección del objeto a
la referencia
● Caracteristicas:
―mismo nombre que la clase
―puede tener cero, uno o varios parámetros
―no devuelve ningún resultado (en realidad, devuelve el propio
objeto)
● Sintaxis del constructor
visibilidad NombreClase (listaParámetros) throws ListaExcepciones
{
//cuerpo constructor
}
Constructor por defecto
● Todas las clases necesitan al menos un constructor
―Si el programador no define ningún constructor, el compilador
crea un constructor por defecto
● El constructor por defecto no tiene parámetros
● El constructor por defecto inicializa los atributos
―Numéricos a cero
―De referencia a null
―Booleanos a false
Cuándo definir un constructor
● Cuando se dé al menos una de estas circunstancias
― Se necesitan parámetros para el estado inicial
― Construcción del objeto costosa y necesita código adicional
― Las instancias deben crearse correctamente o no crearse
en absoluto
― Se requiere que el constructor no sea público
Sobrecarga de constructores
● Se puede sobrecargar el constructor
―Varios constructores en la misma clase, pero con distintos argumentos
● Se ofrecen distintas opciones para crear el objeto
―Por ejemplo, dependiendo de la información disponible en el momento
de la creación
Ejemplo: Constructor
public class Coche
{
String matricula;
String fabricante;
String modelo;
String color;
public Coche (String m)
{
matricula = m;
}
// añadir un constructor que inicialice todos los atributos
}
public class PruebaCoche
{
public static void main (String[] args)
{
Coche c1 = new Coche (“3468 CXV”);
Coche c2 = new Coche (“4462 BIG”, “BMW”, “525i”, “Negro”);
Coche c3 = new Coche (); // Qué pasa en este caso?
}
}
Ejercicio: Constructores
● Definir una clase Rectángulo que
―Tenga dos atributos enteros, uno para cada lado
―Tenga un constructor con dos parámetros que inicialice los atributos
―Tenga un constructor con un parámetro para construir cuadrados
● Definir una clase PruebaRectángulo que compruebe el correcto
funcionamiento de los constructores
Recolector de basura
● En inglés: garbage collection
● Es necesario liberar la memoria dinámica (heap) que ya no se necesita
● En Java no hay mecanismo explícitos para destruir objetos
● El recolector de basura lo destruye si detecta que ya no se va a utilizar
― Cuando ya no quedan referencias a un objeto