Lenguaje de Programación Orientado a Objetos 2do parcial

Embed Size (px)

Citation preview

Lenguaje de Programacin Orientado a ObjetosUnidad 3. Enumeraciones3.1 Tipos de datos enumeracin (enum)A partir de la versin de Java SE 5.0 se pueden definir tipos de datos enumerados (enum) o enumeraciones que constan de diferentes elementos, especifican diversos valores por medio de identificadores y son definidos por el programador mediante la palabra reservada enum; tambin tienen un nmero finito de elementos y valores nombrados; por ejemplo, la siguiente sentencia:

enum Notas {A, B, C, D, E};

La sentencia anterior define Notas como un tipo enumerado (enum); los valores de sus elementos son A, B, C, D y E cuyos valores se denominan constantes de enumeracin o enum, se encierran entre llaves ({}) y se separan por comas; las constantes dentro de un tipo enum deben ser nicas; por ejemplo, el tipo de datos DEPORTES:

enum DEPORTES {TENIS, ESQU, FUTBOL, BALONCESTO, GOLF};

Define el tipo DEPORTES como enum y sus valores son las constantes similares: TENIS, ESQU, FUTBOL, BALONCESTO y GOLF. Cada enum es un tipo especial de clase y los valores que le pertenecen son objetos de la clase.Despus de definir un tipo de dato enum, se pueden declarar variables con referencia a tal tipo; por ejemplo:

DEPORTES miDeporte;y se le puede asignar un valor a la variable:

miDeporte=DEPORTES.TENIS;

Una variable de tipo DEPORTES slo puede contener uno de los valores listados en la declaracindel tipo de dato o el valor especial null indicando que no se establece ningn valor especfico ala variable.3.2 Enumeraciones (clases enum)El tipo de dato bsico enum se define como un conjunto de constantes que se representan como identificadores nicos; cada constante enum dentro de este tipo toma un valor especfico denominado ordinal; el de la primera constante enum es 0, el de la segunda es 1, y as sucesivamente; por consiguiente, en el tipo enum:

DiasSemana{LUNES, MARTES, MIERCOLES, JUEVES, VIERNES, SABADO, DOMINGO}

El valor ordinal de LUNES es 0 y el valor ordinal de JUEVES es 3.

Existe una relacin entre los tipos enum y las clases; las enumeraciones son un conjunto de objetos que representan un conjunto relacionado de opciones. Al igual que las clases, todos los tipos enum son de referencia y, analizando a detalle, tambin son una enumeracin en una clase de tipo enum; estas clases pueden tener mtodos, constructores y miembros dato, al igual que cualquier otra; en su declaracin, como se coment antes, ste puede contener otros componentes tales como miembros dato: constructores, mtodos y campos; adems de las constantes enumeradas.La declaracin de una clase enumeracin se realiza con la palabra reservada enum y sigue estasreglas:

1. Los tipos enumeracin se definen utilizando la palabra reservada enum, en lugar declass.2. Las constantes enum son implcitamente estticas (static).3. Los tipos enum son tcitamente del tipo final, ya que declaran constantes que no pueden modificarse.4. Una vez que se crea un tipo enumeracin se pueden declarar variables referencia de ese tipo, pero no se pueden instanciar objetos utilizando el operador new; si se intenta instanciar un objeto utilizndolo se producir un error de compilacin.5. Dado lo anterior, si existe constructor de tipo enumeracin, ste no puede ser pblico (public) porque es implcitamente privado (private).

El tipo enum tiene asociados un conjunto de mtodos que se utilizan para trabajar con tipos enumeracin; la tabla 3.1 describe alguno de ellos.

Tabla 3.1 Mtodos asociados con tipos de datos enum.MtodoDescripcin

ordinal()Describe el valor ordinal de una constanteenum

name()Devuelve el nombre del valor de enum.

values()Devuelve los valores de un tipo enum enforma de lista.

Ejemplo 3.1

Definir la clase Notas de tipo enumerado enum Notas {A, B, C, D, E};public enum Notas{A (Escala 90 a 100 puntos),B (Escala 80 a 89.99 puntos),C (Escala 70 a 79.99 puntos),D (Escala 60 a 69.99 puntos),E (Escala 0 a 59.99 puntos);private final String escala;private Notas (){escala= ;}private Notas (String cad){escala=cad;}public String leerEscala(){return escala;}}En la declaracin anterior, el tipo enumerado Notas contiene las constantes A, B, C, D, y E; una constante de nombre escala, del tipo String; y dos constructores con igual nombre que la clase y el mtodo leerEscala.

Especificaciones de la clase Notas:

1. La sentencia: A (Escala de 90 a 100 puntos) crea el objeto Notas utilizando el constructor con parmetros, con la cadena Escala 90 a 100 puntos y asigna ese objeto a la variable referencia A.2. El mtodo leerEscala se utiliza para devolver la cadena contenida en el objeto.3. No es necesario especificar el modificador private en la cabecera del constructor ya que cada uno es, implcitamente, privado; por consiguiente, los dos constructores del tipo enum tambin se podran escribir as:Notas(){escala= ;}Notas (String cad){escala=cad;}

Ejercicio 3.1El programa EnumEjemplo muestra el funcionamiento del tipo enumeracin Notas.

Public class EnumEjemplo{public static void main (String[] a){System.out.println(Escala de notas);for (Notas nt: Notas.values())System.out.println(nt+ + nt.leerEscala());System.out.println();}}

Se define la clase EnumEjemplo y, al ejecutarse, el bucle for each utiliza el mtodo values() que se asocia con los tipos enum para recuperar las constantes de numeracin como una lista; el mtodo leerEscala se utiliza para recuperar la cadena contenida en cada objeto Notas.

La ejecucin del programa producir:Escala de notasA Escala 90 a 100 puntosB Escala 80 a 89.99 puntosC Escala 70 a 79.99 puntosD Escala 60 a 69.99 puntosE Escala 0 a 59.99 puntos

UNIDAD 4 PARTE 1Lenguaje de Programacin Orientado a ObjetosUnidad 4. Clases abstractas e interfacesEsta unidad profundiza el concepto de clase y uno de sus tipos especiales: la abstracta, que agrupa caractersticas comunes de otras clases y, de la cual, no se puede instanciar objetos. Otra estructura relacionada con las clases son las interfaces; stas especifican las operaciones que debern definirse en las clases que la implementen.4.1 Aspectos de diseo relacionados con el uso y desarrollo de interfacesJava posee una notacin para describir la apariencia externa de una clase, a la cual se le llama interfaz. La descripcin de una interfaz es semejante a la de una clase, slo que sin los cuerpos de los mtodos. No se debe confundir el uso que se hace aqu de la palabra interfaz con la misma palabra que se utiliza en el trmino interfaz grfica de usuario (GUI). Las interfaces tienen dos usos: En el diseo Para promover la interoperabilidadInterfaces para el diseoCon frecuencia se hace hincapi sobre la importancia del diseo durante la planeacin inicial de un programa. Para ello hay que disear todas las clases del mismo. Una forma de documentar dicho diseo es escribir en espaol una especificacin de los nombres de las clases y sus mtodos. Pero tambin es posible escribir esta descripcin en Java.Sintaxisacceso interface NombreInterface{ constante1; constante2; tipo1 nombreMetodo1 (argumentos); Tipon nombreMetodon (argumentos);}acceso visibilidad de la interfaz definida, normalmente public.

Ejemplopublic interface Barco{ void alarma (); void msgeSocorro (String av);}4.2 Implementacin de interfacesLa interfaz especifica el comportamiento comn que tiene un conjunto de clases, el cual se realiza en cada una de ellas y se conoce como implementacin de interfaz; utiliza una sintaxis similar a la derivacin o extensin de una clase, con la palabra reservada implements en lugar de extends.class NombreClase implements NombreInterfaz{ // definicin de atributos // definicin de mtodos de la clase // definicin de mtodos de la interfaz}La clase que implementa la interfaz tiene que especificar el cdigo (la implementacin) de cada uno de sus mtodos; de no hacerlo, la clase se convierte en abstracta y debe declararse abstract; esto es una forma de obligar a que cada mtodo de la interfaz se implemente.EjemploConsidrese una jerarqua de barcos, todos tienen como comportamiento comn msgeSocorro() y alarma(); as que las clases BarcoPasaje, PortaAvion y Pesquero implementan la interfaz Barco y adems definen sus mtodos:class BarcoPasaje implements Barco{ private int eslora; private int numeroCamas=101; public BarcoPasaje() { System.out.println(Se crea objeto BarcoPasaje.); } public void alarma() { System.out.println(Alarma del barco pasajero!!!); } public void msgeSocorro(String av) { alarma(); System.out.println(SOS SOS!!! + av); }}class PortaAvion implements Barco{ private int aviones=19; private int tripulacion; public PortaAvin (int marinos) { tripulacion=marinos; System.out.println(Se crea el objeto PortaAviones.); } public void alarma() { System.out.println(marineros a sus puestos!!!); } public void msgeSocorro(String av) { System.out.println(SOS SOS!!! + av); }}class Pesquero implements Barco{ private int eslora; private double potencia; private int pescadores; private String nombre; public Pesquero (String nom) { nombre=nom; System.out.println(Se crea objeto Barco Pesquero.); } public void alarma() {System.out.println(Alarma desde el pesquero + nombre + !!!!); } public void msgeSocorro(String av) { System.out.println(SOS SOS!!!, + av); }}Mltiples interfacesJava no permite que una clase derive de dos o ms clases, es decir, no permite la herencia mltiple; sin embargo, una clase si puede implementar ms de una interfaz y tener el comportamiento comn de varias de ellas; para esto, sencillamente se escriben las interfaces separadas por comas a continuacin de la palabra reservada implements; as, la clase tiene que implementar los mtodos de todas.Sintaxisclass NombreClase implements Interfaz1, Interfaz2, , Interfazn{ // }UNIDAD 4 PARTE 2Lenguaje de Programacin Orientado a ObjetosUnidad 4. Clases abstractas e interfacesPara hacer una clase que se ajuste a una interfaz particular (o a un grupo de interfaces), se usa la palabra clave implements. Se est diciendo La interfaz contiene la apariencia, pero ahora voy a decir cmo funciona. Por lo dems, es como la herencia. El diagrama del ejemplo de los instrumentos lo muestra:

Una vez implementada una interfaz, esa implementacin se convierte en una clase ordinaria que puede extenderse de forma normal.Mltiples interfacesJava no permite que una clase derive de dos o ms clases, es decir, no permite la herencia mltiple; sin embargo, una clase si puede implementar ms de una interfaz y tener el comportamiento comn de varias de ellas; para esto, sencillamente se escriben las interfaces separadas por comas a continuacin de la palabra reservada implements; as, la clase tiene que implementar los mtodos de todas.

Sintaxisclass NombreClase implements Interfaz1, Interfaz2, , Interfazn{ // }Ejemplo

Se puede ver que Hroe combina la clase concreta PersonajeDeAccin con las interfaces PuedeLuchar, PuedeNadar y PuedeVolar. Cuando se combina una clase concreta con interfaces de esta manera, hay que poner primero la clase concreta, y despus las interfaces. (Sino, el compilador dar error.)

UNIDAD 4 PARTE 3Lenguaje de Programacin Orientado a ObjetosUnidad 4. Clases abstractas e interfacesHerencia en interfaces Es importante recordar que las interfaces se pueden organizar de forma jerrquica, de forma que los mtodos sean heredados; a diferencia de las clases que slo pueden heredar de una clase base (herencia simple), las interfaces pueden heredarse tanto como se precise; y como en las clases, tambin se utiliza la palabra reservada extends para especificar su herencia.Sintaxisinterface SuperBase1 {}interface Base1 extends SuperBase1 {}interface Base2 extends SuperBase1 {}

interface ComnDerivado extends Base1, Base2 {}

Se pueden aadir nuevas declaraciones de mtodo a una interfaz haciendo uso de la herencia, y tambin se pueden combinar varias interfaces en una nueva interfaz gracias a la herencia. En ambos casos se consigue una nueva interfaz, como se ve en el ejemplo siguiente:

MonstruoPeligroso es una simple extensin de Monstruo que produce una nueva interfaz. ste se implementa en Dragon. Vampiro es una extensin de MonstruoPeligroso y Letal.

Interfaz ComparableLa interfaz Comparable se muestra a continuacin:public interface Comparable{ int compareTo(Object other); }Esto significa que cualquier clase que implementa la interfaz Comparable requiere tener el mtodo compareTo, y el mtodo debe tomar como parmetro un objeto y regresar un entero.Cuando se ejecute x.compareTo(y), el mtodo compareTo debe ser capaz de comparar dos objetos y regresar un valor que indique si x o y es ms grande. El mtodo regresa un nmero negativo si x es ms pequea que y, cero si son iguales y un nmero positivo si x es mayor.Suponiendo que se quiere usar el mtodo sort de la clase Arrays para ordenar un arreglo de objetos Empleado. Entonces la clase Empleado debe implementar la interfaz Comparable.class Empleado implements ComparablePor supuesto, ahora la clase Empleado necesita suministrar el mtodo compareTo. Suponiendo que se quiere comparar a los empleados por su salario. El mtodo compareTo regresa -1 si el salario del primer empleado es menor que el del segundo, en caso de que sean iguales regresa 0 o 1 si el salario del segundo es menor.public int compareTo(Object otroObjeto) { Empleado otro=(Empleado)otroObjeto; if (edadotro.edad) return 1; return 0; }As que una clase que utiliza el mtodo sort para ordenar un arreglo de objetos debe implementar el mtodo compareTo. Por qu no puede la clase Empleado simplemente proveer un mtodo compareTo sin implementar la interfaz Comparable?La razn es que cuando se realiza la invocacin de un mtodo en Java, el compilador necesita verificar que realmente exista el mtodo. En algn lugar en el mtodo sort, habr sentencias como estas:if( a[i].compareTo(a[j])>0){ //reordenar a[i] y a[j]}El compilador debe saber que a[i] realmente tiene un mtodo compareTo. Si a es un arreglo de objetos cuya clase implementa Comparable, entonces se asegura la existencia del mtodo, porque cada clase que implementa la interfaz Comparable debe suministrar el mtodo.Interfaz SerializableLa serializacin de un objeto consiste en generar una secuencia de bytes lista para su almacenamiento o transmisin. Despus, mediante la deserializacin, el estado original del objeto se puede reconstruir. Para que un objeto sea serializable, debe implementar la interfaz java.io.Serializable (que lo nico que hace es marcar el objeto como serializable, sin que se tenga que implementar ningn mtodo).La serializacin es una caracterstica aadida al lenguaje Java para dar soporte a La invocacin remota de objetos (RMI) La persistenciaLa invocacin remota de objetos permite a los objetos que se localizan en otras computadoras comportarse como si estuvieran en la propia mquina. La serializacin es necesaria para trasportar los argumentos y los valores de retorno.La persistencia es una caracterstica importante de los JavaBeans. El estado de un componente es configurado durante el diseo. La serializacin permite guardar el estado de un componente en disco, abandonar el Entorno Integrado de Desarrollo (IDE) y restaurar el estado del componente cuando se vuelve a ejecutar el IDE.Un objeto se puede serializar si implementa la interfaz Serializable. Esta interfaz no declara ningn mtodo, se trata de una interfaz vaca. import java.io.*public interface Serializable {} Para que un objeto sea serializable todos sus atributos deben ser serializables. Todos los tipos primitivos en Java son serializables por defecto (igual que los arreglos y varios tipos estndar).Un ejemplo de una clase serializable se muestra a continuacin:import java.io.Serializable;public class Contacto implements Serializable{ private String nombre; private String telefono; private String email; private String direccion; private int grupo; private double deuda; public Contacto(String nombre, String telefono, String email, String direccion, int grupo, double deuda){ this.nombre=nombre; this.telefono=telefono; this.email=email; this.direccion=direccion; this.grupo=grupo; this.deuda=deuda; } public String toString(){ return nombre+", "+telefono+ ", "+email+", "+direccion+", "+grupo+", "+deuda; }}

import java.io.*;public class InterfazSerializable {

/** * @param args the command line arguments */ public static void main(String[] args) { Contacto contacto=new Contacto("Jess", "5554552913", "[email protected]", "Av. 5 de Mayo", 1, 50000); try { //Serializacin //Abrir el archivo ObjectOutputStream salida=new ObjectOutputStream (new FileOutputStream("contacto.obj")); //Escribir en el archivo salida.writeObject("Datos del contacto\n"); salida.writeObject(contacto); //Cerrar el archivo salida.close(); //Deserializacin //Abrir el archivo ObjectInputStream entrada=new ObjectInputStream(new FileInputStream("contacto.obj")); //Leer del archivo String str=(String)entrada.readObject(); Contacto obj1=(Contacto)entrada.readObject();

//Imprimir los datos del archivo System.out.println(str+" "+obj1);

//Cerrar el archivo entrada.close(); } catch (IOException ex) { System.out.println(ex);} catch (ClassNotFoundException ex) { System.out.println(ex);} try{ //espera la pulsacin de una tecla System.in.read(); } catch(Exception e){} }}

En este ejemplo la serializacin consiste en abrir un archivo contacto.obj y escribir los objetos definidos como serializables, en este caso definidos en la clase Contacto. Por otro lado, el proceso de deserializacin consiste en la lectura del archivo contacto.obj y mostrarlos correctamente. El archivo con los objetos serializados contacto.obj almacena los datos en un formato propio de Java, por lo que no se pueden leer fcilmente con un simple editor de texto (ni editar).

Unidad 4 parte4Lenguaje de Programacin Orientado a ObjetosUnidad 4. Clases abstractas e interfacesClases abstractasLas clases abstractas representan conceptos generales, engloban las caractersticas comunes de un conjunto de objetos. Persona, en un contexto laboral, es una clase abstracta que engloba las propiedades y mtodos comunes a todo tipo de individuo que trabaja para una empresa. En Java el modificador abstract declara una clase abstracta:abstract class NombreClase {// }Por ejemplo:public abstract class Persona{ private String apellido; // public void identificacin (String a, String c) {}}Se crea una clase abstracta cuando se desea manipular un conjunto de clases a travs de una interfaz comn. Las clases abstractas declaran mtodos y atributos, y normalmente tienen mtodos abstractos; estos son mtodos incompletos; tienen slo la declaracin faltndoles el cuerpo del mtodo. La sintaxis para la declaracin de un mtodo abstracto es:abstract void f();Si una clase tiene un mtodo abstracto debe declararse abstracta; una caracterstica importante de estas clases es que de ellas no se pueden definir objetos, es decir, no se puede instanciar de una clase abstracta; el compilador devuelve un error siempre que se intenta crear un objeto de dichas clases; por ejemplo;public abstract class Metal {}Metal mer=new Metal(); // error: no se puede instanciar de clase // abstractaSi se hereda de una clase abstracta y se desea hacer objetos del nuevo tipo, hay que proporcionar definiciones de mtodos para todos los mtodos que en la clase base eran abstractos. Si no se hace as (y uno puede elegir no hacerlo) entonces la clase derivada tambin ser abstracta y el compilador obligar a calificar esa clase con la palabra clave abstract.Es posible crear una clase abstracta sin incluir ningn mtodo abstracto en ella. Esto es til cuando se desea una clase en la que no tiene sentido tener mtodos abstractos, y se desea evitar que existan instancias de esa clase.La clase Instrumento puede convertirse fcilmente en una clase abstracta. Slo sern abstractos algunos de sus mtodos, puesto que hacer una clase abstracta no fuerza a hacer abstractos todos sus mtodos. Quedar del siguiente modo:

Se puede ver que realmente no hay cambios ms que en la clase base.

Ejercicio:

Crear un arreglo de la clase abstracta Figura y crear objetos de las clases concretas Rectngulo y Crculo.Ejemplo:Figura []af=new Figura [2];for (int i=0; i