gravatar

02 Curso de Java OO. Principios de la Orientacion a Objetos

Resumen:
Se estudiara el paradigma de la orientación a objetos y como se emplea en Java.

I. DEFINICION DE OBJETO.

1.1. Un nuevo paradigma
OO es un nuevo paradigma de diseño y programación
OO se basa en modelar objetos del mundo real
OO crea programas reusables
Los objetos contienen en si mismo información y comportamiento.

Que es un objeto?
Definición filosófica: Es una entidad que se puede reconocer.
Para la tecnología de objetos : Es una abstracción de un objeto del mundo real.
En términos de negocios: Es una entidad relevante al dominio del negocio.
En términos de software: Es una estructura que asocia datos y funciones.

Algunos ejemplos de objetos en POO son: Cliente, Factura, Contrato, Película. Un Cliente tiene un nombre, dirección, crédito. Un Cliente podría alquilar una película, pagar una factura, devolver una película.

Los objetos realizan operaciones.
Un objeto es útil si tiene alguna función o comportamiento en el sistema.
Cada comportamiento se denomina operación.

Objeto: Mi lapicero azul
Operación: Escribir

Objeto: El cajero automático P5
Operación: Entregar dinero.

Los objetos tiene valores.
Los objetos conocen cual es su estado actual.
Cada conocimiento del objeto se denomina atributo.

Objeto: Mi lapicero azul
Atributo: Cantidad de tinta

Objeto: El cajero automático P5
Atributo: Disponible en soles.

Los objetos son una abstracción
Todo depende del contexto.

Cuando se modela un objeto, solo se requiere modelar las operaciones y atributos que son relevantes para el problema

Objeto: Mi lapicero azul
Operación: Apuntar una pizarra.
Atributos: Longitud, Marca.

1.2. Encapsulamiento
El encapsulamiento oculta como las cosas funcionan dentro de un objeto
Solo nos comunicamos con el objeto a través sus métodos
Los métodos son una interfaz que permite ignorar como están implementados.
No es posible evadir el encapsulamiento en OO
El cajero automático P5 es un objeto que entrega dinero.
El cajero encapsula todas las operaciones a los tarjetahabientes.
Evadir este encapsulamiento es un robo al cajero.

Ejercicio

Complete con operaciones y atributos lo siguiente: 

Objeto 

Operaciones 

Atributos 

Cajero automático P5 





Universidad 





Computadora 





Auto de carreras 





DVD 





Satélite 






1.3. Relaciones entre objetos

Mensajes entre objetos.
Los objetos se comunican unos con otros enviando mensajes.
El trasmisor del mensaje pide que el receptor realice una operación.
El receptor ejecuta el método correspondiente.
En programación estructurada se invocan funciones o procedimientos.
En OO se envía un mensaje a un objeto antes que invocarse un procedimiento.
Los métodos presentan polimorfismo.






Cliente 



Transmisor 





Mensaje 


getEdad() 


Persona 

getEdad 

getNombre
getDireccion
setEdad
setNombre
setDireccion 




Edad 

Nombre 

Direccion 


Asociación entre objetos
Para que un objeto envíe un mensaje a otro, el receptor debe ser visible para el transmisor.
Esta visibilidad se da a través de enlaces.
Un objeto envía mensajes a otro invocando sus métodos.



Radar
en Tierra




Nueva posición Cambio de orbita



Monitorear



Satélite


Ejemplos:


El radar en tierra monitorea el satélite. El satélite es monitoreado por el radar en tierra.
Un cliente tiene una cuenta de ahorros. La cuenta de ahorros pertenece a un cliente.

Composición de objetos.
Los objetos están compuestos de otros objetos.
Los objetos son partes de otros objetos.
Esta relación entre objetos se conoce como Agregación


El Banco de la Nación es un objeto 

El cajero automático P5 es un objeto. 

El cajero es del Banco de la Nación. 



El cajero automático P5 esta compuesto por objetos como: 

El teclado 

El dispensador de billetes 

El lector de la tarjeta 


1.4. Clases
Una clase es una molde para crear objetos.
Para definir una clase se tiene que indicar las operaciones y atributos
Los objetos son instancias de la clase.
Cuando se cree un cajero automático P3 no se requiere indicar sus operaciones y atributos.
Solo se requiere indicar a que clase pertenece.




Clase 

Atributos 

Métodos 




Cliente 

int edad 

String nombre 

String dirección 

cambiarDireccion() 




Película 

String titulo 

double precio 

String categoria 

cambiarPrecio() 




Identificación de clases
Reconocer una estructura y comportamiento comunes entre varios objetos.


Objeto

Operaciones

Atributos



Lapicero rojo

Escribir

Recargar

Cantidad de tinta

Color de tinta



Pluma y tinta

Escribir

Recargar

Cantidad de tinta

Color de tinta


Ejercicio
A que clase pertenecen estos dos objetos?

Clases y Objetos.
Las clases son definiciones estáticas que nos permite entender todos los objetos de esa clase.
Los objetos son entidades dinámicas que existen en el mundo real y en simulaciones del mundo real.

Ejercicio
Mencione dos clases y dos objetos sobre:
1.Geografia
2.Matematicas
3.Cine
4.Biología
5.Internet

1.5. Herencia

Entre diferentes clases pueden haber similitudes
La herencia es una relación entre clases donde una es padre de otra.
Las propiedades comunes definen la superclase. Clase padre.
Las subclases heredan estas propiedades. Clase hijo.
Un objeto hijo es un-tipo-de una superclase.
Un Helicóptero es un tipo de Nave Aérea.







Nave Aérea







Jumbo



Helicóptero



Globo





Dirigible



Ejercicio
Indique que propiedades tiene la clase Nave Aérea.

1.6. Polimorfismo

Significa que la misma operación se realiza en las clases de diferente forma.
Estas operaciones tienen el mismo significado, comportamiento.
Internamente cada operación se realiza de diferente forma.



Abordar pasajeros



Barco


Tren



Helicóptero

Ejemplos

Enviar calcularIntereses a objetos como: Cuenta de Ahorros, Cuenta CTS, Cuenta Corriente.
En java se representa como: cuenta.calcularIntereses();

Ejercicio
Determine las clases, métodos, atributos y asociaciones del siguiente problema. Puede aplicar herencia o polimorfismo?

Tacora Films esta en el negocio de alquiler de películas a sus clientes. Y ahora esta automatizando el proceso de alquiler. El cliente escoge las películas en la tienda y las lleva a la caja para proceder con el alquiler. El empleado de la tienda solicita la TacoraCard al cliente para identificarlo y escanea el código de barras de cada película que esta alquilando.
Los clientes tienen que ser socios de Tacora Film Club para poder alquilar películas. Al suscribirse al club entregan datos como nombre, dirección, teléfono. TacoraCard tiene un único numero impreso que identifica al cliente.
Cada alquiler tiene un numero único para identificarlo y en el acuerdo se indica la fecha de inicio del alquiler y la lista de películas que se están alquilando. No se puede alquilar mas de 10 películas. No se sabe cuando exactamente el cliente devolverá la película.
El gerente de Tacora esta considerando emplear el mismo programa para alquilar otros artículos como libros, reproductores de VHS y de DVD, CDs de juegos.
Cada articulo tiene un precio de alquiler, numero de días que puede ser alquilado, el titulo de la película, una descripción breve, el tipo de película (Familiar, Acción, Comedia...)

2. CLASES EN JAVA

Una clase es un molde para crear múltiples objetos que encapsula datos y comportamiento.

2.1. Creación de objetos.
1.Cada objeto es una instancia de alguna clase.


Frame6





2.Los objetos se crean con el operador new.

Película pelicula1 = new Película();
Película pelicula2 = new Película();

3.El operador new realiza las siguientes acciones:
- Separa memoria para el nuevo objeto
- Invoca el método de inicio de la clase llamado constructor.
- Retorna la referencia a un nuevo objeto.



Pelicula pelicula1 =

new Pelicula();





pelicula1













Las variables primitivas almacenan valores.

Los objetos almacenan referencias


int i;


i








Pelicula pelicula1;




pelicula1











null

int j=3;

j




Pelicula pelicula2 =

new Pelicula();


pelicula2











4. La referencia null

- Los objetos inician en null
- Se puede comparar un objeto con null
- Se puede liberar la referencia con null.
Pelicula pelicula1 = null;
if (pelicula1 == null)
pelicula1 = new Pelicula();
pelicula1 = null;

5. Asignando referencias

Se puede asignar una variable referencia a otra resultado en dos referencias al mismo objeto.

Pelicula pelicula1 = new Pelicula("Betty Blue");
Película pelicula2 = pelicula1;

6. Las variables de instancia se declaran en la clase. Estos son atributos de la clase.

public class Pelicula {


public String titulo;


public String tipo;


}

7. Las variables publicas de instancia se acceden con el operador punto.


Pelicula pelicula1 = new Pelicula();
pelicula1.titulo = "Kramer vs Kramer";
if (pelicula1.titulo.equals("El planeta de los simios")


pelicula1.tipo = "Ciencia Ficcion";


2.4. Laboratorio. Uso de Objetos

Complete y realice el siguiente programa.
Pelicula.java
public class Pelicula {


public String titulo;


public String tipo;


}

PruebaPeliculas.java
public class PruebaPeliculas {


public static void main (String[] args) {


Pelicula pelicula1, pelicula2;


...


pelicula1.titulo = "Los sueños de Akira Kurosawa";


pelicula2.titulo = "Día de entrenamiento";


System.out.println("La pelicula 1 es "+ ...);


System.out.println("La pelicula 2 es "+ ...);


pelicula2 = pelicula1;


pelicula2.titulo = "Plan de Vuelo";


System.out.println("La pelicula 1 es "+ ...);


System.out.println("La pelicula 2 es "+ ...);


}


}

3. Métodos
Un método es equivalente a una función o subrutina de otros lenguajes.
Los métodos solo se definen dentro de una clase.
modificador tipoDeRetorno nombreMetodo (ListaDeArgumentos) {


// desarrollo del método;


}
3.1. Argumentos
En la definición del método se indica el tipo y el nombre de los argumentos del método.
public void setTipo (String nuevoTipo) {


tipo = nuevoTipo;


}
Si el método tiene varios argumentos, estos se separan por comas.
public void setDatos (String nuevoTitulo, String nuevoTipo) {


tipo = nuevoTipo;


titulo = nuevoTitulo;


}
Si el método no tiene argumentos, se deja solo los paréntesis
public void mostrarDetalles() {


System.out.println("El titulo es "+titulo);


System.out.println("El tipo es "+tipo);


}
3.2. Valores de retorno.
Se usa la sentencia return para salir del método retornando un valor .
No se requiere return si el tipo de retorno es void.
public class pelicula {


private String tipo;


//...


public String obtenerTipo () {


return tipo;


}


}

3.3. Recursividad

Un método recursivo es aquel que directa o indirectamente se llama a si mismo.
Como ejemplo útil se puede presentar el cálculo de factorial y sumatorias
Factorial de 0 = 1
Factorial de N = N * Factorial de N - 1
Sumatoria de 0 = 0
Sumatoria de N = N + Sumatoria de N - 1
Un método recursivo debe tener al menos un caso no recursivo y otros casos recursivos que se aproximen al caso no recursivo para evitar la recursion infinita.
Recursion.java
public class Recursion {


public static void main (String[] args) {


System.out.println( factorial(5) );


System.out.println( sumatoria(5) );


}


public static int factorial (int numero) {


if (numero == 0)


return 1;


if (numero > 0 )


return ( numero * factorial (numero – 1) );


return 0;


}


public static int sumatoria (int numero) {


if (numero == 0)


return 0;


if (numero > 0 )


return ( numero + sumatoria (numero – 1) );


return 0;


}


}


3.3.1. Fibonaci
La función Fibonaci se define como:
Fibonaci (0) = 1
Fibonaci (1) = 1
Fibonaci (N) = Fibonaci (N - 1) + Fibonaci (N - 2) // si N > 1

//
public static long fibonaci (int n) {


if (n == 0)


return 1 ;


else if ( n == 1 )


return 1 ;


else


return ( fibonaci ( n-1) + fibonaci ( n-2 ) );


}
//

3.3.2. Ackerman
La fusión de Ackerman se define como:
Ackerman(m, n) = n + 1 si m = 0
Ackerman(m, n) = Ackerman(m − 1, 1) si m > 0 y n = 0
Ackerman(m, n) = Ackerman(m − 1, Ackerman(m, n − 1)) si m > 0 y n > 0
Con ello se tiene que Ackermann(1, 2) = 4 y Ackermann(3, 2) = 29

//
public static long ackerman (int n, int m) {


if (n == 0)


return ( m+1 );


else if ( m == 0 )


return ackerman ( n-1, 1);


else


return ackerman ( n-1, ackerman ( n, m-1 ));


}
//

3.4. Invocando métodos

Se utiliza el operador punto para invocar el método de una clase, si el método es de la misma clase, no se requiere el calificador de la clase.
Laboratorio
Pelicula.java


public class Pelicula {


private String titulo,tipo;


//...


public String getTipo () {


return tipo;


}


public void setTipo (String nuevoTipo) {


tipo = nuevoTipo;


}


}



PruebaPeliculas.java


public class PruebaPeliculas {


public static void main (String[] args) {


Pelicula pelicula1 = new Pelicula();


pelicula1.setTipo("Comedia");


if (pelicula1.getTipo().equals("Drama")) {


System.out.println("La pelicula es un drama");


}


else {


System.out.println("La pelicula no es un drama");


}


}


}


3.5. Encapsulamiento

1. Las variables de instancia de una clase deberían ser declaradas como privadas
Solo un método debería acceder a las variables privadas.
No se debe acceder a las variables de instancia directamente, sino a través de un método.
Pelicula pelicula1 = new Pelicula();
if (pelicula1.titulo.equals("Los doce del patibulo")) {


pelicula1.setTipo("Accion");


}
Cual de estas líneas no cumple con el encapsulamiento?

2. Código de una clase.
Laboratorio
Pelicula.java
public class Pelicula {


private String titulo;


private String tipo;


public void setTitulo (String nuevoTitulo) {


titulo = nuevoTitulo;


}


public void setTipo (String nuevoTipo) {


tipo = nuevoTipo;


}


public String getTitulo () {


return titulo;


}


public String getTipo () {


return tipo;


}


public String toString () {


return "titulo "+titulo+" tipo "+tipo;


}


}

3.5.1 Modificadores de acceso

Java controla el acceso a las variables y métodos a través de modificadores de acceso como: private, public y protected
Un elemento publico puede invocarse en cualquier clase.
Un elemento sin modificador solo se puede invocar desde la misma clase.
Un elemento protegido solo se invocar en clases heredadas
Un elemento privado no puede ser invocado por otra clase.



Paquete alquiler

Paquete almacen



Frame5



3.5.2. Paquetes

Un paquete es un contenedor (agrupador) de clases que estan relacionadas lógicamente.
Un paquete tiene sus clases en un mismo directorio
Varias clases pueden tener el mismo nombre pero en diferente paquete.


Para el problema de los alquileres se encuentran las clases: 

      Clase Pelicula 

      Clase Contrato 

      Clase Cliente 

Paquete:  

        pe.edu.univ


Clases:   

       alquiler.Película 

       alquiler.Contrato 

       alquiler.Cliente 

Directorio:  

      C:/pe/edu/univ/ 

Archivos en C:/ pe/edu/univ/ 

      Película.java 

      Contrato.java 

      Cliente.java 





3.6. Paso de variables a métodos.
1. Cuando el argumento es una primitva, se genera una copia de la variable para el método.
Laboratorio
TestPrimitivas.java
public class TestPrimitivas {


public static void main (String[] args)


{


int numero = 150;


unMetodo(numero);


System.out.println(numero);


}


private static void unMetodo(int numero) {


numero = 0;


System.out.println(numero);


}


}
Que valores muestra el programa anterior?

2. Cuando se pasa como argumento un objeto referencia, no se genera copia. El argumento referencia al objeto original.

Laboratorio
TestReferencias.java
public class TestReferencias {


public static void main (String[] args)


{


Pelicula pelicula1 = new Pelicula();


pelicula1.setTitulo("El Resplandor");


pelicula1.setTipo("Drama");


unMetodo(pelicula1);


System.out.println(pelicula1.getTipo());


}


public static void unMetodo(Pelicula referencia) {


referencia.setTipo("Terror");


}


}
Que muestra el programa?

4. Ejercicio

1. Cree la clase Cliente con los atributos código, nombre, dirección, teléfono, encapsulados (métodos set y get).
2. Agregue a la clase Cliente el método toString que retorne todos los atributos de la clase Cliente.
3. Cree la clase Pelicula con los atributos privados código, titulo, tipo, precio de alquiler. Incluya el método toString, get y set.
4. Cree un programa como TacoraFilms.java y cree como objetos a dos clientes con datos de sus familiares. (cliente1 y cliente2)
5. Agregue al programa principal objetos de dos películas que haya visto recientemente. (pelicula1, pelicula2)
6. Al final del programa coloque lo siguiente:
System.out.println(cliente1.toString());
System.out.println(cliente2);
System.out.println(pelicula1.toString());
System.out.println(pelicula2);
Que muestra el programa?

5. PROBLEMAS DE RECURSION

Realize los siguientes ejercicios aplicacion recursion
1 Maximo Comun Divisor
El máximo común divisor de dos números por el algoritmo de Euclides es:
mcd(a, b) = mcd(b, a) si a < b
mcd(a, b) = mcd(a − b, b) si a > b
mcd(a, b) = a si a = b
Cree un metodo para esta funcion

2 Función de Morris
Se define de la siguiente manera:
morris(m, n) = m + 1 si m = n
morris(m, n) = morris (n , morris ( n-1, m + 1) ) si m <> n
Cree un metodo para esta funcion

3 Función de Hermite
Se define de la siguiente manera:
hermite(x, n) = 1 si n = 0
hermite(x, n) = 2*x si n = 1
hermite(x, n) = 2*x*hermite(x, n-1) - 2*(n-1)*hermite(x, n-2) si n > 1
Cree un metodo para esta funcion

4. Sumandos
Implemente el método void descomposición Sumandos(int n) que muestre en la pantalla todas las formas posibles de descomponer el número n en sumandos. Por ejemplo, para n=5, el la pantalla se muestra:
1+1+1+1+1
2+1+1+1
1+2+1+1
3+1+1
1+1+2+1
2+2+1
1+3+1
4+1
1+1+1+2
2+1+2
1+2+2
3+2
1+1+3
2+3
1+4
5