manual de prácticas poo

38
Nombre de la asignatura: Programación Orientada a Objetos. Carrera: Ingeniería en Sistemas Computacionales Clave de la asignatura: SCD-1020 (Créditos) SATCA1: 2 - 3 – 5 OBJETIVO(S) GENERAL(ES) DEL CURSO (competencias específicas a desarrollar en el curso) Diseñar e implementar objetos de programación que permitan resolver situaciones reales y de ingeniería APORTACIÓN AL PERFIL DEL EGRESADO Esta asignatura aporta al perfil del Ingeniero en Sistemas Computacionales la capacidad de analizar, desarrollar, implementar y administrar software de aplicación orientado a objetos, cumpliendo con estándares de calidad, con el fin de apoyar la productividad y competitividad de las organizaciones. TEMARIO Unidad 1 Introducción al paradigma de la programación orientado a objetos. 1.1 Elementos del modelo de objetos: clases, objetos, abstracción, modularidad, encapsulamiento, herencia y polimorfismo. 1.2 Lenguaje de modelado unificado: diagrama de clases. Unidad 2 Clases y objetos. 2.1 Declaración de clases: atributos, métodos, encapsulamiento. 2.2 Instanciación de una clase. 2.3 Referencia al objeto actual. 2.4 Métodos: declaración, mensajes, paso de parámetros, retorno de valores. 2.5 Constructores y destructores: declaración, uso y aplicaciones. 2.6 Sobrecarga de métodos. 2.7 Sobrecarga de operadores: Concepto y utilidad, operadores unarios y binarios. Unidad 3 Herencia. JOSÉ RIGOBERTO HERNÁNDEZ ALBURQUERQUE 1 MANUAL DE PRÁCTICAS POO

Upload: oscar

Post on 29-Jan-2016

99 views

Category:

Documents


2 download

DESCRIPTION

Programacion orientada a objetos

TRANSCRIPT

Page 1: Manual de Prácticas POO

Nombre de la asignatura: Programación Orientada a Objetos.

Carrera: Ingeniería en Sistemas Computacionales

Clave de la asignatura: SCD-1020

(Créditos) SATCA1: 2 - 3 – 5

OBJETIVO(S) GENERAL(ES) DEL CURSO (competencias específicas a desarrollar en el curso)

Diseñar e implementar objetos de programación que permitan resolver situaciones reales y de ingeniería

APORTACIÓN AL PERFIL DEL EGRESADO

Esta asignatura aporta al perfil del Ingeniero en Sistemas Computacionales la capacidad de analizar, desarrollar, implementar y administrar software de aplicación orientado a objetos, cumpliendo con estándares de calidad, con el fin de apoyar la productividad y competitividad de las organizaciones.

TEMARIO

Unidad 1 Introducción al paradigma de la programación orientado a objetos.

1.1 Elementos del modelo de objetos: clases, objetos, abstracción, modularidad, encapsulamiento, herencia y polimorfismo.1.2 Lenguaje de modelado unificado: diagrama de clases.

Unidad 2 Clases y objetos.

2.1 Declaración de clases: atributos, métodos, encapsulamiento.2.2 Instanciación de una clase.2.3 Referencia al objeto actual.2.4 Métodos: declaración, mensajes, paso de parámetros, retorno de valores.2.5 Constructores y destructores: declaración, uso y aplicaciones.2.6 Sobrecarga de métodos.2.7 Sobrecarga de operadores: Concepto y utilidad, operadores unarios y binarios.

Unidad 3 Herencia.

3.1 Definición: clase base, clase derivada.3.2 Clasificación: herencia simple, herencia múltiple.3.3 Reutilización de miembros heredados.3.4 Referencia al objeto de la clase base.3.5 Constructores y destructores en clases derivadas.3.6 Redefinición de métodos en clases derivadas.

Unidad 4 Polimorfismo.

4.1 Definición.4.2 Clases abstractas: definición, métodos abstractos, implementación de clases abstractas, modelado de clases abstractas.4.3 Interfaces: definición, implementación de interfaces, herencia de interfaces.

José Rigoberto hernández alburquerque 1

MANUAL DE PRÁCTICAS POO

Page 2: Manual de Prácticas POO

4.4 Variables polimórficas (plantillas): definición, uso y aplicaciones.4.5 Reutilización de código.

Unidad 5 Excepciones.

5.1 Definición.5.2 Tipos de excepciones.5.3 Propagación de excepciones.5.4 Gestión de excepciones: manejo de excepciones, lanzamiento de excepciones.5.5 Creación y manejo de excepciones definidas por el usuario.

Unidad 6 Flujos y Archivos.

6.1 Definición.6.2 Clasificación: Archivos de texto y binarios.6.3 Operaciones básicas y tipos de acceso.6.4 Manejo de objetos persistentes.

FUENTES DE INFORMACIÓN

1. Taylor David. Object Orient informations systems, planning and implementations. Canada: Wiley. 1992.2. Larman Craig. UML y patrones introducción al análisis y diseño orientado a objetos. México: Pretince Hall. 1999.3. Winblad, Ann L. Edwards, Samuel R. Software orientado a objetos. USA: Addison. Wesley/ Díaz Santos. 1993.4. Fco. Javier Ceballos. Java 2 Curso de Programación. Alfaomega.5. Agustín Froufe. Java 2 Manual de usuario y tutorial. Alfaomega.6. Laura Lemay, Rogers Cadenhead. Aprendiendo JAVA 2 en 21 días. PrenticeHall.7. Herbert Schildt. Fundamentos de Programación en Java 2. McGrawHil.8. J Deitel y Deitel. Como programar en Java. Prentice Hall.9. Stephen R. Davis. Aprenda Java Ya. McGrawHill.10. Kris Jamsa Ph D. ¡Java Ahora!. McGrawHill.11. Francisco Charte Ojeda. Visual C# .NET. ANAYA MULTIMEDIA12. Kingsley-Hughes, Kathie; Kingsley-Hughes, Adrian. C# 2005. ANAYAMULTIMEDIA13. Ceballos Francisco Javier.Enciclopedia de Microsoft Visual C#. 2ª Edición14. El lenguaje de programación C#.Fco. Javier Ceballos Sierra. Editorial Ra-ma.15. Tom Archer. A fondo C#. McGRAW-HILL/INTERAMERICANA DE ESPAÑA, S.A.U.

Unidad 1 Introducción al paradigma de la programación orientado a objetos.

1.1 Elementos del modelo de objetos: clases, objetos, abstracción, modularidad, encapsulamiento, herencia y polimorfismo.

Objeto

El termino objeto tiene el mismo significado que un nombre o una frase nominal. Es una persona, un lugar o una cosa. Ejemplos de objetos en el mundo real son: persona, tabla, computadora, avión, vuelo de avión, diccionario, ciudad o la capa de ozono. La mayoría de los objetos del mundo real tienen atributos (características que los describen). Por ejemplo, los atributos de una persona incluyen el nombre, la edad, el sexo, la fecha de nacimiento, la dirección, etc. Los objetos tienen atributos, y ellos a su vez, comportamiento. El comportamiento (Behavior) es el conjunto de cosas que puede hacer un objeto, por ejemplo, una persona puede estudiar, caminar, trabajar, etc. En síntesis, se puede decir que los objetos conocen cosas y hacen cosas. Las cosas que un objeto conoce son sus atributos; las cosas que puede hacer un objeto son su comportamiento.

José Rigoberto hernández alburquerque 2

MANUAL DE PRÁCTICAS POO

Page 3: Manual de Prácticas POO

Clase

Una clase es una caracterización abstracta de un conjunto de objetos; todos los objetos similares pertenecen a una clase determinada. Por ejemplo, un conjunto de objetos tales como cuadrados, triángulos, círculos, líneas, etc. Pertenecen a una clase figura. De modo más formal, una clase define variables (datos) y métodos (operaciones) comunes a un conjunto de objetos. En realidad, una clase es un prototipo o generador de un conjunto de objetos.

Por ejemplo, si diseñamos una clase círculo que convierte a un círculo en un tipo abstracto de dato, la clase no proporciona métodos (funciones) tales como dibujar, mover, ampliar, contraer, borrar, etc. Se pueden utilizar estos métodos para manipular objetos círculo de todas las formas esperadas. Los métodos son todo lo que se necesita conocer sobre la clase círculo.

La clase es el bloque de construcción fundamental de un lenguaje de programación orientada a objetos. Una clase es un tipo abstracto de datos junto con un conjunto de transformaciones permitidas de dicho tipo abstracto de datos. (Un tipo de dato es abstracto si las operaciones de alto nivel adecuadas a los tipos de datos están aisladas de los detalles de la implementación asociados con el tipo de datos)

Abstracción

La abstracción consiste en captar las características esenciales de un objeto, así como su comportamiento. Por ejemplo, los automóviles, ¿Qué características podemos abstraer de los automóviles? O lo que es lo mismo ¿Qué características semejantes tienen todos los automóviles? Todos tendrán una marca, un modelo, número de chasis, peso, llantas, puertas, ventanas, etc. Y en cuanto a su comportamiento todos los automóviles podrán acelerar, frenar, retroceder, etc.

En los lenguajes de programación orientada a objetos, el concepto de Clase es la representación y el mecanismo por el cual se gestionan las abstracciones.

Por ejemplo, en Java tenemos:

public class Automovil {// variables// métodos}

Modularidad

La modularidad es la propiedad que permite dividir una aplicación en partes más pequeñas (llamadas módulos ), cada una de las cuales debe ser tan independiente como sea posible de la aplicación en si y de las restantes partes.

Encapsulamiento

El encapsulamiento consiste en unir en la Clase las características y comportamientos, esto es, las variables y métodos. Es tener todo esto es una sola entidad. En los lenguajes estructurados esto era imposible. Es evidente que el encapsulamiento se logra gracias a la abstracción.

La utilidad del encapsulamiento va por la facilidad para manejar la complejidad, ya que tendremos a las Clases como cajas negras donde sólo se conoce el comportamiento pero no los detalles internos, y esto es conveniente porque nos interesará conocer qué hace la Clase pero no será necesario saber cómo lo hace.

José Rigoberto hernández alburquerque 3

MANUAL DE PRÁCTICAS POO

Page 4: Manual de Prácticas POO

Herencia

La herencia es uno de los conceptos más cruciales en la POO. La herencia básicamente consiste en que una clase puede heredar sus variables y métodos a varias subclases (la clase que hereda es llamada superclase o clase padre). Esto significa que una subclase, aparte de los atributos y métodos propios, tiene incorporados los atributos y métodos heredados de la superclase. De esta manera se crea una jerarquía de herencia.

Por ejemplo, imaginemos que estamos haciendo el análisis de un Sistema para una tienda que vende y repara equipos celulares.

En el gráfico vemos 2 Clases más que posiblemente necesitemos para crear nuestro Sistema. Esas 2 Clases nuevas se construirán a partir de la Clase Celular existente. De esa forma utilizamos el comportamiento de la SuperClase.

En general, podemos tener una gran jerarquía de Clases tal y como vemos en el siguiente gráfico:

Polimorfismo

El polimorfismo se presenta cuando se ha creado objetos que pertenecen a clases que han sido derivadas de otras clases. En otras palabras, el polimorfismo aparece en las clases derivadas.

José Rigoberto hernández alburquerque 4

MANUAL DE PRÁCTICAS POO

Page 5: Manual de Prácticas POO

También se dice que el polimorfismo es la propiedad que indica literalmente, la posibilidad de que una entidad tome muchas formas, en términos prácticos el polimorfismo permite referirse a objetos de clases distintas mediante el mismo elemento del programa y realizar la misma operación de diferentes formas, según sea el objeto que se referencia en ese momento. Por ejemplo cuando se describe la clase mamíferos se puede observar que la operación comer es una operación fundamental en la vida de los mamíferos, de modo que cada tipo de mamíferos debe poder realizar la operación o función de comer. Por otra parte, una vaca o una cabra que pasta en el campo, un niño que se come un bombón o caramelo y un león que devora a otro animal, son diferentes formas que utilizan los distintos mamíferos para realizar la misma acción.

1.2 Lenguaje de modelado unificado: diagrama de clases.

Un lenguaje de modelado es una notación gráfica para describir el diseño de software. Así mismo, el lenguaje incluye reglas para diferenciar entre dibujos correctos e incorrectos. Estas reglas son las que hacen a UML un lenguaje de modelado en vez de solo un montón de símbolos para dibujar.

Cuando una persona construye una casa no levanta muros conforme se le ocurre. Más bien, lo hace con la ayuda de planos bien detallados.

El propósito de UML es proveer los planos para el mundo del software.

Los creadores de UML, conjuntaron tres lenguajes de modelado que competían entre sí, de ahí la U(nificado) de UML

Un modelo es una abstracción de algo, con la finalidad de comprenderlo, antes de construirlo, ya que un modelo omite los detalles no esenciales, es más sencillo manejarlos, que manejar la entidad original.

Esta técnica es trilateral, ya que toma en cuenta tres puntos de vista: modelo de objetos, modelo dinámico y modelo funcional.

a) El modelo de objetos. El modelo de objetos es el modelo más importante, ya que en él se identifican las clases dentro del sistema junto con sus relaciones, así como sus atributos y operaciones, lo que representa la estructura estática del sistema. El modelo de objetos se representa mediante un diagrama de clases.

b) El modelo dinámico. Representa los aspectos temporales de comportamiento "de control" del sistema, mediante la secuencia de operaciones en el tiempo.

c) El modelo funcional. Representa los aspectos transformacionales "de función" del sistema, mediante la transformación de valores de los datos. Se representa mediante un diagrama de flujo.

Cada modelo describe un aspecto del sistema pero contiene referencias a los demás modelos. Lo cual indica que los tres no son totalmente independientes.

Los pasos para construir el modelo de objetos son los siguientes:

1. Identificación de objetos y/o clases.2. Crear un diccionario de datos.3. Identificación de las asociaciones y agregaciones entre los objetos.4. Identificación de atributos y enlaces.5. Organización y simplificación de las clases empleando herencia.6. Verificación de las vías de acceso necesarias para llevar a cabo las probables consultas.7. Realizar las iteraciones necesarias para el refinamiento del modelo.8. Agrupar las clases en módulos.

José Rigoberto hernández alburquerque 5

MANUAL DE PRÁCTICAS POO

Page 6: Manual de Prácticas POO

Modelo de objetos = Diagrama de modelo de objetos + diccionario de datos.

4.3. Representación gráfica del diseño

El diagrama de clase describe los tipos de objetos que hay en el sistema y las diversas clases de relaciones estáticas que existen entre ellos.

Hay dos tipos de relaciones estáticas principales:

Asociaciones (por ejemplo, un cliente pude rentar diversos videos)

Subtipos (una enfermera es un tipo de persona)

Los diagramas de clase también muestran los atributos y operaciones de una clase y las restricciones a que se ven sujetos, según la forma en que se conectan los objetos.

Los diversos métodos OO utilizan terminologías diferentes (y con frecuencia antagónicas) para estos conceptos.

José Rigoberto hernández alburquerque 6

MANUAL DE PRÁCTICAS POO

Page 7: Manual de Prácticas POO

Modelar relaciones entre sus clases

Dependencia

Relación (más débil que una asociación) que muestra la relación entre un cliente y el proveedor del servicio utilizado por un cliente.

Cliente: es el objeto que solicita el servicio Servidor: es el objeto que provee el servicio solicitado

Gráficamente, la dependencia se muestra con una línea discontinua con una punta de flecha que apunta del cliente al proveedor.

Ejemplo: resolución de una ecuación de segundo grado.Para resolver una ecuación de segundo grado hemos de recurrir a la función sqrt de la clase Match para calcular una raíz cuadrada.

José Rigoberto hernández alburquerque 7

MANUAL DE PRÁCTICAS POO

Page 8: Manual de Prácticas POO

Nota: La clase Match es una clase “degenerada” que no tiene estado. Es, simplemente una colección de funciones de cálculo matemático

Para resolver una ecuación de segundo grado hemos de recurrir a la función sqrt de la clase Match para calcular una raíz cuadrada.

Nota: La clase Match es una clase “degenerada” que no tiene estado. Es, simplemente una colección de funciones de cálculo matemático

Asociación

Es una relación estructural que describe una conexión entre objetos

Graficamente, se muestra como una línea contínua que une las clases relacionadas entre sí.

Aunque las asociaciones suelen ser bidireccionales (se pueden recorrer en ambos sentidos), en ocasiones es deseable hacerlas unidireccionales (restringir su navegación en un solo sentido).

Gráficamente, cuando la navegación es unidireccional, la línea termina en una punta de flecha que indica el sentido de la asociación.

José Rigoberto hernández alburquerque 8

MANUAL DE PRÁCTICAS POO

Page 9: Manual de Prácticas POO

Unidad 2 Clases y objetos.

2.1 Declaración de clases: atributos, métodos, encapsulamiento.

La programación orientada a objetos se basa en la programación de clases; a diferencia de la programación estructurada, que está centrada en las funciones.

Una clase es un molde del que luego se pueden crear múltiples objetos, con similares características.

Una clase es una plantilla (molde), que define atributos (variables) y métodos (funciones)

La clase define los atributos y métodos comunes a los objetos de ese tipo, pero luego, cada objeto tendrá sus propios valores y compartirán las mismas funciones.

Debemos crear una clase antes de poder crear objetos (instancias) de esa clase. Al crear un objeto de una clase, se dice que se crea una instancia de la clase o un objeto propiamente dicho.

La estructura de una clase es:

class [nombre de la clase] { [atributos o variables de la clase] [métodos o funciones de la clase] [main]}

Problema 1:

Confeccionar una clase que permita carga el nombre y la edad de una persona. Mostrar los datos cargados. Imprimir un mensaje si es mayor de edad (edad>=18)

Programa Persona

José Rigoberto hernández alburquerque 9

MANUAL DE PRÁCTICAS POO

Page 10: Manual de Prácticas POO

2.2 Instanciación de una clase.

Una vez que se tiene definida la clase a partir de la cual se crearán los objetos se está en la posibilidad de instanciar los objetos requeridos. 

Por ejemplo, para una clase Usuario podemos crear un objeto de la siguiente manera: 

Usuario usr1; //usr1 es una variable del tipo Usuariousr1 = new Usuario();

La primera línea corresponde a la declaración del objeto, es decir, se declara una variable del tipo de objeto deseado. 

La segunda línea corresponde a la iniciación del objeto.

El operador new 

El operador new crea una instancia de una clase asignando la cantidad de memoria necesaria de acuerdo al tipo de objeto. El operador new se utiliza en conjunto con un constructor. El operador new regresa una referencia a un nuevo objeto. 

Problema 2:

Desarrollar un programa que cargue los lados de un triángulo e implemente los siguientes métodos: inicializar los atributos, imprimir el valor del lado mayor y otro método que muestre si es equilátero o no.

Programa Triángulo

2.3 Referencia al objeto actual.

Para crear un objeto se deben realizar dos operaciones:

-           Declaración-           Instanciación

Declaración de un objeto

En la declaración se crea la referencia al objeto, de forma similar a cómo se declara una variable de un tipo primitivo.

La referencia se utiliza para manejar el objeto.

La sintaxis general para declarar un objeto en Java es:

NombreClase referenciaObjeto;

Por ejemplo, para crear un objeto de la clase Persona creamos su referencia así:

Persona p;

La referencia tiene como misión almacenar la dirección de memoria del objeto. En este momento la referencia p almacena una dirección de memoria nula (null).

Problema 3:

José Rigoberto hernández alburquerque 10

MANUAL DE PRÁCTICAS POO

Page 11: Manual de Prácticas POO

Desarrollar una clase que represente un punto en el plano y tenga los siguientes métodos: cargar los valores de x e y, imprimir en que cuadrante se encuentra dicho punto (concepto matemático, primer cuadrante si x e y son positivas, si x<0 e y>0 segundo cuadrante, etc.)

Programa Punto

2.4 Métodos: declaración, mensajes, paso de parámetros, retorno de valores.

Cuando uno plantea una clase en lugar de especificar todo el algoritmo en un único método, dividimos todas las responsabilidades de las clase en un conjunto de métodos.

Un método hemos visto que tiene la siguiente sintaxis:

public void [nombre del método]() { [algoritmo]}

Veremos que hay varios tipos de métodos:

Métodos con parámetros.

Un método puede tener parámetros:

public void [nombre del método]([parámetros]) { [algoritmo]}

Los parámetros los podemos imaginar como variables locales al método, pero su valor se inicializa con datos que llegan cuando lo llamamos.

Problema 4:

Confeccionar una clase que permita ingresar valores enteros por teclado y nos muestre la tabla de multiplicar de dicho valor. Finalizar el programa al ingresar el -1.

Programa TablaMultiplicar

Métodos que retornan un dato

Un método puede retornar un dato:

public [tipo de dato] [nombre del método]([parámetros]) { [algoritmo] return [tipo de dato]}

Cuando un método retorna un dato en vez de indicar la palabra clave void previo al nombre del método indicamos el tipo de dato que retorna. Luego dentro del algoritmo en el momento que queremos que finalice el mismo y retorne el dato empleamos la palabra clave return con el valor respectivo.

Problema 5:

José Rigoberto hernández alburquerque 11

MANUAL DE PRÁCTICAS POO

Page 12: Manual de Prácticas POO

Confeccionar una clase que permita ingresar tres valores por teclado. Luego mostrar el mayor y el menor.

Programa MayorMenor

2.5 Constructores y destructores: declaración, uso y aplicaciones.

En Java podemos definir un método que se ejecute inicialmente y en forma automática. Este método se lo llama constructor.

El constructor tiene las siguientes características:

Tiene el mismo nombre de la clase. Es el primer método que se ejecuta. Se ejecuta en forma automática. No puede retornar datos. Se ejecuta una única vez. Un constructor tiene por objetivo inicializar atributos.

Problema 6:

Se desea guardar los sueldos de 5 operarios en un vector. Realizar la creación y carga del vector en el constructor.

Programa Operarios

Problema 7:

Confeccionar una clase que represente un empleado. Definir como atributos su nombre y su sueldo. En el constructor cargar los atributos y luego en otro método imprimir sus datos y por último uno que imprima un mensaje si debe pagar impuestos (si el sueldo supera a 3000)

Programa EmpleadoFabrica

Problema 8:

Implementar la clase operaciones. Se deben cargar dos valores enteros en el constructor, calcular su suma, resta, multiplicación y división, cada una en un método, imprimir dichos resultados.

Programa OperacionesCalculo

El destructor:

El destructor se utiliza para destruir una instancia de una clase y liberar memoria. En Java no hay destructores, ya que la liberación de memoria es llevada a cabo por el Garbage Collector cuando las instancias de los objetos quedan desreferenciadas.

2.6 Sobrecarga de métodos.

Un método sobrecargado se utiliza para reutilizar el nombre de un método pero con diferentes argumentos (opcionalmente un tipo diferente de retorno). Las reglas para sobrecargar un método son las siguientes:

Los métodos sobrecargados deben cambiar la lista de argumentos

José Rigoberto hernández alburquerque 12

MANUAL DE PRÁCTICAS POO

Page 13: Manual de Prácticas POO

Pueden cambiar el tipo de retorno Pueden cambiar el modificador de acceso Pueden declarar nuevas o más amplias excepciones Un método puede ser sobrecargado en la misma clase o en una subclase

Veamos un método que se desea sobrecargar:

Public void cambiarTamaño(int tamaño, String nombre, float patron){}

Los siguientes métodos son sobrecargas legales del método cambiarTamaño():

Public void cambiarTamaño(int tamaño, String nombre){}

Public int cambiarTamaño(int tamaño, float patrón){}

Public void cambiarTamaño(float patrón, String nombre) throws IOExceptions{}

Cómo invocar un método sobre cargado:

Lo que define que método es el que se va a llamar son los argumentos que se envían al mismo durante la llamada. Si se invoca a un método con un String como argumento, se ejecutará el método que tome un String como argumento, si se manda llamar al mismo método pero con un float como argumento, se ejecutará el método que tome un float como argumento y así sucesivamente. Si se invoca a un método con un argumento que no es definido e ninguna de las versiones sobrecargadas entonces el compilador arrojará un mensaje de error.

Ejemplo de una clase con un método sobre cargado:

Programa Sobrecarga

Las palabras reservadas this y super

La palabra reservada this permite especificar que la variable que señala (y la señala haciendo this.nombreVariable) es de la misma clase en la que se usa.

La palabra reservada super sirve para indicar que una variable o un método es de la superclase (herencia ).

Programa Usuario4

2.7 Sobrecarga de operadores: Concepto y utilidad, operadores unarios y binarios.

La sobrecarga de operadores es la capacidad para transformar los operadores de un lenguaje

como por ejemplo el +, -, etc.

Cuando se dice transformar se refiere a que los operandos que entran en juego no tienen que ser

los que admite el lenguaje por defecto. Mediante esta técnica podemos sumar dos objetos creados

José Rigoberto hernández alburquerque 13

MANUAL DE PRÁCTICAS POO

Page 14: Manual de Prácticas POO

por nosotros o un objeto y un entero, en vez de limitarnos a sumar números enteros o reales, por

ejemplo.

Sorprendentemente java no lo incorpora.

A la hora de hablar de operadores vamos a distinguir entre dos tipos, los unarios y los binarios. Los unarios son aquellos que solo requieren un operando, por ejemplo a++, en este caso el operando es 'a' y el operador '++'. Los operadores binarios son aquellos que necesitan dos operadores, por ejemplo a+c , ahora el operador es '+' y los operandos 'a' y 'c'. Es importante esta distinción ya que la programación se hará de forma diferente.

Los operadores que podemos sobrecargar son los unarios, +, -, !, ~, ++, --; y los binarios +, -, *, /, %, &, |, ^, <<, >>. Es importante decir que los operadores de comparación, ==, !=, <, >, <=, >=, se pueden sobrecargar pero con la condición que siempre se sobrecargue el complementario, es decir, si sobrecargamos el == debemos sobrecargar el !=

Unidad 3 Herencia.

3.1 Definición: clase base, clase derivada.

La herencia significa que se pueden crear nuevas clases partiendo de clases existentes, que tendrán todos los atributos y los métodos de su 'superclase' o 'clase padre' y además se le podrán añadir otros atributos y métodos propios.

Clase padre

Clase de la que desciende o deriva una clase. Las clases hijas (descendientes) heredan (incorporan) automáticamente los atributos y métodos de la la clase padre.

Subclase

Clase descendiente de otra. Hereda automáticamente los atributos y métodos de su superclase. Es una especialización de otra clase. Admiten la definición de nuevos atributos y métodos para aumentar la especialización de la clase.

Ejercicio de Herencia resuelto: La empresa informática “IPM Tech” necesita llevar un registro de todos sus empleados que se encuentran en la oficina central, para eso ha creado un diagrama de clases que debe incluir lo siguiente:

1) Empleado

Atributos:

- nombre: tipo cadena (Debe ser nombre y apellido) - cedula: tipo cadena - edad : entero (Rango entre 18 y 45 años) - casado: boolean - salario: tipo numérico doble

Métodos:- Constructor con y sin parámetros de entrada

José Rigoberto hernández alburquerque 14

MANUAL DE PRÁCTICAS POO

Page 15: Manual de Prácticas POO

- Método que permita mostrar la clasificación según la edad de acuerdo al siguiente algoritmo: Si edad es menor o igual a 21, Principiante Si edad es >=22 y <=35, Intermedio Si edad es >35, Senior.-

- Imprimir los datos del empleado por pantalla (utilizar salto de línea \n para separar los atributos.

- Un método que permita aumentar el salario en un porcentaje que sería pasado como parámetro al método.

2. Programador (Especialización de Empleado). Clase que hereda de Empleado todos los atributos y métodos.

- Atributos:

- lineasDeCodigoPorHora : tipo entero

- lenguajeDominante: tipo cadena

- Métodos:

- Constructor con y sin parámetros de entrada.

SOLUCION:

Primero debe definirse la clase Empleado con los atributos señalados en el examen, se definen los métodos con las acciones pertinentes. Posteriormente se define la clase Programador como hija de la clase Empleado, con sus atributos y métodos correspondientes. Cuando se hace referencia a la clase padre se antepone al atributo la palabra super. La palabra this sirve para referenciar el objeto actual.

Programa Empleado

3.2 Clasificación: herencia simple, herencia múltiple.

Hay dos tipos de herencia: Herencia Simple y Herencia Múltiple. La primera indica que se pueden definir nuevas clases solamente a partir de una clase inicial mientras que la segunda indica que se pueden definir nuevas clases a partir de dos o más clases iniciales. Java sólo permite herencia simple.

Herencia Simple

Herencia Múltiple

José Rigoberto hernández alburquerque 15

MANUAL DE PRÁCTICAS POO

Page 16: Manual de Prácticas POO

3.3 Reutilización de miembros heredados.

La reutilización de código se refiere al comportamiento y a las técnicas que garantizan que una parte o la totalidad de un programa informático existente se pueda emplear en la construcción de otro programa. De esta forma se aprovecha el trabajo anterior, se economiza tiempo, y se reduce la redundancia.

La manera más fácil de reutilizar código es copiarlo total o parcialmente desde el programa antiguo al programa en desarrollo. Pero es trabajoso mantener múltiples copias del mismo código, por lo que en general se elimina la redundancia dejando el código reusable en un único lugar, y llamándolo desde los diferentes programas. Este proceso se conoce como abstracción. La abstracción puede verse claramente en las bibliotecas de software, en las que se agrupan varias operaciones comunes a cierto dominio para facilitar el desarrollo de programas nuevos. Hay bibliotecas para convertir información entre diferentes formatos conocidos, acceder a dispositivos de almacenamiento externos, proporcionar una interfaz con otros programas, manipular información de manera conocida (como números, fechas, o cadenas de texto).

Programa Vehículo

abstract (palabra clave).

Una clase abstracta es aquella que posee al menos un método abstracto. Un método abstracto es aquél que está declarado, pero que no posee implementación alguna (es decir no tiene cuerpo). Está incompleto. Debido a esta carencia, es imposible declarar objetos de una clase abstracta. ¿Para qué sirve entonces una clase abstracta? Una clase abstracta sirve para establecer un marco de trabajo que deben cumplir todas las clases que hereden de ella. Las clases que heredan de ella sí deben dotar de una implementación a los métodos abstractos del padre. Si no lo hacen, automáticamente se convierten también en abstractas. También es posible definir una clase abstracta sin que posea métodos abstractos.

3.4 Referencia al objeto de la clase base

Consideremos las figuras planas cerradas como el rectángulo, y el círculo. Tales figuras comparten características comunes como es la posición de la figura, de su centro, y el área de la figura, aunque el procedimiento para calcular dicha área sea completamente distinto. Podemos por tanto, diseñar una jerarquía de clases, tal que la clase base denominada Figura, tenga las características comunes y cada clase derivada las específicas.

La clase Figura es la que contiene las características comunes a dichas figuras concretas por tanto, no tiene forma ni tiene área. Esto lo expresamos declarando Figura como una clase abstracta, declarando la función miembro área abstract.

Las clases abstractas solamente se pueden usar como clases base para otras clases. No se

José Rigoberto hernández alburquerque 16

MANUAL DE PRÁCTICAS POO

Page 17: Manual de Prácticas POO

pueden crear objetos pertenecientes a una clase abstracta. Sin embargo, se pueden declarar variables de dichas clases.

En el juego del ajedrez podemos definir una clase base denominada Pieza, con las características comunes a todas las piezas, como es su posición en el tablero, y derivar de ella las características específicas de cada pieza particular. Así pues, la clase Pieza será una clase abstracta con una función abstract denominada mover, y cada tipo de pieza definirá dicha función de acuerdo a las reglas de su movimiento sobre el tablero.

La clase Figura

La definición de la clase abstracta Figura, contiene la posición x e y de la figura particular, de su centro, y la función área, que se va a definir en las clases derivadas para calcular el área de cada figura en particular.

El modificador de acceso protected

El modificador de acceso protected es una combinación de los accesos que proporcionan los modificadores public y private. protected  proporciona acceso público para las clases derivadas y acceso privado (prohibido) para el resto de clases.

Por ejemplo, si en la clase Empleado definimos:

class Empleado {    protected int sueldo;    . . .}

Dado que un Ejecutivo es un Empleado, entonces desde la clase Ejecutivo se puede acceder al dato miembro sueldo, mientras que si se declara private no.

Programa Figura

3.5 Constructores y destructores en clases derivadas.

Constructores en clases derivadas.

Al instanciar objetos de clases derivadas se inicia una cadena de invocaciones a constructores en las cuales el constructor de la clase derivada, antes de realizar sus propias tareas, invoca (ya sea implícita o explícitamente) al constructor de su clase base. Similarmente, si la clase base fue derivada de otra clase, el constructor de la clase base debe invocar al constructor de la clase ubicada en el siguiente nivel superior de la jerarquía, y así sucesivamente. El último constructor invocado en la cadena es el constructor de la clase Object, cuyo cuerpo se ejecuta primero. El cuerpo del constructor de la clase derivada se ejecuta al final. El constructor de cada clase base inicializa las variables de instancia que el objeto de la clase derivada hereda.

Destructores en clases derivadas.

Cuando remueve de la memoria un objeto de una clase derivada, el recolector de basura invoca al destructor del objeto. Esto inicia una cadena de invocaciones a destructores, en donde el destructor de la clase derivada y los destructores de las clases bases directas e indirectas se

José Rigoberto hernández alburquerque 17

MANUAL DE PRÁCTICAS POO

Page 18: Manual de Prácticas POO

ejecutan en orden inverso al que se ejecutaron los constructores, esto es, primero se ejecuta el destructor de la clase derivada y al final se ejecuta el destructor de la clase base ubicada en el nivel superior de la jerarquía. La ejecución de los destructores debe liberar todos los recursos que el objeto adquirió, antes de que el recolector de basura reclame la memoria de ese objeto.

Cuando el recolector de basura invoca al destructor de un objeto de una clase derivada, ese destructor realiza su tarea y después invoca al destructor de la clase base. El proceso se repite hasta que se invoca al destructor de la clase Object.

3.6 Redefinición de métodos en clases derivadas.

El lenguaje java permite redefinir miembros de la clase base en las clases derivadas, pero el compilador emite una advertencia cuando detecta una redefinición. Una advertencia (warning) es un mensaje del compilador acerca de un posible problema. Sin embargo, en este caso sí se genera código ejecutable (a diferencia del mensaje de error).

El siguiente ejemplo muestra cómo reutilizar los identificadores de los campos de la clase base en una clase derivada. NO PROGRAMAR

// Redef.cs : Ejemplifica la redefinición de campos en clases derivadas.

class Punto{

public int x;

public int y;

}

class Punto3D : Punto{

public int x ;

public int y ;

public int z ;

}

class Principal{

public static void Main( ) {

Punto a = new Punto( ); Punto3D b = new Punto3D( );

a.x = 100 ;

a.y = 200 ;

b.x = 300 ;

b.y = 400 ;

b.z = 500 ;

}

José Rigoberto hernández alburquerque 18

MANUAL DE PRÁCTICAS POO

Page 19: Manual de Prácticas POO

}

Unidad 4 Polimorfismo

4.1 Definición.

El polimorfismo consiste en obtener un mismo método con diferentes funciones, es decir, suponiendo que tengamos una clase Saludo con el método Saludo el cual sería su constructor, pero en este caso tendríamos varios constructores pero siempre siguiendo las reglas de independencia en cuestión a los parámetros de cada constructor para que así puedan diferenciarse uno de otro, sin embargo cada uno tendrá diferentes procesos internos en sí mismo.

Programa Saludo

4.2 Clases abstractas: definición, métodos abstractos, implementación de clases abstractas, modelado de clases abstractas.

Una clase que declara la existencia de métodos pero no la implementación de dichos métodos (o sea, las llaves { } y las sentencias entre ellas), se considera una clase abstracta.

Una clase abstracta puede contener métodos no-abstractos pero al menos uno de los métodos debe ser declarado abstracto.

Para declarar una clase o un metodo como abstractos, se utiliza la palabra reservada abstract.

abstract class Drawing{ abstract void miMetodo(int var1, int var2); String miOtroMetodo( ){ ... }}

4.3 Interfaces: definición, implementación de interfaces, herencia de interfaces.

Una interface es una variante de una clase abstracta con la condición de que todos sus métodos deben ser asbtractos. Si la interface va a tener atributos, éstos deben llevar las palabras reservadas static final y con un valor inicial ya que funcionan como constantes por lo que, por convención, su nombre va en mayúsculas.

interface Nomina{ public static final String EMPRESA = "Patito, S. A."; public void detalleDeEmpleado(Nomina obj);}

Una clase implementa una o más interfaces (separadas con comas ",") con la palabra reservada implements. Con el uso de interfaces se puede "simular" la herencia múltiple que Java no soporta.

class Empleado implements Nomina{ ...}

En este ejemplo, la clase Empleado tiene una clase padre llamada Object (implícitamente) e implementa a la interface Nomina, quedando el diagrama de clases de la siguiente manera:

José Rigoberto hernández alburquerque 19

MANUAL DE PRÁCTICAS POO

Page 20: Manual de Prácticas POO

La clase que implementa una interface tiene dos opciones:

1) Implementar todos los métodos de la interface.

2) Implementar sólo algunos de los métodos de la interface pero esa clase debe ser una clase abstracta (debe declararse con la palabra abstract).

4.4 Variables polimórficas (plantillas): definición, uso y aplicaciones.

En Java, las variables que contienen objetos son variables polimórficas. El término «polimórfico» (literalmente: muchas formas) se refiere al hecho de que una misma variable puede contener objetos de diferentes tipos (del tipo declarado o de cualquier subtipo del tipo declarado). El polimorfismo aparece en los lenguajes orientados a objetos en numerosos contextos, las variables polimórficas constituyen justamente un primer ejemplo.

4.5 Reutilización de código

Lo primero que se les viene a la cabeza a los estudiantes cuando se les menciona la reutilización del código es el famoso copiar y pegar, lo cual es una de las practicas que más encarece el desarrollo de software. Como todo en Java, el problema se resuelve con las clases. Para reutilizar el código creamos nuevas clases pero, en lugar de partir de cero, partimos de clases, relacionadas con nuestra clase, que han sido ya creadas y depuradas.

Una forma de hacer esto es crear objetos de nuestras clases existentes dentro de la nueva clase. Esto se conoce como composición porque la nueva clase está compuesta de objetos de clases existentes. Estamos reutilizando la funcionalidad del código, y no la forma.

Otra forma es crear una nueva clase como un tipo de una clase ya existente. Tomamos la forma de la clase existente y añadimos código a la nueva, sin modificar la clase existente. Esta forma de crear nuevos objetos se llamada herencia, y lo que hacemos es extender la clase en la que nos basamos para crear la nueva.Composición:

Recordemos que la forma para determinar cuándo usar composición es cuando podemos decir que nuestra nueva clase “tiene un” elemento de otro tipo de objetos, por ejemplo un cronómetro tiene: horas, minutos y segundos, es decir que una clase Cronometro está compuesta por otras clases llamadas: Horas, Minutos y Segundos.

Unidad 5 Excepciones.

5.1 Definición.

José Rigoberto hernández alburquerque 20

MANUAL DE PRÁCTICAS POO

Page 21: Manual de Prácticas POO

Las excepciones son el mecanismo por el cual pueden controlarse en un programa Java las condiciones de error que se producen. Estas condiciones de error pueden ser errores en la lógica del programa como un índice de un array fuera de su rango, una división por cero o errores disparados por los propios objetos que denuncian algún tipo de estado no previsto, o condición que no pueden manejar. 

La idea general es que cuando un objeto encuentra una condición que no sabe manejar crea y dispara una excepción que deberá ser capturada por el que le llamó o por alguien más arriba en la pila de llamadas. Las excepciones son objetos que contienen información del error que se ha producido y que heredan de la clase Throwable o de la clase Exception. Si nadie captura la excepción interviene un manejador por defecto que normalmente imprime información que ayuda a encontrar quién produjo la excepción. 

5.2 Tipos de excepciones.

En Java, todas las excepciones estan consideradas en el de árbol de excepciones que se deriva de la clase Throwable. Existen dos subclases directas de Throwable: Error y Exception. En la figura se observa parte de la jerarquía de clases derivada de Throwable:

La clase Error está relacionada con errores de la máquina virtual de Java y no el código, generalmente estos errores no dependen del programador por lo que no debe preocuparse por tratarlos.

En la clase Exception se encuentran las excepciones RuntimeException, producidas por errores de programación. El compilador de Java obliga a corregirlas.

En resumen las excepciones son generadas de tres formas diferentes: 1) La máquina Virtual de Java puede generar una excepción como producto de un error interno que está fuera de su control. Estas excepciones generalmente no pueden ser manejadas por el programa.

2) Excepciones estándar: Son excepciones que deben ser manipuladas, se producen cuando se ejecuta una división por cero o se trata de acceder a un arreglo con un índice fuera de límites son generadas por errores en el código del programa

3) El programador puede generar una excepción manualmente utilizando la estructura throw. Sin importar cómo se produjo la excepción, se maneja de la misma forma.

5.3 Propagación de excepciones.

José Rigoberto hernández alburquerque 21

MANUAL DE PRÁCTICAS POO

Page 22: Manual de Prácticas POO

Las instrucciones que tenemos dentro de un bloque  try a menudo contienen llamadas a métodos que a su vez pueden realizar llamadas a otros métodos y así sucesivamente. Cualquiera de los métodos llamados puede provocar una excepción y cualquiera de los métodos puede, o no, tratarla (con bloques catch).

Una excepción no tratada en un bloque se propaga hacia el bloque llamante. Este mecanismo de propagación continúa mientras no se trate la excepción o se llegue al método de nivel superior. Si la excepción no se trata en el método de nivel superior, se imprime un mensaje de error por consola.

5.4 Gestión de excepciones: manejo de excepciones, lanzamiento de excepciones.

Cuando se produce un error en un método, este crea un objeto 'exception' el cual contiene información sobre la excepción como el tipo de excepción y el estado del programa al presentarse el problema. El sistema de ejecución es el responsable de buscar algún bloque de código que maneje la excepción. En la terminología de java, al hecho de crear una objeto exception y manejarlo por el sistema de ejecución se le conoce como lanzar una excepción (throwing an exception).

Bloque try/catch

El núcleo del manejo de excepciones son los bloques try y catch. A continuación se muestra la forma general del manejo de bloques de excepción try/catch:

Cuando un segmento de código lanza una excepción, esta es atrapada por su correspondiente manejador catch. En un mismo bloque de instrucciones se puede generar más de una excepción, por lo que puede haber más de un bloque catch asociado a un solo try. La ejecución de catch no es como llamar a una función, es decir, después de ejecutar catch la ejecución del programa no regresa a donde se generó la excepción, sino que el flujo del programa continúa después del bloque catch

El siguiente programa genera una excepción al momento de su ejecución:

José Rigoberto hernández alburquerque 22

MANUAL DE PRÁCTICAS POO

Page 23: Manual de Prácticas POO

La excepción generada es:

Agregando el código para el manejo de la excepción al mismo programa tenemos:

Ahora al producirse la excepción sigue las acciones especificadas en el bloque catch, es este caso, la acción consiste en mandar un mensaje.

Programa PruebaExcepcionCorregida (es el de arriba)

Vamos a crear un programa que divida dos números. Supongamos que los números se introducen én dos controles de edicion. Se obtiene el texto de cada uno de los controles de edición que se guardan en dos strings. En esta situación se pueden producir dos excepciones NumberFormatException, si se introducen caracteres no numéricos y ArithmeticException si se divide entre cero.

Programa ExcepcionApp

5.5 Creación y manejo de excepciones definidas por el usuario.

Las excepciones definidas por el usuario permiten que el programador manipule los errores de la aplicación para mostrar respuestas personalizadas. Crear estas funciones permite que una aplicación sea más sencilla de comprender y fácil de usar.

Las excepciones predefinidas cubren las situaciones de error más habituales con las que nos podemos encontrar, relacionadas con el propio lenguaje y el hardware.

Imaginemos una aplicación informática que controla la utilización de los columpios de esquís. Los pases de acceso dispondrán de un código de barras que los identifica. En ciertas ocasiones nos encontraremos con situaciones anómalas:

1. Código de barras ilegible2. Código de barras no valido (pase caducado)3. Código de barras utilizado en otro columpio en un periodo de tiempo demasiado breve

José Rigoberto hernández alburquerque 23

MANUAL DE PRÁCTICAS POO

Page 24: Manual de Prácticas POO

Ninguna de las situaciones anteriores se puede detectar utilizando excepciones predefinidas porque su naturaleza está estrechamente relacionada con los detalles de la aplicación, por lo que tendremos que hacer uso de excepciones definidas por nosotros mismos.

En POO lo más adecuado es que las excepciones sean objetos, por lo que en Java definiremos las excepciones como clases. Nuestras clases de excepción en general heredaran de la clase Exception

En las clases que creemos a partir de Excepction, incluiremos al menos el constructor vacío y otro que contenga un String como argumento. Este String se inicializa automáticamente con el nombre de la clase; la inicialización se realiza en la super clase Throwable. El texto que pongamos al hacer unos del segundo constructor se añadirá al nombre de la clase insertado en la super clase.

Programa ExPropia

Unidad 6 Flujos y Archivos.

6.1 Definición

En java la entrada de los datos se realiza mediante un flujo de entrada. Ej: el teclado, un archivo, una comunicación de red, un objeto de internet, etc.

La salida de datos se realiza mediante un flujo de salida. Ej: Un archivo, en pantalla, en una impresora, etc.

Lectura de Datos con BufferedReader

En Java existen dos maneras básicas para la lectura o introducción de datos por medio del teclado, éstas son utilizando el método BufferedReader o utilizando un objeto de la clase Scanner.

■ BufferedReader

Para utilizar el método BufferedReader debemos importar los paquetes:

BufferedReader InputStreamReader IOException

Esto es porque necesitamos crear un objeto del tipo BufferedReader el cual recibe como parámetro un objeto de la clase InputStreamReader. El uso del BufferedReader requiere forzosamente del manejo de excepciones por ello también es necesario importar la clase IOException.

• Declaración del objeto BufferedReader:

BufferedReader br = new BufferedReader (new InputStreamReader (System.in));

• Lectura y almacenado en una variable:

dato = br.readLine();

BufferedReader.readLine()

Lee una línea de texto hasta que encuentra un carácter de salto de línea (\n) y retorno de carro (\r).

José Rigoberto hernández alburquerque 24

MANUAL DE PRÁCTICAS POO

Page 25: Manual de Prácticas POO

Sintaxis:

String readLine()

Programa SumarDatosTeclado

6.2 Clasificación: Archivos de texto y binarios.

Los archivos de texto plano son aquellos que están compuestos únicamente por texto sin formato, solo caracteres. estos caracteres se pueden codificar de distintos modos dependiendo de la lengua usada. Se les conoce también como archivos de texto llano o texto simple por carecer de información destinada a generar formatos y tipos de letra.

Un archivo binario es un archivo informático que contiene información de cualquier tipo, codificada en forma binaria para el propósito de almacenamiento y procesamiento de ordenadores.

Muchos formatos binarios contienen partes que pueden ser interpretados como texto. Un archivo binario que solo contiene información de tipo textual sin información sobre el formato del mismo, se dice que es un archivo de texto plano. Habitualmente se contraponen los términos archivo binario y archivo de texto de forma que los primeros no contienen solamente texto.

6.3 Operaciones básicas y tipos de acceso.

Normalmente, cuando se codifica un programa, se hace con la intención de que ese programa pueda interactuar con los usuarios del mismo, es decir, que el usuario pueda pedirle que realice cosas y pueda suministrarle datos con los que se quiere que haga algo. Una vez introducidos los datos y las órdenes, se espera que el programa manipule de alguna forma esos datos para proporcionarnos una respuesta a lo solicitado.

Además, en muchas ocasiones interesa que el programa guarde los datos que se le han introducido, de forma que si el programa termina los datos no se pierdan y puedan ser recuperados

José Rigoberto hernández alburquerque 25

MANUAL DE PRÁCTICAS POO

Page 26: Manual de Prácticas POO

en una sesión posterior. La forma más normal de hacer esto es mediante la utilización de ficheros que se guardarán en un dispositivo de memoria no volátil (normalmente un disco).

A todas estas operaciones, que constituyen un flujo de información del programa con el exterior, se les conoce como Entrada/Salida (E/S).

Existen dos tipos de E/S; la E/S estándar que se realiza con el terminal del usuario y la E/S a través de fichero, en la que se trabaja con ficheros de disco.

Todas las operaciones de E/S en Java vienen proporcionadas por el paquete estándar de la API de Java denominado java.io que incorpora interfaces, clases y excepciones para acceder a todo tipo de ficheros.

Entrada/Salida estándar

El acceso a la entrada y salida estándar es controlado por tres objetos que se crean automáticamente al iniciar la aplicación: System.in, System.out y System.err

a.) System.in

Este objeto implementa la entrada estándar (normalmente el teclado). Los métodos que nos proporciona para controlar la entrada son:

read(): Devuelve el carácter que se ha introducido por el teclado leyéndolo del buffer de entrada y lo elimina del buffer para que en la siguiente lectura sea leído el siguiente carácter. Si no se ha introducido ningún carácter por el teclado devuelve el valor -1.

skip(n): Ignora los n caracteres siguientes de la entrada.

b.) System.out

Este objeto implementa la salida estándar. Los métodos que nos proporciona para controlar la salida son:

print(a): Imprime a en la salida, donde a puede ser cualquier tipo básico Java ya que Java hace su conversión automática a cadena.

println(a): Es idéntico a print(a) salvo que con println() se imprime un salto de línea al final de la impresión de a.

c.) System.err

Este objeto implementa la salida en caso de error. Normalmente esta salida es la pantalla o la ventana del terminal como con System.out, pero puede ser interesante redirigirlo, por ejemplo hacia un fichero, para diferenciar claramente ambos tipos de salidas.

Las funciones que ofrece este objeto son idénticas a las proporcionadas por System.out.

Ejemplo

A continuación vemos un ejemplo del uso de estas funciones que acepta texto hasta que se pulsa el retorno de carro e informa del número de caracteres introducidos.

Programa CuentaCaracteres

Entrada/Salida por fichero

José Rigoberto hernández alburquerque 26

MANUAL DE PRÁCTICAS POO

Page 27: Manual de Prácticas POO

Tipos de ficheros

En Java es posible utilizar dos tipos de ficheros (de texto o binarios) y dos tipos de acceso a los ficheros (secuencial o aleatorio).

Los ficheros de texto están compuestos de caracteres legibles, mientras que los binarios pueden almacenar cualquier tipo de datos (int, float, boolean,...).

Una lectura secuencial implica tener que acceder a un elemento antes de acceder al siguiente, es decir, de una manera lineal (sin saltos). Sin embargo los ficheros de acceso aleatorio permiten acceder a sus datos de una forma aleatoria, esto es indicando una determinada posición desde la que leer/escribir.

Sólo vamos a tratar las tres principales:

FileOutputStream: Fichero de salida de texto. Representa ficheros de texto para escritura a los que se accede de forma secuencial.

FileInputStream: Fichero de entrada de texto. Representa ficheros de texto de sólo lectura a los que se accede de forma secuencial.

RandomAccessFile: Fichero de entrada o salida binario con acceso aleatorio. Es la base para crear los objetos de tipo fichero de acceso aleatorio. Estos ficheros permiten multitud de operaciones; saltar hacia delante y hacia atrás para leer la información que necesitemos en cada momento, e incluso leer o escribir partes del fichero sin necesidad de cerrarlo y volverlo a abrir en un modo distinto.

Generalidades

Para tratar con un fichero siempre hay que actuar de la misma manera:

1. Se abre el fichero.   Para ello hay que crear un objeto de la clase correspondiente al tipo de fichero que vamos a manejar, y el tipo de acceso que vamos a utilizar:

TipoDeFichero obj = new TipoDeFichero( ruta );

Donde ruta es la ruta de disco en que se encuentra el fichero o un descriptor de fichero válido. Este formato es válido, excepto para los objetos de la clase RandomAccessFile(acceso aleatorio), para los que se ha de instanciar de la siguiente forma:

RandomAccessFile obj = new RandomAccessFile( ruta, modo );

Donde modo es una cadena de texto que indica el modo en que se desea abrir el fichero; "r" para sólo lectura o "rw" para lectura y escritura.

2. Se utiliza el fichero.   Para ello cada clase presenta diferentes métodos de acceso para escribir o leer en el fichero.

3. Gestión de excepciones (opcional, pero recomendada)   Se puede observar que todos los métodos que utilicen clases de este paquete deben tener en su definición una cláusulathrows IOException. Los métodos de estas clases pueden lanzar excepciones de esta clase (o sus hijas) en el transcurso de su ejecución, y dichas excepciones deben de ser capturadas y debidamente gestionadas para evitar problemas.

José Rigoberto hernández alburquerque 27

MANUAL DE PRÁCTICAS POO

Page 28: Manual de Prácticas POO

4. Se cierra el fichero y se destruye el objeto.   Para cerrar un fichero lo que hay que hacer es destruir el objeto. Esto se puede realizar de dos formas, dejando que sea el recolector de basura de Java el que lo destruya cuando no lo necesite (no se recomienda) o destruyendo el objeto explícitamente mediante el uso del procedimiento close() del objeto:

obj.close()

La clase FileOutputStream

Mediante los objetos de esta clase escribimos en ficheros de texto de forma secuencial.

Presenta el método write() para la escritura en el fichero. Presenta varios formatos:

int write( int c ): Escribe el carácter en el fichero. int write( byte a[] ): Escribe el contenido del vector en el fichero. int write( byte a[], int off, int len ): Escribe len caracteres del vector a en el fichero, comenzando desde la posición off.

La clase FileInputStream

Mediante los objetos de esta clase leemos de ficheros de texto de forma secuencial.

Presenta el método read() para la lectura del fichero. Este método se puede invocar de varias formas.

int read(): Devuelve el siguiente carácter del fichero.

int read( byte a[] ): Llena el vector a con los caracteres leídos del fichero. Devuelve la longitud del vector que se ha llenado si se realizó con éxito o –1 si no había suficientes caracteres en el fichero para llenar el vector.

int read( byte a[], int off, int len ): Lee len caracteres del fichero, insertándolos en el vector a.

Todos ellos devuelven -1 si se ha llegado al final del fichero (momento de cerrarle).

El siguiente ejemplo muestra el fichero de texto "/carta.txt" en pantalla:

Programa CrearCarta

La clase RandomAccessFile

Mediante los objetos de esta clase utilizamos ficheros binarios mediante un acceso aleatorio, tanto para lectura como para escritura. En estos ficheros hay un índice que nos dice en qué posición del fichero nos encontramos, y con el que se puede trabajar para posicionarse en el fichero.

Métodos de desplazamiento

Cuenta con una serie de funciones para realizar el desplazamiento del puntero del fichero. Hay que tener en cuenta que cualquier lectura o escritura de datos se realizará a partir de la posición actual del puntero del fichero.

long getFilePointer();Devuelve la posición actual del puntero del fichero.

José Rigoberto hernández alburquerque 28

MANUAL DE PRÁCTICAS POO

Page 29: Manual de Prácticas POO

void seek( long l ); Coloca el puntero del fichero en la posición indicada por l. Un fichero siempre empieza en la posición 0.

int skipBytes( int n ); Intenta saltar n bytes desde la posición actual.

long length(); Devuelve la longitud del fichero.

void setLength( long l); Establece a l el tamaño de este fichero.

FileDescriptor getFD(); Devuelve el descriptor de este fichero.

Métodos de escritura

La escritura del fichero se realiza con una función que depende el tipo de datos que se desee escribir.

void write( byte b[], int ini, int len ); Escribe len caracteres del vector b. void write( int i ); Escribe la parte baja de i (un byte) en el flujo. void writeBoolean( boolean b ); Escribe el boolean b como un byte. void writeByte( int i ); Escribe i como un byte. void writeBytes( String s ); Escribe la cadena s tratada como bytes, no caracteres. void writeChar( int i ); Escribe i como 1 byte. void writeChars( String s ); Escribe la cadena s. void writeDouble( double d ); Convierte d a long y le escribe como 8 bytes. void writeFloat( float f ); Convierte f a entero y le escribe como 4 bytes. void writeInt( int i ); Escribe i como 4 bytes. void writeLong( long v ); Escribe v como 8 bytes. void writeShort( int i ); Escribe i como 2 bytes. void writeUTF( String s ); Escribe la cadena s utilizando la codificación UTF-8.

Los métodos que escriben números de más de un byte escriben el primero su parte alta.

Métodos de lectura

La lectura del fichero se realiza con una función que depende del tipo de datos que queremos leer.

boolean readBoolean(); Lee un byte y devuelve false si vale 0 o true sino.byte readByte(); Lee y devuelve un byte.char readChar(); Lee y devuelve un caracter.double readDouble(); Lee 8 bytes, y devuelve un double.float readFloat(); Lee 4 bytes, y devuelve un float.void readFully( byte b[] ); Lee bytes del fichero y los almacena en un vector b.void readFully( byte b[], int ini, int len ); Lee len bytes del fichero y los almacena en un vector b.int readInt(); Lee 4 bytes, y devuelve un int.long readLong(); Lee 8 bytes, y devuelve un long.short readShort(); Lee 2 bytes, y devuelve un short.int readUnsignedByte(); Lee 1 byte, y devuelve un valor de 0 a 255.int readUnsignedShort(); Lee 2 bytes, y devuelve un valor de 0 a 65535.String readUTF(); Lee una cadena codificada con el formato UTF-8.int skipBytes(int n); Salta n bytes del fichero.

Si no es posible la lectura devuelven –1.

6.4 Manejo de objetos persistentes

José Rigoberto hernández alburquerque 29

MANUAL DE PRÁCTICAS POO

Page 30: Manual de Prácticas POO

Conceptos sobre persistencia de objetos

Es la capacidad del programador para conseguir que sus datos sobrevivan a la ejecución del proceso que los creo, de forma que puedan ser reutilizados en otro proceso.

Es la capacidad de un lenguaje de programación para almacenar y recuperar el estado de los objetos de forma que sobrevivan a los procesos que los manipulan.

Persistencia: Nos referimos como datos persistentes a aquellos que son utilizados por una aplicación y cuya existencia debe mantenerse más allá del ciclo de vida de la aplicación. Ejemplo: crear una clase Cliente, utilizarla y guardarla (persistirla) en memoria no volátil.

Muchas aplicaciones Java necesitan tratar con datos persistentes. En la mayoría de los casos, esto significa encararse con una base de datos relacional, posiblemente un base de datos obsoleta (o antigua) o un Sistema de Manejo de Bases de Datos (DBMS) estándar industrial.

José Rigoberto hernández alburquerque 30

MANUAL DE PRÁCTICAS POO