Академический Документы
Профессиональный Документы
Культура Документы
1 Entorno de desarrollo
1.1 Estructura de un programa
1.2 Proceso de desarrollo de aplicaciones
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:
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.
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
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
Produce applets
Java puede ser usado para crear dos tipos de programas: aplicaciones independientes y
applets.
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.
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)
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.
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.
El lenguaje Java proporciona una serie de paquetes que incluyen ventanas, utilidades, un sistema
de entrada/salida general, herramientas y comunicaciones.
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.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).
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
}
}
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.
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.
Pgina: 7
Programacin Orientada a Objetos
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 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:
Pgina: 8
Programacin Orientada a Objetos
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.
El ocultamiento de los datos de el TDA y slo proveer de una interfaz bien definida se conoce como
encapsulacin.
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.
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.
Ejemplo:
CLASE: Coche
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 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:
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
3 Mtodos y mensajes.
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.
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:
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.
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.
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.
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.
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.
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.
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.
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.
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.
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:
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.
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.
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+")");
}
}
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.
Pgina: 16
Programacin Orientada a Objetos
a.) La destruccin de los objetos en forma automtica.
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).
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:
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).
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:
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]);
}
Ejemplo:
int [ ] vector={1,2,3,4,5,6,7,8};
char [ ] vector={'p','r','o','g','r','a','m','a','d','o','r'};
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;
}
Se definen igual que los vectores excepto que se requiere un ndice por cada dimensin.
Su sintaxis es la siguiente:
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:
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.
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".
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.
(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.
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.
Para concluir con las reglas de promocin de tipos cuando evaluamos expresiones aqu van otros
detalles ms que hay que tener en cuenta:
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);
}
}
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:
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.
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 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 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);
}
}
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...
El resultado es:
Sobreescritura de Mtodos
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.
Ahora que hemos visto ambas formas de reescribir mtodos, revisemos las reglas y diferencias
entre ambos tipos de reescritura:
Pgina: 24
Programacin Orientada a Objetos
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.
6 Herencia.
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.
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.
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:
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();
}
}
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.
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:
Pgina: 27
Programacin Orientada a Objetos
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:
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
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 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.
A diferencia de lo que ocurre en C++ no hay herencia mltiple, es decir, cada clase tiene a lo ms
una superclase.
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).
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
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.
Al identificador del mtodo y lista de parmetros con sus tipos, se le conoce como firma del
mtodo.
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
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
Padre polimorfico;
polimorfico=padre; // hace referencia a un objeto padre
polimorfico.onToy();
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
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.
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:
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.
Pgina: 34
Programacin Orientada a Objetos
figura.dibujar();
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:
Pgina: 36
Programacin Orientada a Objetos
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
interface nombre_interface
{
tipo_retorno nombre_metodo ( lista_argumentos ) ;
...
}
Por ejemplo:
interface Figura {
int area();
}
Uso de la clase:
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
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:
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:
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:
Pgina: 38
Programacin Orientada a Objetos
Esto puede usarse simplemente:
System.out.println(Meses.NOMBRES_MESES[ENERO]);
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.
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.
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;
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.
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.
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;
Paquete.Subpaquetes1.Subpaquete2.Clase_o_Interfaz.elemento
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
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.
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
si algoSaleMal
encargarse del problema
otro
situacin normal
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
Pgina: 41
Programacin Orientada a Objetos
Las siguientes son las excepciones predefinidas ms frecuentes que se pueden encontrar:
int i = 12 / 0;
Pgina: 42
Programacin Orientada a Objetos
NegativeArraySizeException: Puede ocurrir si hay un error aritmtico al intentar cambiar el
tamao de un array.
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.
}
...
}
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;
}
}
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.
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.
Excepciones verificadas: El compilador obliga a verificarlas. Son todas las que son lanzadas
explicitamente por objetos de usuario.
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:
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.
Pgina: 46
Programacin Orientada a Objetos
Debe lanzar la excepcin, en el punto del cdigo adecuado con la sentencia throw.
En nuestro ejemplo:
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.
Captura de excepciones
Con la primera versin del mtodo nuevoEmpleado (sin excepcin) se invocara este mtodo de la
siguiente forma:
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:
Pgina: 47
Programacin Orientada a Objetos
{
System.out.println(exc.toString());
System.exit(1);
}
try
{
...
}
catch (Clase_Excepcion nombre) { . . .}
catch (Clase_Excepcion nombre) { . . .}
...
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.
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.
Ejemplo:
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);
}
Ejemplo
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.
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.
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.
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.
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));
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:
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
}
}
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.
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.
Ejemplo:
RandomAccessFile salida;
salida=new RandomAccessFile(Ejemplo.dat,rw);
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:
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.
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