Anda di halaman 1dari 57

Programacin Orientada a Objetos

Caractersticas del lenguaje de programacin.

1 Entorno de desarrollo
1.1 Estructura de un programa
1.2 Proceso de desarrollo de aplicaciones

2 Fundamentos del Paradigma de la Programacin Orientada a Objetos


2.1 Introduccin a la Programacin Orientada a Objetos
2.1.1 Conceptos Bsicos de la POO.
2.2 Clases y Objetos

3 Mtodos y mensajes.
3.1 Atributos static.
3.2 Concepto de mtodo.
3.3 Declaracin de mtodos.
3.4 Llamadas a mtodos (mensajes).
3.5 Tipos de mtodos.
3.5.1 Mtodos y atributos static.
3.5.2 Mtodos normales y voltiles.
3.6 Referencia this.
3.7 Forma de pasar argumentos.
3.8 Constructor, destructor

4 Arreglos

5 Sobrecarga.
5.1 Conversin de tipos.
5.2 Sobrecarga de mtodos.
5.3 Sobrecarga de operadores.

6 Herencia.
6.1 Introduccin a la herencia.
6.2 Herencia simple.
6.3 Herencia mltiple.
6.4 Parte protegida.
6.5 Redefinicin de los miembros de las clases derivadas.

7 Polimorfismo y reutilizacin
7.1 Concepto del polimorfismo.
7.2 Clases abstractas.
7.3 Definicin de una interfaz.
7.4 Definicin y creacin de paquetes/librera.

8 Excepciones.
8.1 Definicin.
8.2 Excepciones definidas por el usuarios.

Pgina: 1
Programacin Orientada a Objetos
9 Flujos y archivos.
9.1 Clasificacin de acuerdo al tipo de acceso
9.2 Definicin de Archivos de texto y archivos binarios.
9.3 Operaciones bsicas en archivos texto y binario.
9.4 Ficheros Secuenciales de Texto
9.5 Ficheros de Acceso Directo
9.5.1 Creacin de un fichero de acceso directo
9.5.2 Escritura en un fichero de acceso directo
9.5.3 Lectura de un fichero de acceso directo

Bibliografa:

CAMELIA MUOZ CARO/ALFONSO NIO RAMOS/AURORA VIZCANO


BARCEL
INTRODUCCIN A LA PROGRAMACIN CON ORIENTACIN A OBJETOS
PRENTICE HALL

Programacin en C, C++, Java y UML


Luis Joyanes Aguilar
Mc Graw Hill

Caractersticas del lenguaje de programacin.

Pgina: 2
Programacin Orientada a Objetos
Lenguaje simple

Java posee una curva de aprendizaje muy rpida. Resulta relativamente sencillo escribir applets
interesantes desde el principio. Todos aquellos familiarizados con C++ encontrarn que Java es
ms sencillo, ya que se han eliminado ciertas caractersticas, como los punteros. Debido a su
semejanza con C y C++, y dado que la mayora de la gente los conoce aunque sea de forma
elemental, resulta muy fcil aprender Java. Los programadores experimentados en C++ pueden
migrar muy rpidamente a Java y ser productivos en poco tiempo.

Orientado a objetos

Java fue diseado como un lenguaje orientado a objetos desde el principio. Los objetos agrupan en
estructuras encapsuladas tanto sus datos como los mtodos (o funciones) que manipulan esos
datos. La tendencia del futuro, a la que Java se suma, apunta hacia la programacin orientada a
objetos, especialmente en entornos cada vez ms complejos y basados en red.

Distribuido

Java proporciona una coleccin de clases para su uso en aplicaciones de red, que permiten abrir
sockets y establecer y aceptar conexiones con servidores o clientes remotos, facilitando as la
creacin de aplicaciones distribuidas.

Interpretado y compilado a la vez

Java es compilado, en la medida en que su cdigo fuente se transforma en una especie de cdigo
mquina, los bytecodes, semejantes a las instrucciones de ensamblador.

Por otra parte, es interpretado, ya que los bytecodes se pueden ejecutar directamente sobre
cualquier mquina a la cual se hayan portado el intrprete y el sistema de ejecucin en tiempo real
(run-time).

Robusto

Java fue diseado para crear software altamente fiable. Para ello proporciona numerosas
comprobaciones en compilacin y en tiempo de ejecucin. Sus caractersticas de memoria liberan
a los programadores de una familia entera de errores (la aritmtica de punteros), ya que se ha
prescindido por completo los punteros, y la recoleccin de basura elimina la necesidad de
liberacin explcita de memoria.

Seguro

Dada la naturaleza distribuida de Java, donde las applets se bajan desde cualquier punto de la
Red, la seguridad se impuso como una necesidad de vital importancia. A nadie le gustara ejecutar
en su ordenador programas con acceso total a su sistema, procedentes de fuentes desconocidas.
As que se implementaron barreras de seguridad en el lenguaje y en el sistema de ejecucin en
tiempo real.

Indiferente a la arquitectura

Java est diseado para soportar aplicaciones que sern ejecutadas en los ms variados entornos
de red, desde Unix a Windows Nt, pasando por Mac y estaciones de trabajo, sobre arquitecturas
distintas y con sistemas operativos diversos. Para acomodar requisitos de ejecucin tan variados,
el compilador de Java genera bytecodes: un formato intermedio indiferente a la arquitectura,
diseado para transportar el cdigo eficientemente a mltiples plataformas hardware y software. El
resto de problemas los soluciona el intrprete de Java.

Pgina: 3
Programacin Orientada a Objetos

Portable

La indiferencia a la arquitectura representa slo una parte de su portabilidad. Adems, Java


especifica los tamaos de sus tipos de datos bsicos y el comportamiento de sus operadores
aritmticos, de manera que los programas son iguales en todas las plataformas.

Estas dos ltimas caractersticas se conocen como la Mquina Virtual Java (JVM).

Alto rendimiento

Multihebra

Hoy en da ya se ven como terriblemente limitadas las aplicaciones que slo pueden ejecutar
una accin a la vez. Java soporta sincronizacin de mltiples hilos de ejecucin
(multithreading) a nivel de lenguaje, especialmente tiles en la creacin de aplicaciones de red
distribuidas. As, mientras un hilo se encarga de la comunicacin, otro puede interactuar con el
usuario mientras otro presenta una animacin en pantalla y otro realiza clculos.

Dinmico

El lenguaje Java y su sistema de ejecucin en tiempo real son dinmicos en la fase de


enlazado. Las clases slo se enlazan a medida que son necesitadas. Se pueden enlazar
nuevos mdulos de cdigo bajo demanda, procedente de fuentes muy variadas, incluso desde
la Red.

Produce applets

Java puede ser usado para crear dos tipos de programas: aplicaciones independientes y
applets.

Las aplicaciones independientes se comportan como cualquier otro programa escrito en


cualquier lenguaje, como por ejemplo el navegador de Web HotJava, escrito ntegramente en
Java.

Por su parte, las applets son pequeos programas que aparecen embebidos en las pginas
Web, como aparecen los grficos o el texto, pero con la capacidad de ejecutar acciones muy
complejas, como animar imgenes, establecer conexiones de red, presentar mens y cuadros
de dilogo para luego emprender acciones, etc.

1 Entorno de desarrollo

Un proyecto Java podemos considerarlo como una serie de carpetas ordenadas y organizadas de
acuerdo con una lgica para mantener organizado el cdigo. Un proyecto suele constar de archivos
.java, archivos .class y documentacin.

Los archivos .java contienen el cdigo fuente (entendible por humanos) que en un momento dado
podemos modificar con un editor de textos y suelen encontrarse en carpetas de nombre src
(source). Los archivos .class contienen el bytecode (no entendible por humanos pero s por la
mquina virtual Java) y suelen encontrarse en carpetas de nombre bin (binary).

Pgina: 4
Programacin Orientada a Objetos
La organizacin de los archivos en carpetas y la presencia de otros adicionales depende del
entorno de desarrollo que utilicemos. Adems, Java introduce un esquema organizativo a travs de
paquetes (packages) que comentaremos ms adelante.

1.1 Estructura de un programa

Un programa Java est formado por una o varias clases.

1. Cada clase puede tener sus atributos y mtodos.


2. Al menos una de las clases tendr un mtodo llamado main, dicho mtodo es en el que se
comienza la ejecucin.
3. En un fichero (archivo) debe existir una clase definida como public y el nombre del fichero
debe ser el mismo (maysculas y minsculas) al nombre de esta clase aadindole la
extensin .java.

Por ejemplo, el fichero que contiene el cdigo:

public class Ejemplo


{
public static void main(String[] args)
{
System.out.println("Comienzo");
}
}

debe llamarse Ejemplo.java.

Los mtodos tienen una serie de sentencias que se ejecutan en secuencia alguna de esas
sentencias pueden ser pasos de mensaje a otros objetos (llamadas a sus mtodos)

Ejemplo: Programa Java


/*
* Programa Java que dado el radio y altura * de un cilindro calcula su volumen
*/
public class VolumenCilindro
{
public static void main (String[ ] args)
{
/* El valor del nmero pi */
double PI = 3.1415926536;
double radio;
double altura;
radio = 23.4; // en centmetros
altura = 120.2; // en centmetros
System.out.println(Datos del cilindro: );
System.out.println(Radio: + radio);
System.out.println(Altura: + altura);
System.out.println(El volumen del cilindro es: );
System.out.println(PI * radio * radio * altura);
}
}

Nota: El fichero donde se almacenar debe llamarse VolumenCilindro.java

Pgina: 5
Programacin Orientada a Objetos
Una de las grandes fortalezas de Java es su rica coleccin de clases predefinidas, las cuales
pueden reutilizar los programadores en lugar de programar las propias, para hacer esto, se le debe
indicar en los programas la opcin import.

Las diversas clases predefinidas se agrupan en categoras de clases relacionadas llamadas


paquetes. A los paquetes se les conoce de manera colectiva como biblioteca de clases de Java o
como la Interfaz de Programacin de Aplicaciones (API).

Los paquetes de clases se cargan con la palabra clave import, especificando el nombre del
paquete como ruta y nombre de clase. Se pueden cargar varias clases utilizando un asterisco.

import java.Date.*;
import java.awt.*;

Cada porcin del nombre del paquete es un directorio o carpeta en el disco. Todos los paquetes en
la API de java se almacenan en el directorio java o javax que contienen a su vez otros
subdirectorios.

Principales Paquetes de Java

El lenguaje Java proporciona una serie de paquetes que incluyen ventanas, utilidades, un sistema
de entrada/salida general, herramientas y comunicaciones.

A continuacin se mencionan los Principales paquetes Java:

java.applet: Este paquete contiene clases diseadas para usar con applets. Hay una clase Applet
y tres interfaces: AppletContext, AppletStub y AudioClip.

java.awt: El paquete Abstract Windowing Toolkit (awt) contiene clases para generar widgets y
componentes GUI (Interfaz Grfico de Usuario). Incluye las clases Button, Checkbox, Choice,
Component, Graphics, Menu, Panel, TextArea y TextField.

java.io: El paquete de entrada/salida contiene las clases de acceso a ficheros: FileInputStream y


FileOutputStream.

java.lang: Este paquete incluye las clases del lenguaje Java propiamente dicho: Object, Thread,
Exception, System, Integer, Float, Math, String, etc.

java.net: Este paquete da soporte a las conexiones del protocolo TCP/IP y, adems, incluye las
clases Socket, URL y URLConnection.

* java.util: Este paquete es una miscelnea de clases tiles para muchas cosas en programacin.
Se incluyen, entre otras, Date (fecha), Dictionary (diccionario), Random (nmeros aleatorios) y
Stack (pila FIFO).

* javax.swing: Contiene clases para manejar cajas de dialogo.

A continuacin se presenta la estructura principal e un programa en Java incluyendo import.

import paquete1;
import paquete2;
public class PrimeraClase
{
public static void main(String[] args)
{
declaracin variables y/o objetos

Pgina: 6
Programacin Orientada a Objetos
bloque de sentencias
}
}

2 Fundamentos del Paradigma de la Programacin Orientada a Objetos

2.1 Introduccin a la Programacin Orientada a Objetos

El principio de la Programacin Orientadas a Objetos es ''divide y vencers''. Este principio es


usado en otras tcnicas de programacin y la diferencia fundamental entre cada una de ellas es la
eleccin de los bloques con los que se construye un software. En las tcnicas estructuradas las
unidades fundamentales son los procedimientos (subrutinas o subprogramas), mientras que en la
programacin modular se usan interfaces y mdulos. En el modelo de objetos las unidades bsicas
se conocen como objetos los cuales contienen tanto datos (es decir, variables de estado que
describen el objeto en un cierto instante) como mtodos (es decir reglas dinmicas, reglas que
explican la interaccin del objeto con el mundo exterior). En la terminologa OO, lo anterior quiere
decir que el objeto encapsula sus datos y su comportamiento. Los objetos interactan
intercambiando mensajes para producir un comportamiento colectivo, que en principio debe
resolver un problema.

El modelo de objetos provee fundamentos tericos a partir de los cuales se construye un programa
orientado a objetos. Este modelo se basa en los principios de abstraccin, encapsulacin,
modularidad, jerarqua, polimorfismo, entre otros. En las siguientes secciones se tratar de definir
formalmente los conceptos de la POO para posteriormente llevarlos a la prctica con el lenguaje
Java.

El trmino de Programacin Orientada a Objetos indica ms una forma de diseo y una


metodologa de desarrollo de software que un lenguaje de programacin, ya que en realidad se
puede aplicar el Diseo Orientado a Objetos (DOO), a cualquier tipo de lenguaje de programacin.

El desarrollo de la POO empieza a destacar durante la dcada de lo 80 tomando en cuenta la


programacin estructurada, a la que engloba y dotando al programador de nuevos elementos para
el anlisis y desarrollo de software.

Bsicamente la POO permite a los programadores escribir software, de forma que est organizado
en la misma manera que el problema que trata de modelizar. Los lenguajes de programacin
convencionales son poco ms que una lista de acciones a realizar sobre un conjunto de datos en
una determinada secuencia. Si en algn punto del programa modificamos la estructura de los datos
o la accin realizada sobre ellos, el programa cambia.

2.1.1 Conceptos Bsicos de la POO.

Abstraccin: Es la caracterizacin de un objeto de acuerdo a las propiedades que nos interesen


en un instante de tiempo.

Las caractersticas escogidas son relativas a la perspectiva del observador.

Pgina: 7
Programacin Orientada a Objetos

Figura 2.1: Abstraccin

Tipos de Datos Abstractos

Algunos autores describen a la POO como programacin con Tipos de Datos Abstractos (TDA) y
sus relaciones. Aunque el concepto de Abstraccin es muy importante dentro de la POO, esta
ltima consiste de ms herramientas.

El primer problema que enfrenta un programador cuando inicia un proyecto grande de


programacin, es el problema mismo que se quiere resolver y como hacer abstracciones de este
ltimo. Tpicamente, se enfrenta con problemas de la ''vida real'' y se quiere hacer la vida ms fcil
construyendo un programa que resuelva el problema de manera automtica. Sin embargo, los
problemas de la vida real son muchas veces obscuros y difciles de entender. Entonces, es
necesario dejar de lado los detalles de la implementacin y tratar de obtener una visin abstracta, o
un modelo, del problema. Este proceso de modelado es conocido como abstraccin y se ilustra en
la figura 2.2.

Figura 2.2 Modelo

El modelo define una visin abstracta del problema. Esto implica que el modelo se enfoca en la
definicin de las propiedades del problema. Estas propiedades incluyen:

Las estructuras de datos que sern afectadas y modificadas


Las operaciones identificadas por el problema.

Pgina: 8
Programacin Orientada a Objetos

Una abstraccin es entonces, la estructuracin de un problema de la vida real en entidades bien


definidas por sus datos y sus operaciones. Por lo tanto, estas entidades combinan datos y
operaciones y no estn desacopladas.

Una entidad con las propiedades descritas antes se conoce como un tipo de datos abstracto o
TDA. La figura 2.3 muestra un TDA. Slo algunas operaciones son visibles desde el exterior y
definen la interfaz de el TDA.

Figura 2.3: Tipo de Datos Abstracto.

El ocultamiento de los datos de el TDA y slo proveer de una interfaz bien definida se conoce como
encapsulacin.

Encapsulacin: Es la manera de ocultar los detalles de la representacin interna de un objeto


presentando solo la interface para el usuario (ver figura 2.4).

Figura 2.4: Encapsulacin.


Resumiendo, la separacin de los datos de las operaciones, y la restriccin de que slo es posible
tener acceso a los datos a travs de las operaciones definidas en la interfaz, permite seleccionar
los TDA apropiados para resolver un problema determinado.

Los TDA proveen una visin abstracta para describir propiedades de un conjunto de entidades y su
uso es independiente del lenguaje de programacin. Por esta razn, se introduce una notacin que
consiste de dos partes:

Datos o Atributos: En esta parte se describen las estructuras de los datos usados dentro del TDA
de manera informal.

Pgina: 9
Programacin Orientada a Objetos
Operaciones o Mtodos: En esta parte se describen las operaciones que sern vlidas para el
TDA. Un conjunto de estas operaciones sern la interfaz del TDA. Para cada operacin se deben
describir los argumentos, as como sus posibles precondiciones y postcondiciones.

Los TDA permiten la creacin de instancias con propiedades y comportamientos bien definidos. En
la POO los TDA's se conocen como clases. Una clase define las propiedades de los objetos los
cuales son entidades tangibles en el ambiente de orientacin a objetos.

Los TDA's definen su funcionalidad poniendo nfasis en los datos, la estructura, las operaciones y
en los axiomas y precondiciones. Consecuentemente, POO es ''programar con TDA's'' (y algo
ms). Instancias (objetos) de TDA's (clases) se crean dinmicamente, se usan y se destruyen con
el objetivo de resolver un problema real mediante la POO.

2.2 Clases y Objetos

Una clase es una representacin de un TDA. Esta provee los detalles de la implementacin de los
datos y de las operaciones. De manera formal se puede decir que: Una clase es la implementacin
de un tipo de datos abstracto (TDA) y define los atributos y los mtodos de la TDA.

Las instancias de clases se conocen como objetos. Entonces las clases definen las propiedades de
un conjunto de objetos.

CLASE: Agrupacin de un conjunto de objetos de similares caractersticas.

Una clase define las funciones y atributos de un tipo de objetos.

Un objeto se convierte en una variable o instancia de la clase.

Ejemplo:

CLASE: Coche

Atributos: Color, Velocidad, Carburante, etc.


Mtodos: Andar, Parar, Girar, etc.

Un sistema real est formado por varios tipos de objetos (clases), que interactan entre s,
colaborando y pasndose informacin de unos a otros.

Objetos: Como se mencion anteriormente, los objetos son instancias de clases y cada objeto se
diferenca de otros similares por su nombre particular (identidad). Es posible entonces, tener dos
objetos con los mismos datos pero distinto nombre. Esto es similar a lo que sucede con los
lenguajes tradicionales de programacin donde se puede tener, por ejemplo, dos enteros i y j ,
ambos conteniendo el valor de ''2''. En este caso ''i'' y ''j'' se usan para identificar a los dos enteros.

El conjunto de valores asignados a los datos de un objeto, en un instante determinado, se conoce


como el estado del objeto.

El estado del objeto cambia de acuerdo a los mtodos que se aplican sobre l. La posible
secuencia de cambios de estado se conoce como el comportamiento del objeto:

Comportamiento: El comportamiento de un objeto est definido por el conjunto de mtodos que


se pueden aplicar sobre l.

Un objeto puede ser cualquier cosa, real o abstracta, acerca de la cual se almacenan datos y las
funciones que manejan y controlan estos datos.

Pgina: 10
Programacin Orientada a Objetos
Ejemplo de Objetos: coche del profesor, bicicleta del cartero, ...

Ejemplo de No Objetos: un coche, una bicicleta, color, tamao, edad. Los primeros 2 ejempos
seran clases porque son conceptos muy generales, los restantes 3 ejemplos corresponderan a
atributos de alguna clase

Se tienen hasta ahora dos conceptos importantes de la orientacin a objetos, clases y objetos.
Podra decirse que la POO es la accin de implementar clases y crear instancias de ellas. En la
ejecucin de un programa OO, las instancias de clases, los objetos, realizan ciertas acciones para
obtener la solucin de un problema cambiando. Consecuentemente, se puede pensar al programa
en ejecucin como una coleccin de objetos en interaccin. La pregunta inmediata es: Cmo es
que estos objetos interactan?. La respuesta es: por medio de intercambio de mensajes.

Ejemplo:

CLASE: Coche

Atributos: Color, Velocidad, Carburante.


Mtodos: Andar, Parar, Girar.

Nombre de objeto 1: Coche Fernando


Funciones permitidas objeto 1: Andar, Parar, Girar
Datos objeto 1: gris, 140 Km/h, sper

Nombre de objeto 2: Coche Nuria


Funciones permitidas objeto 2: Andar, Parar, Girar
Datos objeto 2: rojo, 170 Km/h, sin plomo

3 Mtodos y mensajes.

3.1 Atributos static.

Los atributos describen un objeto que ha sido seleccionado para ser incluido en el modelo de
anlisis. En esencia, son los atributos los que definen al objeto, los que clarifican lo que representa
el objeto en el contexto del espacio del problema. Para obtener un conjunto significativo de
atributos para un objeto, el analista debe estudiar la narrativa del proceso (o descripcin del mbito
del alcance) para el problema y seleccionar aquellos elementos que razonablemente pertenecen
al objeto. Adems, para cada objeto debe responderse el siguiente interrogante: Qu elementos
(compuestos y/o simples) definen completamente al objeto en el contexto del problema actual? .

La manera de acceder (si es posible) a un atributo (una "variable") es por medio del objeto de la
siguiente manera:

Objeto.Atributo

La accesibilidad de los atributos de una clase depende de los modificadores que se incluyan al
definirlos. Las posibilidades son:

Modificador Significado
private Slo puede accederse al atributo desde la clase
protected Atributo accesible por las subclases y por todas las clases del mismo paquete
public Accesible por todas las clases
por defecto Accesible por todas las clases del mismo paquete

Pgina: 11
Programacin Orientada a Objetos
Adems, tras estos modificadores pueden aparecer otros modificadores: static, final, transient y
volatile. Con static indicamos que la variable es global. Slo hay una parte de memoria reservada
para el atributo correspondiente por muchos objetos que definamos correspondientes a esa clase.
Los modificadores final y volatile tienen que ver respectivamente con la herencia.

static: los atributos miembros de una clase pueden ser atributos de clase o atributos de instancia;
se dice que son atributos de clase si se usa la palabra clave static: en ese caso la variable es nica
para todas las instancias (objetos) de la clase (ocupa un nico lugar en memoria). A veces a las
variables de clase se les llama variables estticas. Si no se usa static, el sistema crea un lugar
nuevo para esa variable con cada instancia (la variable es diferente para cada objeto). En el caso
de una constante no tiene sentido crear un nuevo lugar de memoria por cada objeto de una clase
que se cree. Por ello es adecuado el uso de la palabra clave static. Cuando usamos static final se
dice que creamos una constante de clase, un atributo comn a todos los objetos de esa clase.

final: en este contexto indica que una variable es de tipo constante: no admitir cambios despus
de su declaracin y asignacin de valor. final determina que un atributo no puede ser sobreescrito o
redefinido. O sea: no funcionar como una variable tradicional, sino como una constante. Toda
constante declarada con final ha de ser inicializada en el mismo momento de declararla. final
tambin se usa como palabra clave en otro contexto: una clase final (final) es aquella que no puede
tener clases que la hereden. Lo veremos ms adelante cuando hablemos sobre herencia.

3.2 Concepto de mtodo.

Las clases contienen normalmente mtodos, esto es, funciones y se puede decir que son las
operaciones o acciones que puede ejecutar un objeto.

Se puede decir que el estado del objeto cambia de acuerdo a los mtodos que se aplican sobre l.
La posible secuencia de cambios de estado se conoce como el comportamiento del objeto:

Comportamiento: El comportamiento de un objeto est definido por el conjunto de mtodos que


se pueden aplicar sobre l.

La forma de acceder a un mtodo de una clase es similar a la de los atributos. Basta escribir el
nombre del objeto de la clase, un punto y despus el nombre del mtodo:

Objeto.Mtodo()

Los mtodos tambin admiten modificadores igual que los atributos. Las posibilidades de
accesibilidad son como antes private, protected, public; seguidos de static, abstract, final, native,
syncronized.

3.3 Declaracin de mtodos.

Como ya se mencion anteriormente, los mtodos son las operaciones o acciones que puede
realizar una clase y son los que, prcticamente, definen el comportamiento y el estado de un
objeto.

Pgina: 12
Programacin Orientada a Objetos
Todo mtodo debe estar contenido dentro de una clase.

La sintaxis para declara un mtodo es la siguiente:

[modificador de acceso][static] tipo Nombre([parmetros formales])


{
[declaracin de variables locales]
sentencias
}

Donde:
modificador de acceso: puede ser public, private, protected o sin modificador (amigo).

Tipo: es cualquier tipo de dato. Si es un tipo de dato diferente de void, debe existir dentro del
cuerpo del mtodo al menos una linea con la sentencia return(valor); donde valor es una
constante o variable que debe corresponder al tipo de dato con el que se declar el mtodo.

Nombre: Es el identificador del mtodo.

Parmetros formales: es la lista de parmetros que incluye, tipo de dato y nombre del parmetro, si
son varios se separan por comas.

Variables locales: Son las variables que usar el mtodo y son creadas cuando se ejecuta el
mtodo y dejarn de existir cuando ste concluya.

3.4 Llamadas a mtodos (mensajes).

La llamada a un mtodo se puede realizar de dos formas:

Llamada al mtodo desde otro mtodo perteneciente a la misma clase. En este caso la llamada al
mtodo se realiza de la siguiente manera:

Si el tipo de dato del mtodo es void la llamada se efecta slo nombrando al mtodo, esto es:

nombreMetodo(parmetros Actuales);

Si el tipo de dato del mtodo es diferente de void, generalmente, va precedido de una variable o
atributo mas el operador de asignacin.

atributo=nombreMetodo(parmetros Actuales);

Llamada al mtodo por medio de un objeto se realiza de manera similar al anterior, la diferencia es
que se antepone el nombre del objeto y un punto:

objeto.nombreMetodo(parmetros Actuales);

Los parmetros actuales, no incluyen tipos de datos, pero se debe tomar en cuenta que los
parmetros actuales y formales se corresponden por posicin, no por nombre, por lo tanto, los tipos
de datos deben ser iguales.

Ademas de lo expuesto anteriormente, el nmero de parmetros formales y actuales debe ser el


mismo.

3.5 Tipos de mtodos.

3.5.1 Mtodos y atributos static.

Pgina: 13
Programacin Orientada a Objetos

Se puede decir que cuando se crean objetos de alguna clase y que los atributos y mtodos no son
declarados como static, cada uno de los objetos creados ocupar localidades de memoria para
cada uno de ellos. Por ejemplo, si una clase tiene definidos 3 atributos que no son static y se
crean 4 objetos, se ocuparn 4x3=12 localidades de memoria.

Cuando se declaran los atributos o mtodos como estticos (static), todos los objetos creados
comparten la misma localidad de memoria y cualquier cambio de valor en alguno de los objetos,
afecta a todos los objetos. Por ejemplo, si una clase tiene definidos 3 atributos que son static y se
crean 4 objetos, se ocuparn slo 3 localidades de memoria y tendrn acceso los 4 objetos.

El siguiente ejemplo complementa lo anterior, aadiendo mtodos para asignar y recuperar las
coordenadas de un objeto de la clase Punto.

class Punto public class Proto


{ {
int x,y; public static void main(String[] args)
public void ponx(int primeracoord) {
{ Punto P=new Punto();
x=primeracoord; Punto Q=new Punto();
} P.ponx(3); P.pony(5);
public void pony(int segundacoord) Q.ponx(7); Q.pony(15);
{ System.out.println("("+P.dimex()+","+P.dimey()+")");
y=segundacoord; System.out.println("("+Q.dimex()+","+Q.dimey()+")");
} }
public int dimex() }
{
return x;
}
public int dimey()
{
return y;
}
}

el resultado ser: (3,5), (7,15). Pero si cambiamos int x,y; por static int x,y en la clase Punto; el
resultado ser (7,15), (7,15). Las variables del objeto Q interfieren con las de P, porque no hay
memoria separada para ambos juegos de atributos.

Los atributos y mtodos estticos tienen la propiedad de que se puede acceder a ellos sin que se
declare ningn objeto correspondiente a la clase.

Por ejemplo, tiene sentido el programa:


class Punto
{
static int x,y;
}
public class Proto
{
public static void main(String[] args)
{
Punto.x=13;
Punto.y=34;
System.out.println("("+Punto.x+","+Punto.y+")");
}
}

Pgina: 14
Programacin Orientada a Objetos

Sin embargo, si los atributos no fueran estticos se obtendra un error del tipo:
non-static variable cannot be referenced from a static context.

3.5.2 Mtodos normales y voltiles.

El modificador volatile indica que un campo puede ser modificado en el programa por algo como el
sistema operativo, el hardware o un hilo de ejecucin concurrente (tareas que se ejecutan en
paralelo).

El calificador de tipo volatile se aplica a la definicin de una variable que puede alterarse desde el
exterior del programa.

Se utiliza este modificador sobre los atributos de los objetos para indicar al compilador que es
posible que dicho atributo vaya a ser modificado por varios threads de forma simultanea y
asncrona, y que no queremos guardar una copia local del valor para cada thread a modo de
cach, sino que queremos que los valores de todos los threads estn sincronizados en todo
momento, asegurando as la visibilidad del valor actualizado a costa de un pequeo impacto en el
rendimiento.

3.6 Referencia this.

Como ya sabemos, es posible declarar una variable dentro de un bloque con el mismo nombre que
una variable miembro, pero no con el nombre de otra variable local que ya existiera. La variable
declarada dentro del bloque oculta a la variable miembro en ese bloque. Para acceder a la variable
miembro oculta ser preciso utilizar el operador this, en la forma this.varname.

Ejemplo:

public class Ejemplo {


int a=5,b=10;
void metodoA() {
String a=LOCAL;
System.out.println(variable a= +a); // imprime: variable a= LOCAL
System.out.println(atributo a= +this.a); // imprime: atributo a= 5
}
void metodoB(String b) // un parmetro con nombre de un atributo de la clase
{
b=PARAMETRO;
System.out.println(parametro b= +b); // imprime: variable b= PARAMETRO
System.out.println(atributo b= +this.b); // imprime: atributo b= 10
}
}

3.7 Forma de pasar argumentos.

En el paso de parmetros a funciones hay dos aproximaciones clsicas: el paso por valor y paso
por referencia.

En el paso por valor se realiza una copia de los valores que se pasan, trabajando dentro de la
funcin con la copia. Es por ello que cualquier cambio que sufran dentro, no repercute fuera de la
funcin.

En el paso por referencia no se realiza dicha copia, por lo que las modificaciones de dentro de las
funciones afectan a los parmetros y esos cambios permanecen al final de la funcin.

Pgina: 15
Programacin Orientada a Objetos

En Java el paso por parmetro es por valor, aunque los efectos son de paso por referencia cuando
los argumentos son objetos. cmo sucede eso? Pues es muy fcil, si una funcin tiene como
argumento un tipo primitivo (int, float, etc...), en Java se realiza una copia para la funcin y
cualquier cambio a dicho argumento no afecta a la variable original. Este paso de parmetros en
Java est orientado a utilizar el valor de la variable para otros clculos.

En el caso de los objetos es distinto. En realidad lo que sucede es que en Java siempre tenemos
referencias a los objetos. Por eso al pasar a una funcin como argumento un objeto, pasamos la
referencia al mismo, es decir, aunque se hace una copia para el paso por valor, como lo que se
copia es una referencia, los cambios al objeto referenciado s son visibles y afectan fuera de la
funcin.

3.8 Constructor, destructor.

Constructores

Al definir un objeto podemos querer especificar el valor de algunos atributos. La manera de hacerlo
es dotando a la clase correspondiente de un mtodo constructor. ste es un mtodo que tiene el
mismo nombre que la clase, que se suele colocar en primer lugar y que se ejecuta
automticamente.

Si un constructor tiene ciertos parmetros como argumentos, se pueden especificar al declarar el


objeto con:

Clase Objeto = new Clase(parmetros);

Por ejemplo, con la siguiente variante de la clase Punto, se puede escribir Punto P= new
Punto(31,22) para especificar que P es el punto (31,22).

class Punto
{
int x,y;
Punto(int abcisa, int ordenada)
{
x=abcisa;
y=ordenada;
}
}
public class Proto
{
public static void main(String[] args)
{
Punto P=new Punto(31,22);
System.out.println("("+P.x+","+P.y+")");
}
}

La destruccin del objeto

Todo objeto creado ocupa espacio en memoria y en algunas ocasiones ya no se ocupa ese objeto,
por lo tanto ya no nos conviene que est ocupando esa memoria y es necesario liberarla, lo cual se
realiza con el destructor.

Existen dos formas de liberar memoria ocupada por los objetos:

Pgina: 16
Programacin Orientada a Objetos
a.) La destruccin de los objetos en forma automtica.

Cuando un objeto no va a ser utilizado, el espacio de memoria de dinmica que utiliza ha de


ser explcitamente.

El recolector de basura ser el encargado de liberar una zona de memoria dinmica que haba
sido reservada mediante el operador new, cuando el objeto ya no va a ser utilizado ms
durante el programa (por ejemplo, sale del mbito de utilizacin, o no es referenciado
nuevamente).

El sistema de recogida de basura se ejecuta peridicamente, buscando objetos que ya no


estn referenciados.

b.) La destruccin personalizada: finalize

A veces una clase mantiene un recurso que no es de Java como un descriptor de archivo o un
tipo de letra del sistema de ventanas. En este caso sera acertado el utilizar la finalizacin
explcita, para asegurar que dicho recurso se libera. Esto se hace mediante la destruccin
personalizada.

Para especificar una destruccin personalizada se aade un mtodo a la clase con el nombre
finalize:

class Clase Finalizada


{
void Finalizada() // Constructor
{
// Reserva del recurso no Java o recurso compartido
}
protected void finalize() // destructor
{
// Liberacin del recurso no Java o recurso compartido
}
}

El intrprete de Java llama al mtodo finalize(), si existe cuando vaya a reclamar el espacio de ese
objeto, mediante la recogida de basura.

Debe observarse que el mtodo finalize() es de tipo protected void y por lo tanto deber de
sobreescribirse con este mismo tipo.

4. ARRAYS (Arreglos)

Un array es un identificador que referencia un conjunto de datos del mismo tipo. Por ejemplo un
identificador x de tipo de dato int, con el que se puede crear un conjunto de datos de ese tipo y
utilizar uno u otro con slo cambiar el ndice que lo referencia. El ndice ser un valor entero y
positivo.
En Java los arrays comienzan por la posicin 0 (cero).

4.1. Arreglos de una dimensin (Vectores).

Pgina: 17
Programacin Orientada a Objetos

Un vector es un array unidimensional, es decir, slo utiliza un ndice para referenciar a cada uno de
los elementos. Su declaracin ser:

tipo[ ] nombre = new tipo[tamao];

El tipo puede ser cualquiera de los ya conocidos y el tamao indica el nmero de elementos del
vector (se debe indicar entre corchetes [ ] ).

En el ejemplo siguiente se puede observar que la variable i es utilizada como ndice, el primer for
sirve para rellenar el vector y el segundo para visualizarlo. Como se puede ver, las posiciones van
de 0 a 9 (total 10 elementos).

EJEMPLO:

/* Declaracin de un array. */
public static void main(String [ ] args) /* Rellenamos del 0 - 9 */
{
int [ ] vector= new int [10];
int i;
for (i=0;i<10;i++)
vector[i]=i;
for (i=0;i<10;i++)
System.out.println(vector[i]);
}

Se puede inicializar (asignarle valores) un vector en el momento de declararlo. Si se hace as no


es necesario indicar el tamao. Su sintaxis es:

tipo [ ] nombre ={ valor 1, valor 2...}

Ejemplo:

int [ ] vector={1,2,3,4,5,6,7,8};

char [ ] vector={'p','r','o','g','r','a','m','a','d','o','r'};

Llamadas a mtodos con arrays

public class arrayApp


{
public static void main(String[ ] args)
{
int num[ ]=rellenarArrayDesde(5);
imprimirArray(num);
}

public static void imprimirArray (int lista[ ])


{
for(int i=0;i<lista.length;i++)
{
System.out.println(lista[i]);
}
}
public static int[ ] rellenarArrayDesde(int a)
{

Pgina: 18
Programacin Orientada a Objetos
int num[]=new int [10];
for(int i=0;i<num.length;i++)
{
num[i]=a;
a++;
}
return num;
}

4.2 Arreglos multidimensionales

Se definen igual que los vectores excepto que se requiere un ndice por cada dimensin.

Su sintaxis es la siguiente:

tipo [ ][ ][ ] nombre = new tipo [tamao 1][tamao 2].[tamao n];

Una matriz es un arreglo bidimensional y se podra representar grficamente como una tabla con
filas y columnas.

La matriz tridimensional se utiliza, por ejemplo, para trabajos grficos con objetos 3D.

En el ejemplo siguiente se puede ver cmo se rellena y visualiza una matriz bidimensional. Se
necesitan dos ciclos para cada una de las operaciones. Un ciclo controla las filas y otro las
columnas.

EJEMPLO:

/* Matriz bidimensional. */
public static void main( String [ ] args) /* Rellenamos una matriz */
{
int x,i;
int [ ] [ ] nmeros= new int [3][4];
/* rellenamos la matriz */
for (x=0;x<3;x++)
for (i=0;i<4;i++)
numeros[x][i]=Integer.parseInt(JOptionPane.showInputDialog (Teclea
elemento+ x+,+i);
/* visualizamos la matriz */
for (x=0;x<3;x++)
{
for (i=0;i<4;i++)
System.out.print(numeros[x][i]+ );
System.out.println();
}
}

Si al declarar una matriz tambin se quiere inicializarla, habr que tener en cuenta el orden en el
que los valores son asignados a los elementos de la matriz. Se muestra un ejemplos:

int[ ][ ] matriz = {{1,2},{3,4},{5,6}};

quedaran asignados de la siguiente manera:

numeros[0][0]=1 numeros[0][1]=2
numeros[1][0]=3 numeros[1][1]=4

Pgina: 19
Programacin Orientada a Objetos
numeros[2][0]=5 numeros[2][1]=6

5 Sobrecarga.

5.1 Conversin de tipos.

Conversin de tipos en Java.

Como en muchos otros lenguajes de programacin, en Java tambin es posible asignar un valor de
un tipo a una variable de otro tipo. Es muy probable que muchos de nosotros no le veamos a esto
mucha ciencia o mucha dificultad pero tambin es verdad que muchos hacemos la conversin
automticamente sin un cierto rigor que nos respalde y cuando el compilador de Java nos da error
seguimos intentndolo por el mtodo del "ensayo y error".

Veamos a continuacin, cmo hace la conversin de tipos Java:


Conversin de tipos automtica.

Si al hacer la conversin de un tipo a otro se dan las 2 siguientes premisas:

Los dos tipos son compatibles.


El tipo de la variable destino es de un rango mayor al tipo de la variable que se va a
convertir.

Entonces, la conversin entre tipos es automtica, esto es, la mquina virtual de Java tiene toda la
informacin necesaria para realizar la conversin sin necesidad de "ayuda" externa. A esto se le
conoce como conversin implcita y cuando hablamos de los tipos numricos de Java se le da el
nombre de widening conversion que traducido vendra a ser algo as como: "conversin por
ampliacin.

Conversin de tipos incompatibles.

Cuando alguna de las 2 premisas anteriores no se cumple, entonces la conversin automtica es


imposible (salvo que se est evaluando una expresin como se ve en el siguiente apartado), el
compilador nos da un error dicindonos algo as como "la variable tal necesita un cast explcito".
Esto no significa que no podamos realizar tal conversin, sino que la mquina virtual de Java
(JVM) necesita que le demos una informacin adicional: el tipo al que vamos a convertir la variable
fuente. Pues bien, a esta conversin explcita es a lo que se le llama hacer un casting de tipos.
Cuando se trata de tipos numricos a este tipo de conversin se le llama narrowing compresion
que se podra traducir como "conversin por estrechamiento" dado que se est "recortando" la
variable para poderla meter en el tipo destino. La expresin general del casting de un tipo es:

(tipo_destino) valor

donde tipo_destino indica el tipo al que queremos hacer la conversin explcita del valor asociado.

En el caso de los tipos numricos, al "recortar" el valor de la variable de rango mayor para que
quepa en el tipo de rango menor resulta que perdemos informacin. En el ejemplo se ver en qu
se traduce esa prdida de informacin segn sean los tipos.

Promocin de tipos automticamente al evaluar una expresin.

Aqu radica uno de los puntos donde se puede generar conflictos si no lo sabemos pero, que una
vez sabido, es una de las muchas ventajas que Java tiene frente a otros lenguajes. El caso es que
cuando la mquina virtual de Java tiene que analizar una expresin existe la posibilidad real de que
el resultado intermedio de una operacin exceda el rango de los operandos. Para solventar este
problema lo que Java hace es una promocin automtica de todos los operandos de tipo byte o

Pgina: 20
Programacin Orientada a Objetos
short a int. Mejor que explicarlo con letra lo vemos en el siguiente ejemplo y donde se ver qu
sencillo es recordarlo para no volver a cometer errores.

Caso 1:
byte a = 40;
byte b = 50;
int c = a * b;//el compilador no dar ningn error.

Caso 2:
byte a = 25;
a = a*2; //ERROR: Explicit cast needed to convert int to byte.

Ahora te preguntars, cmo puede dar este error si el resultado no excede del rango de un tipo
byte (-128,127).

Pues bien, lo que ocurre es que al hacer la multiplicacin, Java ha promocionado automticamente
este valor a int y por eso, para volver a meterlo en un tipo byte tendremos que hacer una
conversin explcita. En el caso 1 este error no se produce porque el resultado de la operacin se
guarda en un int.

a = (byte)a*2;//ahora el compilador no dar ningn error.

Para concluir con las reglas de promocin de tipos cuando evaluamos expresiones aqu van otros
detalles ms que hay que tener en cuenta:

Si alguno de los operandos es long, entonces la expresin entera promociona a long.


Si alguno de los operandos es float, entonces la expresin entera promociona a float.
Si alguno de los operandos es double, entonces el resultado ser double.

Ejemplo.

class ConversionTipos
{
public static void main(String args[])
{
byte b;
int i = 257;
double d = 323.142;
double d2;
float f = 5.65f;
char c = 'c';
short s = 1024;
b = (byte) i;//efecto: se devuelve (i modulo 256), rango de byte.
System.out.println(b);
i = (int) d;//efecto: truncamiento de la parte decimal.
System.out.println(i);
b = (byte)d;//efecto: truncamiento y luego (result_truncado modulo 256)
System.out.println(b);
i = (int)f;//efecto: truncamiento de la parte decimal
System.out.println(i);
i = c;//correcto por ser int, pero un byte o short necesitara un cast explcito.
System.out.println(i);
f = c; d = c;//correcto.
i = b * c;//efecto: la operacin promociona a int.
System.out.println(i);
d2 = (f*b) + (i/c) - (d*s);

Pgina: 21
Programacin Orientada a Objetos
/*
efecto: el resultado de la promocin de todas las expresiones es un double:
(f*b) promociona a float, (i/c) promociona a int y (d*s) promociona a double. Luego,
float + int - double promociona a double.
*/
System.out.println(d2);
}
}

5.2 Sobrecarga de mtodos.

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

Los mtodos sobrecargados deben de cambiar la lista de argumentos.


Pueden cambiar el tipo de retorno.
Pueden cambiar el modificador de acceso.
Pueden declarar nuevas o ampliar excepciones.
Un mtodo puede ser sobrecargado en la misma clase o en una subclase.

Ejemplo de un mtodo que se desea sobrecargar:

public void cambiarTamano(int tamano, String nombre, float patron)


{
}

Los siguientes mtodos son sobrecargas legales del mtodo cambiarTamano():

public void cambiarTamano(int tamano, String nombre)


{
}

public int cambiarTamano(int tamano, float patron)


{
}

public void cambiarTamano(float patron, String nombre) throws IOException


{
}

Cmo invocar un mtodo sobrecargado:

Lo que define qu mtodo es el que se va a llamar son los argumentos que se envan al mismo
durante la llamada. Si se invoca a un mtodo con un String como argumento, se ejecutar el
mtodo que tome un String como argumento, si se manda a llamar al mismo mtodo pero con un
float como argumento, se ejecutar el mtodo que tome un float como argumento y as
sucesivamente. Si se invoca a un mtodo con un argumento que no es definido en ninguna de las
versiones sobrecargadas entonces el compilador arrojar un mensaje de error.

Ejemplo de una clase con un mtodo sobrecargado:

public class Sobrecarga


{

Pgina: 22
Programacin Orientada a Objetos
public void Numeros(int x, int y)
{
System.out.println("Mtodo que recibe enteros.");
}
public void Numeros(double x, double y)
{
System.out.println("Mtodo que recibe flotantes.");
}
public void Numeros(String cadena)
{
System.out.println("Mtodo que recibe una cadena: "+ cadena);
}
public static void main (String [ ] args)
{
Sobrecarga s = new Sobrecarga();
int a = 1;
int b = 2;
s.Numeros(a,b);
s.Numeros(3.2,5.7);
s.Numeros("Programacin O.O.");
}
}

Al ejecutar el cdigo anterior obtendremos lo siguiente:

Mtodo que recibe enteros.


Mtodo que recibe flotantes.
Mtodo que recibe una cadena: Programacin O.O.

Al utilizar objetos en lugar de tipos primitivos o cadenas se vuelve ms interesante. Veamos lo que
sucede cuando se tiene un mtodo sobrecargado que en una de sus versiones toma un Animal
como parmetro y en otra un Caballo.

class Animal
{

class Caballo extends Animal


{
}

class Animales
{
public void MetodoSobrecargado(Animal a)
{
System.out.println("Mtodo de parmetro Animal...");
}
public void MetodoSobrecargado(Caballo c)
{
System.out.println("Mtodo de parmetro Caballo...");
}
public static void main(String [ ] args)
{
Animales as = new Animales();
Animal objetoAnimal = new Animal();

Pgina: 23
Programacin Orientada a Objetos
Caballo objetoCaballo = new Caballo();
as.MetodoSobrecargado(objetoAnimal);
as.MetodoSobrecargado(objetoCaballo);
}
}

Al ejecutar el cdigo anterior obtenemos:

Mtodo de parmetro Animal...


Mtodo de parmetro Caballo...

Como era de esperarse, cada objeto manda llamar al mtodo que le corresponde de acuerdo a su
tipo, pero qu pasa si creamos una referencia Animal sobre un objeto Caballo...

Animal objetoAnimalRefCaballo = new Caballo();


as.MetodoSobrecargado(objetoAnimalRefCaballo);

El resultado es:

Mtodo de parmetro Animal...

Aunque en tiempo de ejecucin el objeto es un Caballo y no un Animal, la eleccin de qu mtodo


sobrecargado invocar no se realiza dinmicamente en tiempo de ejecucin, el tipo de referencia, no
el objeto actual, es el que determina qu mtodo es el que se ejecutar.

Sobreescritura de Mtodos

La sobreescritura de mtodos es una caracterstica ms de la herencia en Java. Es decir, en Java


las nuevas clases se pueden definir extendiendo clases ya existentes. Aqu surgen los conceptos
de subclase que sera la clase obtenida, y superclase, que sera la clase que est siendo
extendida, tal como tambin ya se ha explicado.

Cuando una nueva clase se extiende desde otra que ya exista, todas las variables y mtodos que
son miembros de la superclase (y todos aquellos miembros de los antecesores de la superclase)
sern tambin miembros de la subclase.

En el supuesto de que en el entorno en que se va a mover la nueva subclase, alguno de los


mtodos de la superclase (o alguno de sus antecesores) no sea adecuado para los objetos
originados de la subclase, es posible reescribir el mtodo en la subclase para que se adapte en su
funcionamiento a los objetos del tipo de la subclase.

La reescritura del mtodo dentro de la subclase es lo que se conoce por sobreescritura de


mtodos (overriding methods). Todo lo que se requiere en Java para poder sobreescribir un
mtodo es utilizar el mismo nombre del mtodo en la subclase, el mismo tipo de retorno y la misma
lista de argumentos de llamada, y en el cuerpo de ese mtodo en la subclase proporcionar un
cdigo diferente y especfico para las acciones que vaya a realizar sobre objetos del tipo que
origina la nueva subclase.

Reglas de la sobrecarga y sobreescritura de mtodos:

Ahora que hemos visto ambas formas de reescribir mtodos, revisemos las reglas y diferencias
entre ambos tipos de reescritura:

Argumentos: En un mtodo sobrecargado los argumentos deben de cambiar mientras que en un


mtodo sobreescrito NO deben cambiar.

Pgina: 24
Programacin Orientada a Objetos

El tipo de retorno: En un mtodo sobrecargado el tipo de retorno puede cambiar, en un mtodo


sobreescrito NO puede cambiar, excepto por subtipos del tipo declarado originalmente.

Excepciones: En un mtodo sobrecargado las excepciones pueden cambiar, en un mtodo


sobreescrito pueden reducirse o eliminarse pero NO deben de arrojarse excepciones nuevas o ms
amplias.

Acceso: En un mtodo sobrecargado puede cambiar, en un mtodo sobreescrito el acceso NO


debe de hacerse ms restrictivo (puede ser menos restrictivo).

Al invocar: En un mtodo sobrecargado los argumentos son los que determinan qu mtodo es el
que se invocar, en un mtodo sobreescrito el tipo de objeto determina qu mtodo es elegido.

5.3 Sobrecarga de operadores.

En algunos lenguajes de programacin se permite sobrecargar operadores para utilizarlos en


clases propias. Esto hace posible que utilizar un tipo de datos definido por el usuario parezca tan
natural y lgico como utilizar un tipo de datos fundamental. Por ejemplo, podra crear un nuevo tipo
de datos denominado numeroComplejo para representar un nmero complejo y proporcionar
mtodos que realicen operaciones matemticas en esos nmeros mediante operadores aritmticos
estndar, como utilizar el operador + para sumar dos nmeros complejos.

En Java no se puede realizar la sobrecarga de operadores, lo nico que maneja de sobrecarga es


la definicin del operador + , que ademas de realizar la operacin de suma entre nmeros, Java lo
usa para la concatenacin de cadenas.
El siguiente ejemplo utiliza + para concatenar la cadena "Contados ", con el valor de la variable
contador y la cadena " caracteres.":

6 Herencia.

6.1 Introduccin a la herencia.

La herencia es otra de las propiedades relativas a la POO, consiste en la propagacin de los


atributos y las operaciones a travs de distintas subclases definidas a partir de una clase comn.

Introduce, por tanto, una posibilidad de refinamiento sucesivo del concepto de clase. Nos permite
definir una clase principal y, a travs de sucesivas aproximaciones, cualquier caracterstica de los
objetos. A partir de ahora definiremos como subclases todas aquellas clases obtenidas mediante
refinamiento de una (o varias) clases principales.
La herencia nos permite crear estructuras jerrquicas de clases donde es posible la creacin de
subclases que incluyan nuevas propiedades y atributos. Estas subclases admiten la definicin de
nuevos atributos, as como crear, modificar o inhabilitar propiedades.

Para pensarlo de manera ms fcil podemos abstraernos al siguiente ejemplo.

Pensemos en los distintos submodelos asociados a un modelo bsico de automvil. A partir de este
modelo bsico, los fabricantes introducen distintas caractersticas (aire acondicionado, ABS,
distintas tapiceras , acabados, etc.) que crean subclases. Todas estas subclases tienen en comn
la estructura bsica (chasis , direccin , etc.) o varan slo en algunos de sus componentes.

Asociemos a este tipo bsico una clase cuyos atributos representen las piezas que componen el
coche. Las subclases aportarn sus propios atributos (en el caso de vehculos con aire
acondicionado, todos aquellas piezas que lo componen), permitiendo la definicin de todos los
posibles modelos.

Pgina: 25
Programacin Orientada a Objetos

Adems, es posible que una subclase herede atributos y propiedades de ms de una clase. Este
proceso se denomina herencia.

La herencia permite que los objetos pueden compartir datos y comportamientos a travs de las
diferentes subclases, sin incurrir en redundancia. Ms importante que el ahorro de cdigo, es la
claridad que aporta al identificar que las distintas operaciones sobre los objetos son en realidad
una misma cosa.

Como notacin, se puede indicar que la clase original que se usa para heredar a una clase nueva
se denomina clase padre, clase base, ascendiente o superclase. La clase que recibe la herencia se
llama clase derivada, hija, subclase o descendiente.

6.2 Herencia simple.

Una clase puede heredar de otra atributos o mtodos. Se dice que la primera es subclase de la
segunda, o que la segunda es la superclase. Para definir una subclase se escribe:

class Nombre_de_la_subclase extends Nombre_de_la_superclase

Evidentemente slo se heredan los atributos y mtodos cuyos modificadores lo permitan (no los
private ).

Ejemplo:

class Segmento
{
public double x1,y1,x2,y2;
double longitud()
{
return Math.sqrt((x1-x2)*(x1-x2) +(y1-y2)*(y1-y2));
}
}
class SegmentoOrientado extends Segmento
{
public int orient;
public void ImprimeOrientacion()
{
switch(orient){

Pgina: 26
Programacin Orientada a Objetos
case 1:
System.out.println("Est orientado de ("+x1+","+y1+") a "+x2+","+y2+")");
return;
case -1:
System.out.println("Est orientado de ("+x2+","+y2+") a("+x1+","+y1+")");
return;
default:
System.out.println("Todava no tiene una orientacin vlida");
return;
}
}
}

Al ejecutar:
public class Proto
{
public static void main(String[] args)
{
SegmentoOrientado s=new SegmentoOrientado();
s.x1=1.0; s.y1=5.0; s.x2=4.0; s.y2=9.0;
s.orient=-1;
System.out.println("El segmento conecta ("+s.x1+","+s.y1+") con
("+s.x2+","+s.y2+")");
System.out.println("Su longitud es s "+s.longitud());
s.ImprimeOrientacion();
}
}

se obtiene, como cabra esperar:

El segmento conecta (1.0,5.0) con (4.0,9.0)


Su longitud es s 5.0
Est orientado de (4.0,9.0) a (1.0,5.0)"

Lo que muestra que efectivamente los mtodos y atributos de Segmento se han aadido a los de la
subclase SegmentoOrientado sin necesidad de definirlos de nuevo.

Constructores en clases derivadas.

Una subclase puede tener su propio constructor que incluso puede sobrecargar al de su superclase
(incluso con el mismo tipo y nmero de parmetros). Normalmente un constructor de una subclase
emplear el de la superclase y para invocarlo se emplea la sentencia super(). Debe aparecer
necesariamente como primera instruccin en el constructor. Por ejemplo, incluyendo en Segmento
y en SegmentoOrientado los constructores:

Segmento(double a,double b,double c,double d) SegmentoOrientado(double a,double b,double c,double


{ d, int e)
x1=a; y1=b; x2=c; y2=d; {
} super(a,b,c,d);
orient=e;
}

entonces se podra haber hecho en main la declaracin.

Pgina: 27
Programacin Orientada a Objetos

SegmentoOrientado s=new SegmentoOrientado(11.0,2.0,3.0,7.0,-1);

Es importante tener en cuenta que si la sentencia super no aparece explcitamente en el


constructor de una subclase o si no hay constructor, entonces el compilador inserta super() . Por
ejemplo, no seran vlidas la siguiente definicin y el siguiente constructor de Segmento si no hay
constructor en SegmentoOrientado, porque al ejecutarse super() en la clase SegmentoOrientado
se llamara a un constructor sin parmetros que no existe.
Como ya se ha mencionado, se puede redefinir (sobrecargar) un constructor de una clase en
algunas de sus subclases, incluso permitiendo el mismo tipo y nmero de parmetros. As sera un
constructor vlido en SegmentoOrientado :

SegmentoOrientado(double a,double b,double c,double d)


{
super(a,b,c,d);
x1=c; y1=d; x2=a; y2=b;
}

y tambin suprimiendo super(a,b,c,d) si se aade a Segmento el constructor vaco Segmento(){}.

Este tipo de sobrecargas no es particular de los constructores sino que se extiende al resto de los
mtodos. Por ejemplo, se podra incluir en SegmentoOrientado una de las siguientes
declaraciones:

Double longitud() double longitud()


{ {
return orient*Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); return orient*super.longitud();
} }

En la segunda se emplea super de una manera distinta que en los constructores y no


necesariamente como primera sentencia, pero de nuevo se refiere al mtodo homnimo en la
superclase.

Si un mtodo se va a redefinir en todas las subclases entonces no merece la pena que tenga
cuerpo (instrucciones). En ese caso se le declara como abstracto por medio del modificador
abstract . Esto es como los prototipos de funciones en C, una seal que indica que se va a definir
una funcin de cierto tipo pero sin darla explcitamente. Si una clase tiene uno o ms mtodos
abstractos, debe tambin llevar el modificador abstract. Por ejemplo, antes, si no se usase
super.longitud(), se podra haber sustituido la definicin del mtodo longitud() en Segmento por

abstract double longitud();

en cuyo caso la clase Segmento se debera declara como abstract class Segmento .

El modificador final aplicado a clases, mtodos o atributos, impide en cierto modo la herencia.
Concretamente,

final class Nombre_de_clase{....}

prohbe que se puedan crear subclases de Nombre_de_clase , mientras que

final Metodo(...){...};

impide que en alguna subclase se pueda redefinir (sobrecargar) este mtodo. En un atributo, el

Pgina: 28
Programacin Orientada a Objetos
modificador final impide que se altere su valor en una subclase, por ejemplo, class Madre{ final int
n;} class Hija extends Madre{ int m=++n;} causara un error.

En java todava no existe el tipo de datos constante, pero se puede emular empleando los
modificadores static final. Con static se asegura que no habr copias diferentes suyas en diferentes
objetos (slo una copia en la memoria), y con final se impide que se pueda modificar en ninguna
subclase.

6.3 Herencia mltiple.

A diferencia de lo que ocurre en C++ no hay herencia mltiple, es decir, cada clase tiene a lo ms
una superclase.

6.4 Parte protegida.

Las variables y los mtodos que se heredan vienen controlados por los modificadores de
visibilidad. Los miembros con visibilidad public se heredan y los que tienen visibilidad private no
se heredan. Si stas fueran las nicas posibilidades, la herencia servira de poco, pues todos los
miembros (datos y mtodos) heredables tendran que ser pblicos. En estas condiciones, al tener
variables pblicas perderamos las ventajas de la encapsulacin. Para conseguir que el
comportamiento para clases forneas sea privado pero para las clases derivadas sea pblico se
usa el modificador protected. El modificador protected establece un nivel intermedio de
proteccin entre un acceso public y uno private. Los miembros de una superclase etiquetados
como protected son accesibles para las subclases y las otras clases del mismo paquete (ver la
siguiente tabla).

Modificador Clases e Interfaces Mtodos y variables


default (no Visible en su paquete. Accesible desde cualquier clase en el mismo
modificador) paquete que su clase, pero no sus sublases
que no estn en el mismo paquete.
public Visible en cualquier lugar. Accesible desde cualquier lugar.
protected No se aplica. Accesible desde cualquier clase en el mismo
paquete que su clase o desde cualquier
subclase an en paquetes distintos
private No se aplica. Accesible slo desde la propia clase.

6.5 Redefinicin de los miembros de las clases derivadas.

Suponiendo que en una clase hija declaramos una variable o se define un mtodo con el mismo
nombre que una variable o mtodo heredadas, qu ocurre en este caso?. Se explica en primera
instancia para las variables y posteriormente para los mtodos.

Variables: Cuando una variable se hereda y en la clase hija se declara una nueva variable con el
mismo identificador, la nueva variable es la que se usa. Lo que quiere decir que se ha creado una
nueva variable. Lgicamente, cuando desde la clase hija se use el identificador de la variable se
usa la definida en la clase hija. La variable de clase padre sigue existiendo, y se podra acceder a
ella pero indicando explcitamente que nos referimos a la clase padre con el prefijo super.

Ejemplo:

class Padre
{
protected int dato=10;
} // fin de la clase Padre

Pgina: 29
Programacin Orientada a Objetos

class Hija extends Padre


{
private int dato;
public Hija(int dato)
{
this.dato=dato;
}
public void imprimeHija()
{
System.out.println(Valor de dato en Hija: +dato);
}
public void imprimePadre()
{
System.out.println(Valor de dato en Padre: +super.dato);
}
}
class Herencia
{
public static void main(String [ ] args)
{
Hija ejemplo=new Hija(5);
Ejemplo.imprimeHija();
Ejemplo.imprimePadre();
}
}
El resultado del programa ser:

Valor de dato en Hija: 5


Valor de dato en Padre: 10

Mtodos: Un comportamiento similar ocurre cuando se define un mtodo con el mismo nombre y
parmetros que otro que se hereda. En este caso, el mtodo al que se accede a travs de los
objetos de la clase hija es el definido en la clase hija. Se dice que el nuevo mtodo sobrescribe el
mtodo heredado.

Es importante distinguir la sobrescritura de la sobrecarga:

Sobrecarga: El mismo identificador con diferentes parmetros.


Sobrescritura: Mismo identificador y parmetros (nmero de parmetros y tipo de datos de
stos).

Al identificador del mtodo y lista de parmetros con sus tipos, se le conoce como firma del
mtodo.

La sobrescritura est asociada con la herencia. Si se pretende sobrescribir un mtodo heredado


pero se usa una firma distinta (por ejemplo, aadiendo un parmetro ms) no se tendr
sobrescritura y los dos mtodos sobrecargados son accesibles desde los objetos creados de la
clase hija. La finalidad de la sobrescritura es que se pueda usar slo un identificador y un nico
conjunto de parmetros para diferentes clase relacionadas por herencia. El cdigo de cada mtodo
sobrescrito es diferente en la clase hija que en la clase padre.

Ejemplo:

class Padre {
protected int n=10;

Pgina: 30
Programacin Orientada a Objetos
public void imprimir()
{
System.out.println(En clase Padre, n= +n);
}
} // fin de la clase Padre
class Hija extends Padre {
protected int m=20;
public void imprimir() // mtodo sobrescrito
{
System.out.println(En clase Hija, m= +m);
}
}
class Herencia
{
public static void main(String [ ] args)
{
Padre x=new Padre();
Hija y=new Hija();
x.imprimir();
y.imprimir();
}
}

En la clase Hija se sobrescribe el mtodo imprimir(), por lo que el cdigo de los objetos de esta
clase usan el cdigo del mtodo escrito para est y el resultado ser:

En clase Padre, n= 10
En clase Hija, m= 20

7 Polimorfismo y reutilizacin

7.1 Concepto del polimorfismo.

El polimorfismo es la capacidad de una entidad determinada de conectarse a objetos de varias


clases relacionadas por herencia. Esta capacidad tiene sentido y sirve para algo si esos distintos
objetos de diferentes clases tienen mtodos sobresctitos, que son los que se van a invocar a travs
de la referencia polimrfica. El polimorfismo implica la posibilidad de usar una sola referencia para
referirse a varios objetos relacionados jerrquicamente. Generalmente, en una clase padre se
declara un mtodo que es el que se va a usar polimrficamente. Entonces, ese mismo mtodo se
redefine en clases que son derivadas de la clase padre, es decir, el mtodo se sobrescribe. As,
existirn mtodos en las clases descendientes con la misma firma que el de la clase padre. Si un
objeto de la clase padre se declara en un programa, la definicin del mtodo original que se
encuentra en la clase padre ser la que se invoque cuando se llame al mtodo. Sin embargo, si un
objeto de una clase hija se asigna posteriormente a la referencia de la clase padre, entonces se
invoca la definicin de mtodo para la clase hija.

En trminos prcticos, el polimorfismo implica que una referencia puede referir a cualquier objeto
de su clase o a un objeto de una clase descendiente de la primera.

Ejemplo:

class Padre {
void onToy()
{
System.out.println("Estoy en el mtodo de Padre");
}

Pgina: 31
Programacin Orientada a Objetos
} // fin clase padre

class HijaPrimera extends Padre {


void onToy()
{
System.out.println("Estoy en el mtodo de HijaPrimera");
}
} // fin clase HijaPrimera

class HijaSegunda extends Padre {


void onToy()
{
System.out.println("Estoy en el mtodo de HijaSegunda");
}
} // fin clase HijaSegunda

public class Herencia {


public static void main(String[] args)
{ Padre padre = new Padre();
HijaPrimera hprimera=new HijaPrimera();
HijaSegunda hsegunda=new HijaSegunda();

Padre polimorfico;
polimorfico=padre; // hace referencia a un objeto padre
polimorfico.onToy();

polimorfico=hprimera; // hace referencia a un objeto hprimera


polimorfico.onToy();

polimorfico=hsegunda; // hace referencia a un objeto hsegunda


polimorfico.onToy();
}
}

Al ejecutar el programa se tendra la siguiente salida:

Estoy en el mtodo de Padre


Estoy en el mtodo de HijaPrimera
Estoy en el mtodo de HijaSegunda

Otro Ejemplo:

class Elipse
{ double ejeX, ejeY;
Elipse(double a,double b)
{ ejeX=a;
ejeY=b;
}
double Area()
{ return Math.PI*ejeX*ejeY;
}
String prueba()
{
return "Mtodo de class Elipse";
}
}

Pgina: 32
Programacin Orientada a Objetos

class Circulo extends Elipse


{
Circulo(double r)
{
super(r,r);
}
double Longitud()
{
return 2*Math.PI*ejeX;
}
String prueba()
{
return "Mtodo de class Circulo";
}
}

public class Herencia {


public static void main(String[] args)
{
Elipse obj1=new Circulo(10);
Circulo obj2=new Circulo(10);
Elipse obj3=new Elipse(10,1);

// Sentencias (ver tabla)


}
}

En la tabla siguiente se incluye algunas sentencias y sus resultados:

Sentencias Resultado y Explicacin


System.out.println(obj1.Longitud()); Error al compilar. Desde Elipse no se ve Longitud().
System.out.println(obj1.prueba()); Mtodo de class Circulo. Al estar sobrecargado, busca el mtodo
de la subclase.
System.out.println(obj1.Area()); 10*10*PI
System.out.println(obj2.Longitud()); 20*PI
System.out.println(obj2.prueba()); Mtodo de class Circulo
System.out.println(obj2.Area()); 100*PI La subclase hereda los mtodos de la superclase.
System.out.println(obj3.Area()); 10*PI
System.out.println(((Circulo)obj1).Longitud()); 20*PI Para aplicar el mtodo Longitud a Elipse hay que
transformarlo en Circulo.

7.2 Clases abstractas.

7.2.1 Definicin.

Hay ocasiones, cuando se desarrolla una jerarqua de clases en que algn comportamiento est
presente en todas ellas pero se materializa de forma distinta para cada una. Por ejemplo,
pensemos en una estructura de clases para manipular figuras geomtricas. Podramos pensar en
tener una clase genrica, que podra llamarse FiguraGeometrica y una serie de clases que
extienden a la anterior que podran ser Circulo, Poligono, etc. Podra haber un mtodo dibujar dado
que sobre todas las figuras puede llevarse a cabo esta accin, pero las operaciones concretas para
llevarla a cabo dependen del tipo de figura en concreto (de su clase). Por otra parte la accin

Pgina: 33
Programacin Orientada a Objetos
dibujar no tiene sentido para la clase genrica FiguraGeometrica, porque esta clase representa una
abstraccin del conjunto de figuras posibles.

Para resolver esta problemtica Java proporciona las clases y mtodos abstractos. Un mtodo
abstracto es un mtodo declarado en una clase para el cual esa clase no proporciona la
implementacin (el cdigo). Una clase abstracta es una clase que tiene al menos un mtodo
abstracto. Una clase que extiende a una clase abstracta debe implementar los mtodos abstractos
(escribir el cdigo) o bien volverlos a declarar como abstractos, con lo que ella misma se convierte
tambin en clase abstracta.

Declaracin e implementacin de mtodos abstractos

Siguiendo con el ejemplo del apartado anterior, se puede escribir:

abstract class FiguraGeometrica


{
abstract void dibujar();
. . .
}

class Circulo extends FiguraGeometrica


{
void dibujar()
{
// codigo para dibujar Circulo
}
}

La clase abstracta se declara simplemente con el modificador abstract en su declaracin. Los


mtodos abstractos se declaran tambin con el mismo modificador, declarando el mtodo pero sin
implementarlo (sin el bloque de cdigo encerrado entre {}). La clase derivada se declara e
implementa de forma normal, como cualquier otra. Sin embargo si no declara e implementa los
mtodos abstractos de la clase base (en el ejemplo el mtodo dibujar) el compilador genera un
error indicando que no se han implementado todos los mtodos abstractos y que, o bien, se
implementan, o bien se declara la clase abstracta.

Referencias y objetos abstractos

Se pueden crear referencias a clases abstractas como cualquier otra. No hay ningn problema en
poner:

FiguraGeometrica figura;

Sin embargo una clase abstracta no se puede instanciar, es decir, no se pueden crear objetos de
una clase abstracta. El compilador producir un error si se intenta:

FiguraGeometrica figura = new FiguraGeometrica();

Esto es coherente dado que una clase abstracta no tiene completa su implementacin y encaja
bien con la idea de que algo abstracto no puede materializarse.

Sin embargo utilizando el up-casting visto en el captulo dedicado a la Herencia si se puede


escribir:

FiguraGeometrica figura = new Circulo(. . .);

Pgina: 34
Programacin Orientada a Objetos

figura.dibujar();

La invocacin al mtodo dibujar se resolver en tiempo de ejecucin y la JVM llamar al mtodo de


la clase adecuada. En nuestro ejemplo se llamar al mtodo dibujar de la clase Circulo.

Ejemplo 2:

import java.util.*;
abstract class Instrumento {
public abstract void tocar();
public String tipo()
{
return "Instrumento";
}
public abstract void afinar();
}
class Guitarra extends Instrumento {
public void tocar()
{
System.out.println("Guitarra.tocar()");
}
public String tipo()
{
return "Guitarra";
}
public void afinar() {}
}
class Piano extends Instrumento {
public void tocar()
{
System.out.println("Piano.tocar()");
}
public String tipo()
{
return "Piano";
}
public void afinar() {}
}
class Saxofon extends Instrumento {
public void tocar()
{
System.out.println("Saxofon.tocar()");
}
public String tipo()
{ return "Saxofon"; }
public void afinar() {}
}
// Un tipo de Guitarra
class Guzla extends Guitarra {
public void tocar()
{
System.out.println("Guitarra Guzla.tocar()");
}
public void afinar()
{

Pgina: 35
Programacin Orientada a Objetos
System.out.println("Guzla.afinar()");
}
}
// Un tipo de Guitarra
class Ukelele extends Guitarra {
public void tocar()
{
System.out.println("Guitarra Ukelele.tocar()");
}
public String tipo()
{
return "Ukelele";
}
}
public class Musica
{ // No importa el tipo de Instrumento,
// seguir funcionando debido a Polimorfismo:
static void afinar(Instrumento i) { // ...
i.tocar();
}
static void afinarTodo(Instrumento[] e) {
for(int i = 0; i < e.length; i++)
{
System.out.println("Es un instrumento de tipo: "+e[i].tipo());
afinar(e[i]);
}
}
public static void main(String[] args)
{ // Declarar un Arreglo SIN INSTANCIAS es valido en Clases Abstractas
Instrumento[] orquesta = new Instrumento[5];
// Generar una INSTANCIA de una la Clase Abstracta no es valido
// Instrumento nuevo = new Instrumento();
int i = 0; // Up-casting al asignarse el Arreglo
orquesta[i++] = new Guitarra();
orquesta[i++] = new Piano();
orquesta[i++] = new Saxofon();
orquesta[i++] = new Guzla();
orquesta[i++] = new Ukelele();
afinarTodo(orquesta);
orquesta[3].afinar();
}
}

La salida sera:

Es un instrumento de tipo: Guitarra


Guitarra.tocar()
Es un instrumento de tipo: Piano
Piano.tocar()
Es un instrumento de tipo: Saxofon
Saxofon.tocar()
Es un instrumento de tipo: Guitarra
Guitarra Guzla.tocar()
Es un instrumento de tipo: Ukelele
Guitarra Ukelele.tocar()
Guzla.afinar()

Pgina: 36
Programacin Orientada a Objetos

7.3 Definicin de una interfaz.

El concepto de Interface lleva un paso ms adelante la idea de las clases abstractas. En Java una
interface es una clase abstracta pura, es decir una clase donde todos los mtodos son abstractos
(no se implementa ninguno). Permite al diseador de clases establecer la forma de una clase
(nombres de mtodos, listas de argumentos y tipos de retorno, pero no bloques de cdigo). Una
interface puede tambin contener datos miembro, pero estos son siempre static y final. Una
interface sirve para establecer un 'protocolo' entre clases.

Para crear una interface, se utiliza la palabra clave interface en lugar de class. La interface puede
definirse public o sin modificador de acceso, y tiene el mismo significado que para las clases.
Todos los mtodos que declara una interface son siempre public.

Para indicar que una clase implementa los mtodos de una interface se utiliza la palabra clave
implements. El compilador se encargar de verificar que la clase efectivamente declare e
implemente todos los mtodos de la interface. Una clase puede implementar ms de una interface.

Declaracin y uso

Una interface se declara:

interface nombre_interface
{
tipo_retorno nombre_metodo ( lista_argumentos ) ;
...
}

Por ejemplo:

interface Figura {
int area();
}

y una clase que lo implementa:

public class Cuadrado implements Figura


{
int lado;
public Cuadrado (int ladoParametro)
{
lado = ladoParametro;
}
public int area()
{
return lado*lado;
}
public int perimetro() // Mtodo no implementado en la interface
{
return lado*4;
}
}

Uso de la clase:

public class PruebaInterfaz

Pgina: 37
Programacin Orientada a Objetos
{
public static void main(String args[])
{
Figura figura=new Cuadrado (5); // Haciendo referencia desde Figura
System.out.println(figura.area());
System.out.println("Perimetro= "+figura.perimetro()); // Error Mtodo no

Cuadrado c=new Cuadrado (4); // Haciendo referencia desde Cuadrado


System.out.println("Area= "+c.area());
System.out.println("Perimetro= "+c.perimetro()); // Si acetado
}
}

Al utilizar implements para la interface es como si se hiciese una accin de copiar-y-pegar del
cdigo de la interface, con lo cual no se hereda nada, solamente se pueden usar los mtodos.

La ventaja principal del uso de interfaces es que una clase interface puede ser implementada por
cualquier nmero de clases, permitiendo a cada clase compartir la interfaz de programacin sin
tener que ser consciente de la implementacin que hagan las otras clases que implementen el
interface.

Referencias a Interfaces

Es posible crear referencias a interfaces, pero las interfaces no pueden ser instanciadas. Una
referencia a una interface puede ser asignada a cualquier objeto que implemente la interface. Por
ejemplo:

InstrumentoMusical instrumento = new Guitarra();


instrumento.play();
System.out.prinln(instrumento.tipoInstrumento());

InstrumentoMusical i2 = new InstrumentoMusical(); //error.No se puede instanciar

Extensin de interfaces

Las interfaces pueden extender otras interfaces y, a diferencia de las clases, una interface puede
extender ms de una interface. La sintaxis es:

interface nombre_interface extends nombre_interface , . . .


{
tipo_retorno nombre_metodo ( lista_argumentos ) ;
...
}

Agrupaciones de constantes

Dado que, por definicin, todos los datos miembros que se definen en una interface son static y
final, y dado que las interfaces no pueden instanciarse resultan una buena herramienta para
implantar grupos de constantes. Por ejemplo:

public interface Meses


{
int ENERO = 1 , FEBRERO = 2 . . . ;
String [ ] NOMBRES_MESES = { " " , "Enero" , "Febrero" , . . . };
}

Pgina: 38
Programacin Orientada a Objetos
Esto puede usarse simplemente:

System.out.println(Meses.NOMBRES_MESES[ENERO]);

Diferencias entre un interface y una clase abstracta

Una interface es simplemente una lista de mtodos no implementados, adems puede incluir la
declaracin de constantes. Una clase abstracta puede incluir mtodos implementados y no
implementados o abstractos, miembros dato constantes y otros no constantes.

7.4 Definicin y creacin de paquetes/librera.

Los paquetes son el mecanismo por el que Java permite agrupar clases, interfaces, excepciones y
constantes. De esta forma, se agrupan conjuntos de estructuras de datos y de clases con algn
tipo de relacin en comn.

Con la idea de mantener la reutilizacin y facilidad de uso de los paquetes desarrollados es


conveniente que las clases e interfaces contenidas en los mismos tengan cierta relacin funcional.
De esta manera los desarrolladores ya tendrn una idea de lo que estn buscando y fcilmente
sabrn qu pueden encontrar dentro de un paquete.

Creacin de un paquete

a.) Declaracin: Para declarar un paquete se utiliza la sentencia package seguida del nombre del
paquete que estemos creando:

package NombrePaquete;

La estructura que ha de seguir un fichero fuente en Java es:

Una nica sentencia de paquete (opcional).


Las sentencias de importacin deseadas (opcional).
La declaracin de una (y slo una) clase pblica (public).
Las clases privadas del paquete (opcional).

Por lo tanto la sentencia de declaracin de paquete ha de ser la primera en un archivo fuente Java.

b.) Subpaquetes: Cada paquete puede tener a su vez paquetes con contenidos parecidos, de
forma que un programador probablemente estar interesado en organizar sus paquetes de forma
jerrquica. Para eso se definen los subpaquetes.

Para crear un subpaquete bastar con almacenar el paquete hijo en un directorio


Paquete/Subpaquete.

As una clase dentro de un subpaquete como Paquete.Subpaquete.clase estar codificada en el


fichero Paquete/Subpaquete.java.

c.) Uso de un paquete: Con el fin de importar paquetes ya desarrollados se utiliza la sentencia
import seguida del nombre de paquete o paquetes a importar.

Se pueden importar todos los elementos de un paquete o slo algunos.

Para importar todas las clases e interfaces de un paquete se utiliza el metacaracter *:

import PaquetePrueba.*;

Pgina: 39
Programacin Orientada a Objetos
Tambin existe la posibilidad de que se deseen importar slo algunas de las clases de un cierto
paquete o subpaquete:

import Paquete.Subpaquete1.Subpaquete2.Clase1;

Para acceder a los elementos de un paquete, no es necesario importar explcitamente el paquete


en que aparecen, sino que basta con referenciar el elemento tras una especificacin completa de la
ruta de paquetes y subpaquetes en que se encuentra.

Paquete.Subpaquetes1.Subpaquete2.Clase_o_Interfaz.elemento

En la API de Java se incluyen un conjunto de paquetes ya desarrollados que se pueden incluir en


cualquier aplicacin Java que se desarrolle.

d.) mbito de los elementos de un paquete: Al introducir el concepto de paquete, surge la duda
de cmo proteger los elementos de una clase, qu visibilidad presentan respecto al resto de
elementos del paquete, respecto a los de otros paquetes...

Ya en la herencia se vieron los identificadores de visibilidad public (visible a todas las clases),
private (no visible ms que para la propia clase), y protected (visible a clases hijas).

Por defecto se considera los elementos (clases, variables y mtodos) de un mismo paquete como
visibles entre ellos.
Situacin del elemento private sin modificador protected public

En la misma clase S S S S

En una clase en el mismo paquete No S S S

En una clase hija en otro paquete No No S S

En una clase no hija en otro paquete No No No S


Tabla: Visibilidad dentro de un paquete
8 Excepciones.

8.1 Definicin.

El trmino excepcin se utiliza cuando algo sali mal, es decir, cuando ocurri un error. Como
seguramente usted sabe, existe un gran nmero de situaciones por la que el software puede fallar,
pero el software de buena calidad debe de enfrentar esos problemas de manera satisfactoria.

En Java una excepcin es un objeto que define una situacin inusual o un error.

Cuando se crean sistemas de software y de hardware, la mayora se encuentra en forma de


elementos empacados, por ejemplo, tarjetas de circuitos, clases y mtodos de Java. Para
simplificar el proceso de diseo, es esencial tratar estos elementos como encapsulados, de tal
forma que no es necesario preocuparse de cmo funcionan internamente, pero si es necesario que
informen a nuestro software sobre las situaciones de error.

Los sistemas complejos constan de una jerarqua de mtodos y algunas excepciones pueden
manejarse de forma local en el mtodo que ocurren, y en algunos otros casos pueden pasarse a
mtodos de nivel ms alto, por supuesto todo depende de la naturaleza del error. As, existen
varias categoras de errores, las cuales pueden ser tratadas en distintos lugares.

As, un programa puede estar diseado para procesar las excepciones en tres formas distintas:

Pgina: 40
Programacin Orientada a Objetos
No manejarla
Manejar la excepcin cuando ocurre
Manejar la excepcin en algn otro punto del programa

Un ejemplo de un programa que no maneja excepciones es cuando al ejecutarse el programa se


detiene y marca un error, de tal forma que la ltima sentencia nunca ser ejecutada.

En general el cdigo para manejar errores podra ser:

si algoSaleMal
encargarse del problema
otro
situacin normal

Sin embargo cuando se realizan ms acciones el cdigo:

hacerA ( )
hacerB ( )
hacerC ( )

se convierte en:

hacerA ( )
si A sali mal
encargarse del problema cuando A sali mal
otro
comienza
hacerB ( )
si B sali mal
encargarse del problema cuando B sali mal
otro
comienza
hacerC ( )
si C sali mal
encargarse del problema cuando C sali mal
termina
termina

Ya que no se espera que los casos de error ocurran muy a menudo, Java ofrece apegarnos a la
codificacin para el caso normal, y manejar las excepciones en un rea separada del programa.

Las excepciones en Java son objetos, por lo que es necesario utilizar el operador new para crear
una instancia de una clase apropiada de excepciones.

Para indicar que ha ocurrido una excepcin, se dice que se ha lanzado y cuando se detectan en
cualquier otra parte, se dice que son atrapadas. Java tiene las palabras clave:

throws
throw
try
catch

Las excepciones predefinidas y su jerarqua de clases es la que se muestra en la figura:

Pgina: 41
Programacin Orientada a Objetos

Los nombres de las excepciones indican la condicin de error que representan.

Las siguientes son las excepciones predefinidas ms frecuentes que se pueden encontrar:

ArithmeticException: Las excepciones aritmticas son tpicamente el resultado de una divisin


por 0:

int i = 12 / 0;

NullPointerException: Se produce cuando se intenta acceder a una variable o mtodo antes de


ser definido.

IncompatibleClassChangeException: El intento de cambiar una clase afectada por referencias


en otros objetos, especficamente cuando esos objetos todava no han sido recompilados.

ClassCastException: El intento de convertir un objeto a otra clase que no es vlida.

Pgina: 42
Programacin Orientada a Objetos
NegativeArraySizeException: Puede ocurrir si hay un error aritmtico al intentar cambiar el
tamao de un array.

OutOfMemoryException: No debera producirse nunca! El intento de crear un objeto con el


operador new ha fallado por falta de memoria. Y siempre tendra que haber memoria suficiente
porque el garbage collector se encarga de proporcionarla al ir liberando objetos que no se usan y
devolviendo memoria al sistema.

NoClassDefFoundException: Se referenci una clase que el sistema es incapaz de encontrar.

ArrayIndexOutOfBoundsException: Es la excepcin que ms frecuentemente se produce. Se


genera al intentar acceder a un elemento de un array ms all de los lmites definidos inicialmente
para ese array.

UnsatisfiedLinkException: Se hizo el intento de acceder a un mtodo nativo que no existe.

InternalException: Este error se reserva para eventos que no deberan ocurrir. Por definicin, el
usuario nunca debera ver este error y esta excepcin no debera lanzarse.

Tambin podemos lanzar nuestras propias excepciones, extendiendo la clase System.exception.

Por ejemplo, consideremos un programa cliente/servidor. El cdigo cliente se intenta conectar al


servidor, y durante 5 segundos se espera a que conteste el servidor. Si el servidor no responde, el
servidor lanzara la excepcin de time-out:

class ServerTimeOutException extends Exception


{
}

public void conectame( String nombreServidor ) throws Exception


{
int exito;
int puerto = 80;
exito = open( nombreServidor,puerto );
if( exito == -1 )
throw ServerTimeOutException;
}

Si se quieren capturar las propias excepciones, se deber utilizar la sentencia //try//:

public void encuentraServidor()


{
...
try
{
conectame( servidorDefecto );
}
catch( ServerTimeOutException e )
{
g.drawString("Time-out del Servidor, intentando alternativa",5,5 );
conectame( servidorAlterno );

}
...
}

Pgina: 43
Programacin Orientada a Objetos
Cualquier mtodo que lance una excepcin tambin debe capturarla, o declararla como parte de la
interface del mtodo. Cabe preguntarse entonces, el porqu de lanzar una excepcin si hay que
capturarla en el mismo mtodo. La respuesta es que las excepciones no simplifican el trabajo del
control de errores. Tienen la ventaja de que se puede tener muy localizado el control de errores y
no tenemos que controlar millones de valores de retorno, pero no van ms all.
A continuacin se presenta un ejemplo muy simple:

import java.util.*;
public class Main {
public static void main(String[] args)
{
Scanner t=new Scanner(System.in);
int a,s=0;
double b;
boolean x=true;
do
{
try
{
x=false;
System.out.println("Teclea un entero");
a=t.nextInt();
System.out.println("Teclea un double");
b=t.nextDouble();
if(s==0)
{
s++;
a=a/0;
}
}
catch (InputMismatchException e)
{
System.out.println("Ya valio....no es de su tipo-->>"+e.toString());
x=true;
t.nextLine();
}
catch (ArithmeticException e)
{
System.out.println("Ya vali....captur div. Entre cero-->>"+e.toString());
x=true;
t.nextLine();
}
finally
{
System.out.println("Hace el finally ");
}
}while(x);
}
}

Otro ejemplo:

/**
* Aplicacin para duplicar un entero dado por el usuario Sin manejo de excepciones
*/
public class ApliD1

Pgina: 44
Programacin Orientada a Objetos
{
public static void main()
{
// crear objetos
System.out.print ("Dame un entero: ");
int entrada = Teclado.readInt ();
System.out.print("El nmero duplicado es: ");
int salida = 2*entrada;
}
}

En caso de no introducir un entero se produce el siguiente error:

Exception in thread "main" java.util.InputMismatchException

La estructura de control try-catch tiene la siguiente forma:


try
{
enunciados
}
catch (AlgunaExcepcinA e)
{
enunciados
}
catch (AlgunaExcepcinB e)
{
enunciados
}
.....
finally
{
enunciados
}

y Java tratar de ejecutar el bloque de enunciados dentro del try, si no ocurre ninguna excepcin,
se ignorar el bloque de enunciados dentro del catch y si se produce una excepcin del bloque try,
entonces se puede ejecutar el bloque catch especificndo el tipo de excepcin que se quiere tratar.
Si ocurre un tipo que no est especifcado entonces no se ejecutar el bloque catch.

Independientemente de si ocurre una excepcin o no, se ejecutarn los enunciados que se


encuentran en el bloque finally, el cual es oopcional incluirlo.
Recuerde que las variables declaradas dentro de un bloque existen dentro de l y no fuera de l,
de tal forma que si declara una variable dentro del bloque try, no podr utilizarla dentro del bloque
catch. Por supuesto que una solucin a este problema es declarar dicha variable fuera y antes de
estos bloques.
Como ya se mencion, 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 lgica del programa como un ndice de un array fuera de su rango, una divisin por
cero o errores disparados por los propios objetos que denuncian algn tipo de estado no previsto, o
condicin que no pueden manejar.

La idea general es que cuando un objeto encuentra una condicin que no sabe manejar crea y
dispara una excepcin que deber ser capturada por el que le llam o por alguien ms arriba en la
pila de llamadas. Las excepciones son objetos que contienen informacin del error que se ha
producido y que heredan de la clase Throwable o de la clase Exception. Si nadie captura la

Pgina: 45
Programacin Orientada a Objetos
excepcin interviene un manejador por defecto que normalmente imprime informacin que ayuda a
encontrar quin produjo la excepcin.

Existen dos categoras de excepciones:

Excepciones verificadas: El compilador obliga a verificarlas. Son todas las que son lanzadas
explicitamente por objetos de usuario.

Excepciones no verificadas: El compilador no obliga a su verificacin. Son excepciones como


divisiones por cero, excepciones de puntero nulo, o ndices fuera de rango.

Generacin de excepciones

Supongamos que tenemos una clase Empresa que tiene un array de objetos Empleado. En esta
clase podramos tener mtodos para contratar un Empleado (aadir un nuevo objeto al array),
despedirlo (quitarlo del array) u obtener el nombre a partir del nmero de empleado. La clase
podra ser algo as como lo siguiente:

public class Empresa


{
String nombre;
Empleado [] listaEmpleados;
int totalEmpleados = 0;
...
Empresa(String n, int maxEmp)
{
nombre = n;
listaEmpleados = new Empleado [maxEmp];
}
...
void nuevoEmpleado(String nombre, int sueldo)
{
if (totalEmpleados < listaEmpleados.length )
{
listaEmpleados[totalEmpleados++] = new Empleado(nombre,sueldo);
}
}
}

Obsrvese en el mtodo nuevoEmpleado que se comprueba que hay sitio en el array para
almacenar la referencia al nuevo empleado. Si lo hay se crea el objeto. Pero si no lo hay el mtodo
no hace nada ms. No da ninguna indicacin de si la operacin ha tenido xito o no. Se podra
hacer una modificacin para que, por ejemplo el mtodo devolviera un valor booleano true si la
operacin se ha completado con xito y false si ha habido algn problema.

Otra posibilidad es generar una excepcin verificada (una excepcin no verificada se producira si
no se comprobara si el nuevo empleado va a caber o no en el array). Vamos a ver como se hara
esto.

Las excepciones son clases, que heredan de la clase genrica Exception. Es necesario por tanto
asignar un nombre a nuestra excepcin. Se suelen asignar nombres que den alguna idea del tipo
de error que controlan. En nuestro ejemplo le vamos a llamar CapacidadEmpresaExcedida.

Para que un mtodo lance una excepcin:


Debe declarar el tipo de excepcin que lanza con la clusula throws, en su declaracin.

Pgina: 46
Programacin Orientada a Objetos
Debe lanzar la excepcin, en el punto del cdigo adecuado con la sentencia throw.

En nuestro ejemplo:

void nuevoEmpleado(String nombre, int sueldo) throws CapacidadEmpresaExcedida


{
if (totalEmpleados < listaEmpleados.length)
{
listaEmpleados[totalEmpleados++] = new Empleado(nombre,sueldo);
}
else
throw new CapacidadEmpresaExcedida(nombre);
}

Adems, necesitamos escribir la clase CapacidadEmpresaExcedida. Sera algo como:

public class CapacidadEmpresaExcedida extends Exception


{
CapacidadEmpresaExcedida(String nombre)
{
super("No es posible aadir el empleado " + nombre);
}
...
}

La sentencia throw crea un objeto de la clase CapacidadEmpresaExcedida. El constructor tiene un


argumento (el nombre del empleado). El constructor simplemente llama al constructor de la
superclase pasndole como argumento un texto explicativo del error ( y el nombre del empleado
que no se ha podido aadir).

La clase de la excepcin puede declarar otros mtodos o guardar datos de depuracin que se
consideren oportunos. El nico requisito es que extienda la clase Exception. Consultar la
documentacin del API para ver una descripcin completa de la clase Exception.

De esta forma se pueden construir mtodos que generen excepciones.

Captura de excepciones

Con la primera versin del mtodo nuevoEmpleado (sin excepcin) se invocara este mtodo de la
siguiente forma:

Empresa em = new Empresa("La Mundial");


em.nuevoEmpleado("Adn Primero",500);

Si se utilizara este formato en el segundo caso (con excepcin) el compilador producira un error
indicando que no se ha capturado la excepcin verificada lanzada por el mtodo nuevoEmpleado.
Para capturar la excepcin es utiliza la construccin try / catch, de la siguiente forma:

Empresa em = new Empresa("La Mundial");


try
{
em.nuevoEmpleado("Adn Primero",500);
}
catch (CapacidadEmpresaExcedida exc)

Pgina: 47
Programacin Orientada a Objetos
{
System.out.println(exc.toString());
System.exit(1);
}

Se encierra el cdigo que puede lanzar la excepcin en un bloque try / catch.

A continuacin del catch se indica que tipo de excepcin se va a capturar.

Despus del catch se escribe el cdigo que se ejecutar si se lanza la excepcin.

Si no se lanza la excepcin el bloque catch no se ejecuta.

El formato general del bloque try / catch es:

try
{
...
}
catch (Clase_Excepcion nombre) { . . .}
catch (Clase_Excepcion nombre) { . . .}
...

Observese que se puede capturar ms de un tipo de excepcin declarando ms de una sentencia


catch. Tambin se puede capturar una excepcin genrica (clase Exception) que engloba a todas
las dems.

En ocasiones el cdigo que llama a un mtodo que dispara una excepcin tampoco puede (o sabe)
manejar esa excepcin. Si no sabe que hacer con ella puede de nuevo lanzarla hacia arriba en la
pila de llamada para que la gestione quien le llamo (que a su vez puede capturarla o reenviarla).

8.1.1 Propagacin.

Propagar los Errores sobre la Pila de Llamadas

Una segunda ventaja de las exepciones es la posibilidad del propagar el error encontrado sobre la
pila de llamadas a mtodos. Supongamos que el mtodo leerFichero es el cuarto mtodo en una
serie de llamadas a mtodos anidadas realizadas por un programa principal: metodo1 llama a
metodo2, que llama a metodo3, que finalmente llama a leerFichero.

metodo1
{
call metodo2;
}
metodo2
{
call metodo3;
}
metodo3
{
call leerFichero;
}

Supongamos tambin que metodo1 es el nico mtodo interesado en el error que ocurre dentro de
leerFichero. Tradicionalmente las tcnicas de notificacin del error forzaran a metodo2 y

Pgina: 48
Programacin Orientada a Objetos
metodo3 a propagar el cdigo de error devuelto por leerFichero sobre la pila de llamadas hasta
que el cdigo de error llegue finalmente a metodo1 -- el nico mtodo que est interesado en l.

Como se vi anteriormente, el sistema de ejecucin Java busca hacia atrs en la pila de llamadas
para encontrar cualquier mtodo que est interesado en manejar una excepcin particular. Un
mtodo Java puede "esquivar" cualquier excepcin lanzada dentro de l, por lo tanto permite a los
mtodos que estn por encima de l en la pila de llamadas poder capturarlo. Slo los mtodos
interesados en el error deben preocuparse de detectarlo.

metodo1
{
try
{
call metodo2;
}
catch (excepcion)
{
procesodelError;
}
}
metodo2 throws excepcion
{
call metodo3;
}
metodo3 throws excepcion {
call leerFichero;
}

Sin embargo, como se puede ver desde este pseudo-cdigo, requiere cierto esfuerzo por parte de
los mtodos centrales. Cualquier excepcin chequeada que pueda ser lanzada dentro de un
mtodo forma parte de la interface de programacin pblico del mtodo y debe ser especificado en
la clausula throws del mtodo. As el mtodo informa a su llamador sobre las excepciones que
puede lanzar, para que el llamador pueda decidir concienzuda e inteligentemente qu hacer con
esa excepcin.

8.2 Excepciones definidas por el usuarios.

En algunas circunstancias el programador querr definir sus propias excepciones


El programador debe controlar cundo deben activarse dichas excepciones
Se tratan igual que las predefinidas

Ejemplo:

class DivisionPorPar extends Exception


{
public DivisionPorPar()
{
super();
}
public DivisionPorPar(Strings)
{
super(s);
}
}

Pgina: 49
Programacin Orientada a Objetos
public double dividir(double x, double y) throws DivisionPorPar
{
if (y % 2 == 0)
throw new DivisionPorPar(Divisin entre un numero par);
}

public static void main(String[] args)


{
double resul;
System.out.println(Tecleados numeros: );

/* Recoger los nmeros tecleados y guardarlos en las variables x, y */


try
resul=dividir(x, y);
catch (DivisionPorPar e)
{
y = y + 1;
resul= dividir(x,y);
}
...
}

Ejemplo

// n recibe cierto valor numrico


try
{
if (n % 2 == 1)
{ // n es impar
throw new ArithmeticException();
}
else// Cdigo normal para valores pares
}
catch (ArithmeticException e)
{
// Tratar el caso especial de valores impares
}

9 Flujos y archivos.

Un fichero es una coleccin de datos estructurados que se manejan como un todo. Los ficheros
estn organizados en unidades elementales, todas con la misma estructura, que se denominan
registros y que a su vez constan de unidades denominadas campos.

9.1 Clasificacin de acuerdo al tipo de acceso

El tipo de acceso a un fichero se refiere a la forma en que se puede acceder a un registro concreto,
es decir, la manera en la que se localiza un registro. Se consideran dos tipos de acceso a los
registros de un fichero:

Acceso Secuencial: Es aquel en el que se van recorriendo los registros de forma consecutiva. Los
registros se recorren en orden, y no se puede saltar de uno a otro que est ms de una posicin
por encima o por debajo.

Acceso Directo: Es aquel en el que se puede acceder a cualquier registro desde cualquier otro, es
decir, saltando. No es forzoso recorrer el fichero secuencialmente.

Pgina: 50
Programacin Orientada a Objetos
9.2 Definicin de Archivos de texto y archivos binarios.

Los ficheros se clasifican de acuerdo al formato usado para almacenar la informacin en ellos.

Ficheros Binarios: Son aquellos cuyo contenido son secuencias de dgitos binarios. Los ficheros
binarios se disean para que se lean desde un programa, pero no pueden leerse directamente con
un editor de texto.

Ficheros de Texto: Son aquellos cuyos contenidos son una secuencia de caracteres y pueden,
por lo tanto, ser ledos con un editor de texto.

9.3 Operaciones bsicas en archivos texto y binario.

Desde el punto de vista semntico las operaciones ms comunes que se pueden realizar sobre un
fichero pueden clasificarse y considerarse independientemente de cualquier lenguaje. Una posible
clasificacin de dichas operaciones es la siguiente:

Crear: Es la primera operacin sobre un fichero, para ello es necesario saber el tipo del fichero y
qu organizacin necesitamos para el mismo. Todo fichero debe estar creado para antes de
empezar a operar en l por primera vez.

Abrir: La apertura es la primera operacin sobre el fichero que ya existe. Esta operacin consiste
en la conexin desde el programa al fichero para permitir su uso.

Consulta: Es el acceso a los registros de un fichero para recuperar y utilizar la informacin.

Modificacin: Consiste en la alteracin (actualizacin) de la informacin de algn o algunos


registros del fichero.

Insercin: Es la inclusin de un nuevo registro en el fichero.

Eliminacin: Es la supresin de uno o mas registros del fichero.

Clausura (cerrar ficheros): Es la operacin que corta el acceso (desconecta) el fichero del
programa.. Conviene cerrar los ficheros, principalmente porque si el programa acaba
anormalmente, el sistema no cerrar el fichero automticamente. El fichero quedar abierto sin
tener ningn programa conectado a l y esto puede daarlo o bloquearlo.

En Java todos los tipos de entradas y salidas se realizan por stream (corriente) y se habla de
corrientes de entrada o de salida. Un stream es un flujo de datos. No hay sentencias de entrada y
salida en Java. La entrada y salida se realiza usando bibliotecas de clases predefinidas. La
mayora de las operaciones de entrada-salida estn definidas en el paquete java.io de la API de
Java: Por estas razones Java considera los ficheros simplemente como flujos secuenciales de
bytes. Cada fichero termina con un marcador de fichero o bien en un nmero de byte especfico
registrado en una estructura de datos administrativa mantenida por el sistema. Cuando se abre un
fichero se crea un objeto y se asocia un flujo a dicho objeto. A partir se ese momento, ese objeto
es el fichero para nuestro programa.

En el manejo de ficheros es especialmente til capturar la excepciones que se puedan producir.


Esto es, el programa podr detectar que se ha producido un problema y actuar en consecuencia
para resolverlo.

9.4 Ficheros Secuenciales de Texto

Para trabajar con ficheros secuenciales de texto se pueden usar las clases BufferedReader y
PrintWriter para lectura y escritura, respectivamente.

Pgina: 51
Programacin Orientada a Objetos
Escritura

Para escribir en un fichero de texto se puede usar la clase PrintWriter, que contiene los mtodos
print y println. Estos mtodos se comportan igual que los mtodos System.out.println() o
System.out.print() para la pantalla. Para abrir un fichero para escritura se debe crear un stream de
la clase PrintWriter, conectndolo al fichero de texto con el siguiente constructor:

PrintWriter nombreFlujoSalida;
nombreFlujoSalida=new PrintWriter(new FileWriter(nombre));

Donde nombre identifica el fichero a usar. Tambin es vlida la forma del constructor de la clase
FileWriter donde se acepta un objeto de la clase File.

Cabe destacar que el archivo nombre, si no existe lo crea, y si ya existe, lo borra y lo vuelve a
crear.

Lectura

Se debe usar la clase BufferedReader para leer un fichero de texto con el mtodo readLine() y
read(). La sintaxis es la siguiente:

BufferedReader nombreFlujoEntrada;
nombreFlujoEntrada = new BufferedReader(new FileReader(nombre));

Donde nombre, de clase String, contiene el nombre fsico del fichero.

El mtodo readLinen() devuelve el valor null cuando llega al final del fichero, y el mtodo read()
devuelve 1. El programa puede entonces comprobar el fin del fichero comprobando si readLine()
devuelve null o si read() lee un 1. estos mtodos no lanzan una EOFException.

Ejemplo:

import java.io.*; // Importar clases para manejo de archivos


import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner t=new Scanner(System.in); // Objeto para leer desde teclado
String fichero,aux;
PrintWriter salida=null; // Inicializando referencia
try
{
System.out.println("Teclea nombre del fichero");
fichero=t.nextLine();
salida=new PrintWriter(new FileWriter(fichero)); // Se abre el Fichero
System.out.println("Teclea 3 lineas:");
for(int i=1;i<=3;i++)
{
aux=t.nextLine();
salida.println(i+" "+aux);
}
salida.close(); // Se cierra el fichero
System.out.println("Se escribieron las lineas en "+fichero);
}
catch (IOException e)

Pgina: 52
Programacin Orientada a Objetos
{
System.out.println(" No se abrio bien el fichero \n"+e.toString());
}
// Ahora se va a abrir el fichero para leerlo
BufferedReader entrada=null;
boolean f=false;
try
{
do
{
try
{
f=false;
System.out.println("Teclea nombre del archivo");
fichero=t.nextLine();
entrada=new BufferedReader(new FileReader(fichero));
int i=0;
aux=entrada.readLine();
while(aux!=null)
{
i++;
System.out.println("Y dice "+aux);
aux=entrada.readLine();
}
System.out.println("Trabajo concluido");
}
catch(FileNotFoundException e)
{
System.out.println("Fichero "+" no encontrado");
System.out.println("Valor de f "+f);
f=true;
}
finally
{
if(!f)
entrada.close();
System.out.println("Hace el finally "+f);
// f=true;
}
System.out.println("Valor de f "+f);
}while(f);
}
catch(IOException e)
{
System.out.println("No se abrio bien ekl archivo "+e.toString());
}
// TODO code application logic here
}
}

9.5 Ficheros de Acceso Directo

Cuando se requiere de acceder de una forma rpida y directa a registros de un fichero sin tener
que de leer los datos que le anteceden se utilizan los ficheros de acceso directo o aleatorio. En un
fichero de acceso directo se pueden insertar datos sin necesidad de destruir los dems datos del

Pgina: 53
Programacin Orientada a Objetos
fichero. Los datos previaemte almacenados tambin pueden actualizarse o eliminarse sin tener que
rescribir todo elfichero.

Como Java no impone estructura alguna a los ficheros, la aplicacin que tenga que usar ficheros
de acceso directo deber crear y mantener la estructura necesaria. Se pueden usar diferentes
tcnicas para crear ficheros de acceso directo, pero la mas sencilla es la de exigir que todos los
registros tengan la misma longitud, de esta manera se podr calcular con facilidad, en funcin del
tamao del registro, la posicin exacta de cualquier registro relativa al principio del fichero.

9.5.1 Creacin de un fichero de acceso directo

Se utiliza la clase RandomAccessFile (fichero de acceso aleatorio). Los objetos


RandomAccessFiletienen todas las capacidades de los objetos de clase DataInputStream y
DataOutputStream. Cuando se asocia un flujoRandomAccessFile a un fichero, los datos se leen
o escriben a partir de la posicin en que se encuentre en el fichero. Todos los datos se leen o
escriben como tipos de datos primitivos. Por ejemplo, al escribir un valor int, se envan 4 bytes al
fichero. Al leer un valor double, se recuperan 8 bytes del fichero. El tamao de los diversos tipos
de datos est garantizado porque Java tiene tamaos fijos para todos los tipos de datos primitivos,
sea cual sea el ordenador o sistema operativo de trabajo.

Para trabajar con un archivo de acceso directo se tiene:

RandomAccessFile nombreCanal;
NombreCanal=new RandomAccessFile(nombreFichero,modo);
Donde:

NombreCanal es el nombre del objeto que servir como canal de comunicacin entre el programa y
el fichero.

NombreFichero identifica el nombre del fichero (puede ser una constante o variable de tipo String).

Modo indica el modo de apertura del fichero. Este modo puede ser slo de lectura (r) o lectura-
escritura (rw). Si el modo seleccionado es r, el fichero ya debe existir, si el modo es rw, si el
fichero existe lo abre y si no existe lo crea.

Se debe entender claramente que en Java el fichero es una secuencia lineal de bytes que concluye
en algn tipo de marca de fin de fichero (EOF). Para conocer dnde estamos en el fichero existe un
puntero interno de posicin (ver figuta).

EOF

Puntero

Con este esquema en mente se puede comentar algunos de los mtodos genricos de la clase
RandomAccessFile:

void seek(long posicin): Se usa para establecer la posicin actual del puntero dentro del fichero.
La variable posicin indica el nmero de bytes desde el principio del fichero. Despus de llamar a
seek, la siguiente operacin de lectura o escritura se realizar en la nueva posicin dentro del
fichero.

Pgina: 54
Programacin Orientada a Objetos
long getFilePointer(): Devuelve la posicin actual del puntero del fichero (en bytes) a partir del
principio del fichero.

int skipBytes(int desplazamiento): Mueve el puntero, desde laposicin actual, el nmero de


bytes indicado por desplazamiento, hacia delante si el valor es positivo o hacia atrs si el valor es
negativo.

long length(): Devuelve la longitud del fichero en bytes.

Una vez usado el fichero, debemos cerrarlo con el mtodo close().

9.5.2 Escritura en un fichero de acceso directo

Primero se debe abrir el fichero en modo de lectura-escritura (rw),

Ejemplo:

RandomAccessFile salida;
salida=new RandomAccessFile(Ejemplo.dat,rw);

Si el fichero Ejemplo.dat no existe, se crea, y si ya existe, se abre y deja el apuntador en el inicio


del fichero.

Al igual que en los ficheros de acceso secuencial se debe capturar la IOException. Una vez
abierto el fichero, se podr escribir en l. Existen varios mtodos anlogos a los de las clases
DataOutputStream. Algunos de ellos son:

writeInt(entero): Escriben un entero de tipo int.

writeDouble(doble): Escriben un dato de tipo double.

writeByte(entero): Escriben una entero de tipo byte.

writeBytes(cadena): Escriben una cadena como una secuencia de bytes.

writeUTF(cadena): Escriben una cadena usando el formato UTF (Formato Independiente de la


Plataforma) que usa 8 bits para los caracteres normales. Este formato aade 2 bytes al
principio, que indican la cantidad de bytes que conforman la cadena. Por eso, si escribimos n
caracteres en UTF, en el fichero se escribirn n bytes + 2 bytes..

Existen mtodos para cada uno de los tipos de datos primitivos.

El mtodo close se debe usar para cerrar los ficheros.

9.5.3 Lectura de un fichero de acceso directo

Se debe abrir el fichero de la misma manera que en el punto anterior, con la observacin siguiente:
Si slo se desea tener acceso al fichero para leer los registros, el modo de apertura es r. Si
adems de leer se va a escribir en el fichero (actualizacin), el fichero se abre en modo rw.

Ejemplo:

RandomAccessFile entrada;
entrada=new RandomAccessFile(Ejemplo.dat,r);

Tambin se tienen mtodos similares a los de la clase DataInputStream. Algunos mtodos son:

Pgina: 55
Programacin Orientada a Objetos

readInt(), readDouble(), readUTF() y, en resumen, mtodos para cada uno de los tipos de datos
primitivos.
Es importante saber cmo moverse en los ficheros. Para trabajar a nivel de registro lo ms til es
poder saltar registros y no bytes. Eb Java esto se puede hacer conociendo el nmero de bytes de
cada registro. Suponiendo que en un fichero de acceso directo se almacenan los datos de los
clientes de una empresa, que constan de un nmero de orden (int), el nombre escrito en formato
UTF con 30 caracteres (30+2 bytes) y un saldo (double). El tamao del registro, en bytes, es: int (4
bytes) + nombre (30+2 bytes) + double (8 bytes)= 44 bytes.

Se puede asignar a una variable el tamao del registro:

LongRegistro=44;
Conociendo la longitud del registro (nmero de bytes por registro) se puede cambiar de unidades:
de registro a bytes o de bytes a registros.

Ejemplo:

import java.io.*;
import java.util.Scanner;
public class Main
{
public Main()
{
}
public static void main(String[] args)
{
Scanner t=new Scanner(System.in);
String fichero,aux,resp="respuesta";
double d;
RandomAccessFile salida;
try
{
System.out.println("Teclea nombre del archivo");
fichero=t.nextLine();
salida=new RandomAccessFile(fichero,"rw"); // modo lectura/escritura
salida.seek(salida.length()); // Se mueve el apuntador al final del fichero
System.out.println("Teclea lineas:");
int i=0;
do
{
i++;
System.out.println("Teclea linea "+i);
aux=t.nextLine();
aux=String.format("%-60s",aux);
System.out.println("Teclea real "+i);
d=t.nextDouble();
t.nextLine(); // Lectura fantasma de una cadena
salida.writeUTF(aux); // Escribe en el fichero
salida.writeDouble(d); // Escribe en el fichero
System.out.println("Otra linea??? <si/no>");
resp=t.nextLine();
}while(resp.toUpperCase().equals("SI"));
System.out.println("Se insertaron "+i+ registros);
salida.close();
System.out.println("Se escribieron las lineas en "+fichero);

Pgina: 56
Programacin Orientada a Objetos
}
catch (IOException e) // captura la Excepcion
{
System.out.println(" No se abrio bien el fichero \n"+e.toString());
}
RandomAccessFile entrada;
boolean f=false;
do
{
try
{
f=false;
System.out.println("Teclea nombre del archivo");
fichero=t.nextLine();
entrada=new RandomAccessFile(fichero,"r"); // Abre fichero
entrada.seek(0); // Mueve el puntero al inicio del fichero
long i=0;
System.out.println("Tamao Fichero: "+entrada.length());
System.out.println("\nRegistris: "+entrada.length()/70);
for(long y=0;y<entrada.length();y+=70)
{
aux=entrada.readUTF();
d=entrada.readDouble();
System.out.println(i+"\n"+aux+" real "+d);
}
entrada.close();
System.out.println("Lectura concluida");
}
catch(IOException e)
{
System.out.println("Fichero "+ fichero +" no encontrado"+e.toString());
f=true;
}
finally
{
System.out.println("Hace el finally "+f);
}
}while(f);
}
}

Pgina: 57

Anda mungkin juga menyukai