Está en la página 1de 9

Fundacin Universitaria Tecnolgico Comfenalco

Tecnologa en Sistemas de Informacin

1. Restriccin de Acceso en la definicin de clases


Cuando se define una clase se forma una capsula alrededor de sus miembros (atributos y mtodos). A travs de la instanciacin de la clase se crean los objetos, cada objeto encapsula todos los miembros de la clase y solo se pueden acceder por medio de una variable de referencia. Esta variable solo puede ver los miembros que tienen accesibilidad publica los dems son invisibles y no se pueden acceder. La accesibilidad se de los miembros se especifica en el momento de definir la clase y existen varios tipos: friendly: amistoso (por omisin), private: privado, protected: protegido (herencia) y public: pblico. public class reloj{ public int hora; public int minuto; public int segundo; } Capsula formada por class

public int hora; public int minuto; public int segundo;

La forma en que est definida la clase reloj crea una capsula que une los miembros bajo cualquier instancia pero permite que todos sean visibles y accesibles directamente por la variable de referencia. Reloj r = new Reloj( ); r.hora = 27; r.minuto = 77; r.segundo = - 7;

public int hora;

27 77 -7

public int minuto; public int segundo;

El control de accesibilidad a los miembros tiene como propsito garantizar la integridad de los datos (valor de los atributos) y el comportamiento (mtodos) adecuado del objeto. En el cdigo anterior se observa que al manipular directamente los atributos no hay garanta de que los valores sean correctos por lo tanto ser un objeto con informacin errnea. Para que el control de accesibilidad sea garantizado tienen que hacerse algunas restricciones a los miembros, principalmente a los atributos y dejar en manos de los mtodos la manipulacin de estos. Observemos el cambio hecho a la clase Reloj. public class Reloj{ private int hora; private int minuto; private int segundo; private boolean horaValida ( int h){ if( h >= 0 && h <= 23 ) return true; else return false; } public void setHora( int hora ){ if ( horaValida( hora) ) this.hora = hora; else System.out.println(Hora fuera de rango!); } * // Aqu el resto de mtodos } * En la primera definicin de la clase reloj por tener atributos pblicos anula la funcionalidad de los mtodos y por eso no aparecen. En la segunda definicin de la clase Reloj la accesibilidad de los atributos cambia a privado hacindose invisibles para las variables de referencia en la instanciacin de objetos, por lo tanto la nica manera segura de manipularlos es a travs de los mtodos pblicos.
Taller de programacin I Ing. Juan Jos Puello Fuentes

Fundacin Universitaria Tecnolgico Comfenalco

Tecnologa en Sistemas de Informacin

Nota: Si los mtodos fueran protegidos o privados tampoco se podran acceder, estos casos se presentan cuando los mtodos son para heredar o auxiliares para otros mtodos internos de la clase. Reloj r = new Reloj( ); Objeto Referencia

prvate int hora; private int minuto; private int segundo; private boolean horaValida(int h) public void setHora(int hora)

r.hora = 12; => Error de compilacin, miembro no accesible. r.setHora( 27 ); => No hay error de compilacin, pero en ejecucin el mtodo no acepta el valor.

El mtodo setHora verifica que el valor sea valido antes de asignar al atributo hora, en el caso contrario solo muestra un mensaje que alerta al usuario del error. Nota: El control de accesibilidad solo es externo (entre clases y paquetes), dentro de la misma clase no hay restricciones.

Laboratorio (Punto 1)
a) Completar la clase Reloj con los miembros que hagan falta para que sea funcional. Observe que hay un mtodo privado auxiliar para el mtodo setHora( ) que ayuda a comprobar la validez de la hora, realice algo similar para el resto de mtodos incluyendo constructores. Adems complete y agregue los dos mtodos a continuacin para mostrar la hora completa cuando sea requerida. El primero ser privado y mostrar la hora en formato (12 horas ampm) y el segundo es pblico y recibir como parmetro (1) si se quiere mostrar formato (12 horas am-pm) y cualquier otro valor si se quiere mostrar formato (24 horas). private void mostrarHoraFormato12( ){ String hr; if( hora == 12) hr = hora + : + minuto + : + segundo + m ; else if( hora > 12) hr = (hora - 12) + : + minuto + : + segundo + p.m ; else hr = hora + : + minuto + : + segundo + a.m ; System.out.println( hr ); } public void mostrarHora(int formato){ if (formato == 1) // Colocar aqu instruccin faltante para que funcione else Sytem.out.println(hora + : + minuto + : + segundo) }

Taller de programacin I

Ing. Juan Jos Puello Fuentes

Fundacin Universitaria Tecnolgico Comfenalco

Tecnologa en Sistemas de Informacin

b) Con la clase Reloj terminada completamente, realice la siguientes pruebas en el programa Principal public class Principal { public static void main(String [ ] arg ) { Reloj r = new Reloj(); xxxxxxxxxxxxxxxxxx; } } Remplace las xxxxxxxxxxxxxxxxxx por las instrucciones en el cuadro y escriba los resultados de compilacin y/o ejecucin, sean errores o datos de salida, en caso de error explique por qu? Instrucciones r.hora = 7; r.minuto = 37; r.segundo = 33; System.out.println(r.hora+:+r.minuto+:+r.segundo); Int h = 27; If(r.horaValida(h)){ r.setHora(h); } System.out.println(r.getHora()+:+r.getMinuto()+:+r.getSegundo()); r.setHora(27); r.setMinuto(61); r.setSegundo(60); System.out.println(r.getHora()+:+r.getMinuto()+:+r.getSegundo()); r.setHora(19); r.setMinuto(5); r.setSegundo(17); System.out.println(r.mostrarHoraFormato12()); r.setHora(19); r.setMinuto(5); r.setSegundo(17); System.out.println(r.mostrarHora(1)); System.out.println(r.mostrarHora(2)); Resultados Explicacin

Taller de programacin I

Ing. Juan Jos Puello Fuentes

Fundacin Universitaria Tecnolgico Comfenalco

Tecnologa en Sistemas de Informacin

2. Principios bsicos de herencia


La programacin orientada a objetos toma de la realidad el concepto de herencia y lo aplica su estructura de clases. El API o Application Programming Interface de Java contiene un nmero muy importante de clases que forman parte del propio lenguaje y que estn optimizadas a travs de una adecuada relacin de herencia.

Object

String

Date

File

Exception

El objetivo de este tema aprender y aprovechar la relacin de herencia en la estructura de clases del propio lenguaje java y las clases creadas por el usuario programador. La herencia permite que los miembros (atributos y mtodos) de una clase (madre, base o superClase) sean transferidos a otras clases (hijas, derivadas o subClases).

Madre

Hija -1

Hija -2

Hija -3

Hija -n

En Java siempre que se crea una clase hay un proceso de herencia implcito a partir de la clase Object, esto quiere decir que aunque no lo especifiquemos, los miembros de la clase Object pasan a hacer parte de las clases que nosotros creamos. Tenga en cuenta que esto hace a la clase object la madre de todas las clases tanto de Java como de las que nosotros creamos.

Object

Fraccionario Object
Object clone() boolean equals(Object obj) void finalize() Class getClass() int hashCode() void notify() void notifyAll() String toString() void wait()

Estudiante

Fecha Reloj

Reloj

protected Object clone() boolean equals(Object obj) protected void finalize() Class getClass() int hashCode() void notify() void notifyAll() String toString() void wait() private int hora private int minuto private int segundo private boolean horaValida(int h) public void setHora(int hora) private void mostrarHoraFormato12() public void mostrarHora(int formato)

Observe que la clase Reloj tiene los miembros de Object Mas los propios.

Taller de programacin I

Ing. Juan Jos Puello Fuentes

Fundacin Universitaria Tecnolgico Comfenalco

Tecnologa en Sistemas de Informacin

Si estudiamos los mtodos de Object los podramos utilizar en nuestros propios objetos, por ejemplo: Reloj r = new Reloj(10,40,17); System.out.println( r.toString()); => Muestra informacin relacionada con el objeto Reloj El mtodo toString() no fue especificado al momento de definir la clase Reloj, pero se puede invocar por una variable de referencia a un objeto Reloj porque la clase reloj hered todos los miembros de la clase Object. Uno de los aspectos mas importantes que podemos manejar al tener claro la relacin de herencia entre las clases, son las variables que pueden referenciar a diferentes clases de objetos. Esto solo puede suceder si hay una relacin de herencia entre las diferentes clases que instancian estos objetos. En la relacin de herencia existe una estructura jerrquica

Object

Persona

Reloj

String

Date

Estudiante

Profesor

Una variable de clase superior puede referirse a objetos de clases inferiores, por ejemplo una variable de clase Persona puede referenciar a objetos de clase Estudiante y Profesor. Esto se conoce como conversin implcita de referencias porque solo se hace la asignacin sin ningn tipo de especificacin. Persona p1 = new Estudiante(); Profesor pr = new Profesor(); Persona p2 = pr; => Una referencia de Persona guarda un Estudiante => Una referencia de Persona guarda un Profesor

Mientras mas arriba este una clase en la estructura de jerarqua sus referencias pueden referenciar todos los objetos de las clases inferiores, por lo que se deduce que una variable clase Object puede referenciar cualquier objeto. Object ob = new Estudiante(); => Una referencia de Object guarda un Estudiante

Para que son tiles estas referencias? para tener contenedores de objetos como los arreglos guardando objetos de distintas clases. Una variable o vector de clase Object puede guardar cualquier variedad de objetos.

v
Object v = new Object[5]; v[0] = new Estudiante(); v[1] = new Fecha(); v[2] = new Reloj();

0 1 2 3 4
Reloj

Estudiante

Fecha hora minuto segund o dia mes ao

codigo nombre programa

Despus de haber guardados los objetos en el vector es necesario recuperarlos para hacer las respectivas operaciones. Por ejemplo mostrar la hora en formato 12 del reloj que est referenciado por el ndice 2 de vector (v).
Taller de programacin I Ing. Juan Jos Puello Fuentes

Fundacin Universitaria Tecnolgico Comfenalco

Tecnologa en Sistemas de Informacin

V[2].mostrarHora(1); => Error en tiempo de ejecucin, el mtodo mostrarHora() no es reconocido Esta instruccin debera mostrar la hora completa en formato 12 (a.m-p.m) pero no es as, recordemos que (v) es un vector Object y que cada posicin es una referencia Object, y las referencias de una clase solo reconocen los miembros que pertenecen a su clase, por lo tanto las referencias Object solo reconocen los mtodos de su clase (equals, getClass, toString, etc.) que ahora tambin hacen parte de el objeto reloj por herencia.

v 0 1 2 3 4

Reloj
protected Object clone() boolean equals(Object obj) protected void finalize() Class getClass() int hashCode() void notify() void notifyAll() String toString() void wait() private int hora private int minuto private int segundo private boolean horaValida(int h) public void setHora(int hora) private void mostrarHoraFormato12() public void mostrarHora(int formato)

Lo que quiere decir, que lo nico que se puede hacer con esta referencia es: v[2].toString(); v[2].equals(v[1]); o cualquier otro mtodo heredado de Object. Para quitar esta restriccin y tener acceso a las funciones especificas de Reloj es necesario hacer una conversin explicita de Object a Reloj. Reloj r = v[2]; => (Error) A pesar de que en v[2] hay un Reloj la referencia (r) no lo acepta porque no se ha convertido Reloj r = (Reloj) v[2]; => La direccin que tiene v[2] es convertida a (Reloj) y despus guardada en (r) Por ser (r) una variable Reloj puede reconocer todos los miembros de la clase incluyendo los de Object.

Object

Persona

Reloj

String

Date

Estudiant e

Profesor

Siempre que una variable de una clase ubicada debajo en la estructura jerrquica de clases se le quiera asignar la direccin que tiene una variable de clase mas alta se tiene que especificar entre parntesis a cual clase se refiere. Object ob = new Estudiante(); => Aqu hay una conversin implcita pero la variable ob no es completamente funcional. Persona p = (Persona) ob; => Aqu hay una conversin explicita de Object a Persona, sigue siendo incompleta Estudiante e = (Estudiante) p; => Aqu hay una conversin explicita de Persona a Estudiante pero pudo haber sido directa de Object a Estudiante

Taller de programacin I

Ing. Juan Jos Puello Fuentes

Fundacin Universitaria Tecnolgico Comfenalco

Tecnologa en Sistemas de Informacin

En el caso de la recuperacin de la direccin de un Reloj de la posicin (2) del vector Object (v) y del Estudiante en la variable Object (ob), sabamos que objeto especficamente estaba guardado e hicimos las respectiva especificacin para la conversin, pero cuando no sabemos que objeto est referenciado en cada posicin del vector (v) o en la variable (ob) es necesario usar el operador instanceof para asegurarnos que haremos una conversin correcta. Por ejemplo si queremos mostrar todas las horas en formato 12 de los relojes guardados en el vector hacemos el siguiente cdigo: Reloj r; for(int i=0; i<5; i++){ if ( v[ i ] instanceof Reloj ){ => Verifica que lo que est en la posicin (i) del vector (v) es un objeto de clase Reloj r = ( Reloj ) v[ i ]; => Despus de hecha la verificacin se realiza la correspondiente conversin System.out.println(r.mostrarHora(1)); => Hecha la conversin (r) tiene complete dominio sobre los mtodos. } } Nota: Las variables genricas comnmente Object son muy utilizadas en el paso de parmetros de las funciones. La clausula extends es usada para herencia explicita como en el ejemplo siguiente pero este tema ser mejor tratado en el siguiente curso (Taller de programacin II). class Persona{ // Aqu no se especifica un extends pero implcitamente tiene exteneds Object private String codigo; private String nombre; public String getCodigo(){return codigo;} public String getNombre(){return nombre;} public void setCodigo(String codigo){this.codigo=codigo;} public void setNombre(String nombre){this.nombre=nombre;} } class Estudiante extends Persona{ //Aqu se espacifica un extends que adiciona los miembros de Persona a Estudiante. private String programa; public String getPrograma(){return programa;} public void setPrograma(String programa){this.programa=programa;} } class Profesor extends Persona{ //Aqu se espacifica un extends que adiciona los miembros de Persona a Profesor. private String asignatura; public String getAsignatura(){return asignatura;} public void setAsignatura(String asignatura){this.asignatura=asignatura;} }

Diagrama jerarqua de herencia para las clases anteriores


Object Persona

Estudiante

Profesor

Taller de programacin I

Ing. Juan Jos Puello Fuentes

Fundacin Universitaria Tecnolgico Comfenalco

Tecnologa en Sistemas de Informacin

Laboratorio (Punto 2)
a) De acuerdo al cdigo de las clases anteriores (Persona, Estudiante y profesor) dibuje grficos con todos sus miembros, incluyendo los heredados.

b) Escriba una lista de los miembros que podran ser reconocidos por la variable que apunta al objeto en la grafica siguiente.

Profesor
protected Object clone() boolean equals(Object obj) protected void finalize() Class getClass() int hashCode() void notify() void notifyAll() String toString() void wait() private String codigo private String nombre public String getCodigo() public String getNombre() public void setCodigo(String codigo) public void setNombre(String nombre) private String asignatura public String getAsignatura () public void setAsignatura (String asignatura) c) Desarrollar un programa java con men que haga lo siguiente: 1. Guardar estudiante 2. Guardar profesor 3. Mostrar lista estudiantes 4. Mostrar lista profesores 5. Salir. Especificaciones de diseo: Un solo Vector Object para guardar ambas clases de objetos, use el operador instanceof para poder identificar la clase de objeto en la respectiva posicin del vector y hacer el casting para los listados. Ejemplo: if ( v[ i ] instanceof Profesor ){ p = (Profesor) v [ i ]; System.out.println(p.getCodigo()+ +p.getNombre()+ +p.getAsignatura()); } v

Persona p

0 1 2 3 4
Profesor Estudiante Estudiante Profesor

Estudiante

17954007 Juan Taller 1


Taller de programacin I

08117542 Mara Sistemas

08134456 Carlos Derecho

73452586 Jos Estructura

08115321 Luisa Finanzas

Ing. Juan Jos Puello Fuentes

Fundacin Universitaria Tecnolgico Comfenalco

Tecnologa en Sistemas de Informacin

c) Clases envolventes
Como vimos en el tema anterior, cuando necesitamos guardar variedad de objetos usamos contenedores Object, como el vector de la grafica. Pero que pasa si tambin necesitamos guardar datos primitivos (int, double, char, boolean, etc.) en el mismo contenedor.

Object v = new Object[5]; v[0] = new Estudiante(); v[1] = new Fecha(); v[2] = new Reloj(); v[3] = 7; => Error de sintaxis v*4+ = @; => Error de sintaxis

0 1 2 3 4
Reloj

Estudiante

Fecha hora minuto segund o dia mes ao

codigo nombre programa

Si se trata de guardar un dato primitivo en una referencia aunque sea Object, se produce un error de compatibilidad, por lo que es necesario convertir los datos primitivos a objetos para que sean compatibles (en versiones anteriores a JDK 5). Este proceso se hace a travs de unas clases que estn contenidas en el API de java, para cada tipo primitivo existe una clase envolvente. (En versiones superiores a JDK 4, la envoltura se hace implcitamente cuando se asigna el primitivo a una variable Object.) TIPO PRIMITIVO Int float double char boolean CLASE ENVOLVENTE Integer Float Double Character Boolean

v
Object v = new Object[5]; v[0] = new Estudiante(); v[1] = new Fecha(); v[2] = new Reloj(); v[3] = new Integer(7); v[4] = new Character(@);

0 1 2 3 4 Character @ Integer 7
Reloj

Estudiante

Fecha 19 15 07 21 11 2008

08117214 Carlos Sistemas

Si observa hay una diferencia en las dos ltimas instrucciones que almacenan referencias en el vector (V) con respecto a la primera grafica, esta ltima es la forma en que quedan contenidos datos primitivos en contenedores Objects

Laboratorio (Punto 3)
Desarrolle cdigo java para almacenar nmeros enteros en un vector Object y caracteres en otro vector Object. Luego recorrer el vector con nmeros para calcular y mostrar el promedio, tambin recorrer el vector con caracteres para formar una cadena y mostrarla. Sugerencias: Hacer casting para recuperar los Objetos, use los mtodos intValue() de la clase Integer para recuperar el dato entero, charValue() de la clase Character para recuperar el dato carcter y con el smbolo + concatene los caracteres para formar la cadena (String). Investigue estos mtodos y como concatenar cadenas y caracteres.
Taller de programacin I Ing. Juan Jos Puello Fuentes

También podría gustarte