Vous êtes sur la page 1sur 52

Mdulo 1

Unidad 1
Lectura 1












Materia: Taller de Algoritmos y Estructuras de Datos I
Profesor: Adriana Prez


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 2


1. RECAPITULACIN DE
JAVA

Frases introductorias

Es conveniente que todo programa comience con un comentario que
explique su propsito, el autor, la fecha y hora de la ltima modificacin
del mismo. (Deitel y Deitel, 2008, pag. 37)

En este mdulo haremos un repaso de los contenidos aprendidos del
lenguaje Java, del Paradigma Orientado a Objetos y de la Programacin
Orientada a Objetos, integrndolos con nuevos conceptos que aplicaremos
en la resolucin de situaciones reales simples y estar listos para luego en los
prximos mdulos incorporar contenidos avanzados.
Estos temas estn contenidos en los Captulos 1 y 2 de la bibliografa bsica
de la materia, Estructuras de Datos en Java, autor: Mark Allen Weiss,
editorial, Addison Wesley.
Como la materia es Taller, repasaremos los conceptos tericos
fundamentales y nos concentraremos en la prctica de la programacin en
lenguaje Java.
Comenzaremos por el lenguaje Java que lo puede descargar de su sitio
oficial http://www.java.com/es/download/ (abril 2012), con ello tendr
Java instalado en su computador, pero el entorno de trabajo ser bastante
artesanal.
Sugiero que elija un entorno de trabajo, Framework, la base es Eclipse que
puede descargarlo de http://www.eclipse.org/downloads/ (abril 2012), en
el sitio encontrar distintas versiones, incluida la de modelado y
codificacin, para quienes se animan a modelar y desarrollar en el mismo
entorno. Para esta materia se recomienda Eclipse IDE for Java Developers
En el sitio de ORACLE, encontrar varias alternativas:
Oracle JDeveloper 11g o superior desde
http://www.oracle.com/technetwork/developer-
tools/jdev/downloads/index.html (abril 2012).
NetBeans IDE 7.0, http://netbeans.org/downloads/index.html (abril
2012)
Varios framework de l0s presentados anteriormente los podr
encontrar en


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 3

http://www.oracle.com/technetwork/java/javase/downloads/index.ht
ml (abril 2012)
Una vez instalado el framework de trabajo podr crear un nuevo proyecto,
dentro del paquete source crea los paquetes necesarios y dentro de ellos
las clases que va a crear.

1.1 Tipos bsicos y Operadores.
Qu tipos de datos maneja JAVA? Trabaja con tipos de datos
fundamentales y estructuras de datos estticas, necesarias para resolver
cualquier problema.

Datos simples como variables, constantes, expresiones y funciones. Estas
pueden ser de los siguientes tipos primitivos:

Tipo
Tamao en
bits
Rango Descripcin
byte
8 -128 a 127 Entero c/signo
short
16 -2 15 a 2 15 Entero c/signo
int
32 -2 31 a 2 31 1 Entero c/signo
long
64 -2 63 a 2 63 1 Entero c/signo
float
32 3.40 x 10 38 a 3.40 x 10 -38 Decimal
double
64 1.798 x 10 308 a 1798x10 -308 Decimal
char
16 Carcter Unicode Carcter unicode
boolean
1 False, True Valor lgico

Java proporciona una serie de clases que actan como contenedores de
los tipos bsicos de datos excepto byte y short. Estas clases estn
disponibles en java.lang, que forman parte de la biblioteca estndar de
Java.

Para comenzar a programar es necesario primero conocer las Reglas
de Nomenclatura para que desde el principio formule
correctamente el cdigo de la aplicacin, es por ello que mientras
tratemos los temas del programa presentaremos los estndares y
codificacin, los cuales estn extrados del artculo original de Sun
Microsystems, Inc. Code Conventions for the JavaTM Programming
Language. http://www.oracle.com/technetwork/java/codeconv-
138413.html (2012)


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 4



Cuando crea un nuevo objeto de estas clases, se hace:

Integer entero = new Integer (25); // Se inicializa con valor en el
constructor del objeto.
int contador = entero.intValue( ); // Se obtiene su valor
Float sencillo = new Float (3.5);
double doble = sencillo.doubleValue ( ); // Lo obtiene como un dato de
64 bits.
Las clases Integer, Long, Float y Double son subclases de Number. Con
estos mtodos es posible realizar una conversin de tipos entre los distintos
tipos de datos numricos.
Tipos de Estructuras de Datos Simples
Variables
Una Variable, es una referencia a un objeto por lo tanto se puede dar:
int i;
int j=25; //con inicializacin
long num=30; //30 se define long
boolean f,t;
Button buttonOK; //Referencia a un Objeto no creado.
Valor por defecto:
(byte, short, int. long) 0
Tipo Bsico Clase Mtodo para acceder a su valor
int
Integer intValue( )
long
Long longValue( )
float
Float floatValue( )
double
Double doubleValue( )
char
Character charValue( )
boolean
Boolean booleanValue( )

String valueOf()


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 5

(float, double) 0.00
(char) \u0000
(boolean) false
cualquier referencia a un objeto null
Constantes
Las constantes almacenan un valor conocido, por lo que en su definicin se
debe inicializar, su estructura es:
final tipo nombreConstante = valor;
por ejemplo:
final int meses = 12;
final String primerdia = lunes;

Clases String Y StringBuffer
Las clases String y StringBuffer estn orientadas a manejar cadenas de
caracteres. La clase String para cadenas de caracteres constantes, es decir,
que no pueden cambiar. La clase StringBuffer permite que el
programador cambie la cadena insertando, borrando, entre otras. La
primera es ms eficiente, mientras que la segunda permite ms
posibilidades.
Ambas clases pertenecen al package java.lang, y por lo tanto no hay que
importarlas. Hay que indicar que el operador de concatenacin (+) entre
objetos de tipo String utiliza internamente objetos de la clase
StringBuffer y el mtodo append().
Los mtodos de String se pueden utilizar directamente sobre literales
(cadenas entre comillas), como por ejemplo: "Hola".length().

Mtodos de la clase String
Los objetos de la clase String se pueden crear a partir de cadenas constantes
o literals, definidas entre dobles comillas, como por ejemplo: "Hola". Java
crea siempre un objeto String al encontrar una cadena entre comillas.
A continuacin se describen dos formas de crear objetos de la clase String,
String str1 = "Hola"; // el sistema ms eficaz de crear Strings
String str2 = new String("Hola"); // tambin se pueden crear con un
constructor
El primero de los mtodos expuestos es el ms eficiente, porque como al
encontrar un texto entre comillas se crea automticamente un objeto
String, en la prctica utilizando new se llama al constructor dos veces.


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 6

Tambin se pueden crear objetos de la clase String llamando a otros
constructores de la clase, a partir de objetos StringBuffer, y de arrays de
bytes o de chars.

Cmo convertir tipos?
Casting
Mecanismo incorporado en el Lenguaje que permite tratar los datos de un
tipo distinto al definido, por ejemplo defino un int y luego lo maneja como
long.
Si bien puede utilizar los mtodos intValue(), floatValue(), en el caso de los
numricos se podra utilizar el casting:

Por Ejemplo:
short enterocorto;
int entero;
long enterolargo;
float real;
double realdouble;
entero=55000;
enterolargo=(long) entero; //No lo transforma a Long
real=1.0F;
realdouble=(double) real;
realdouble=(double) entero;







En realidad el casting no convierte, sino que indica que un objeto de
una clase se va a considerar como representante de otra.
Los boolean, no aceptan ningn casting, mientras que el
casting de char a byte o short, puede dar un negativo, ya que
char no contempla el signo.



Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 7

Operadores y expresiones
Java apoya todos los operadores estndares de C, con la misma
precedencia. La Tabla 1 muestra todos los operadores que se pueden aplicar
a tipos primitivos (incluyendo aritmticos, integrales y booleanos) en orden
de precedencia.

Los operadores son de distintos tipos, es por ello que su uso debe ser acorde
a lo que quiere significar, por ejemplo:
- Una expresin matemtica utiliza operadores matemticos dando
como resultado un tipo de dato numrico.
- Una expresin lgica utiliza operadores buleanos, su resultado ser
verdadero o falso.
- Una expresin alfanumrica utilizar el operador matemtico + para
concatenar cadenas.

Operador Tipo de Operando(s) Descripcin de la Operacin
++, -- aritmtico incremento, decremento (unario) (pre o post)
+, - aritmtico ms, menos (unario)

integral complemento de bit (unario)
! booleano complemento lgico (unario)
(tipo) cualquiera cast
*, /, % aritmtico multiplicacin, divisin, resto
+, - aritmtico suma, resta
+ cadena concatenacin de cadenas
<< integral desplazamiento hacia la izquierda
>> integral desplazamiento hacia la derecha con signo
>>>
integral desplazamiento hacia la derecha con extensin de
cero
<, <= aritmtico menor que, menor o igual que
>, >= aritmtico mayor que, mayor o igual que
== primitivo igual (tienen valores idnticos)
!= primitivo no igual (tienen valores diferentes)
& integral AND para bits
& booleano AND booleano
^ integral XOR para bits
^ booleano XOR booleano
| integral OR para bits
| booleano OR booleano
&& booleano AND condicional
| | booleano OR condicional
? : boolean, cualquiera,
cualquiera
operador condicional (ternario)
= variable, cualquiera asignacin
*=, /=, %=, variable, cualquiera asignacin con operacin
+=, -=, <<=,
>>=, >>>=,
&=, ^=, | =


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 8

1.2 Instrucciones Condicionales
Es necesario tener en cuenta que se debe aprender a escribir cdigo para
que un programa tome decisiones y para que sea capaz de ejecutar bloques
de sentencias repetidas veces.
Las Instrucciones condicionales ya las ha aplicado, en esta ocasin
reforzaremos los conceptos para que su aplicacin futura sea correcta.
Sentencia if
La sentencia if permite a un programa tomar la decisin para ejecutar una
accin u otra, basndose en el resultado verdadero o falso de una expresin
boolean.
Su sintaxis es:






Donde condicin es una expresin booleana y sentencia 1 y sentencia 2
representan a una sentencia simple o compuesta, finalizando cada una de
ellas con un punto y coma.

Anidamiento de sentencia if
Se puede escribir otra sentencia if como sentencia 1 o sentencia 2? La
respuesta es s, ya que permite el anidamiento.
Su sintaxis es:






La sentencia 1 se ejecuta si el resultado de la condicin es verdadera, la
sentencia 2 se ejecuta si el resultado de la condicin es falsa.
If (condicin){
Sentencia 1;
}
Else{
Sentencia 2;
}

If (condicin 1){
If (condicin 2){
Sentencia 1;
}}
Else{
Sentencia 2;
}


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 9

Estndares de codificacin
Sentencia if, if-else, if-else-if-else
La sentencia if debe tener el siguiente formato:




















Tabulacin
La forma exacta de la tabulacin (espacios tabuladores) no se especifica,
no obstante la unidad de tabulacin deberan ser cuatro espacios.
Longitud de lnea
Evitar las lneas de longitud no mayor de 80 caracteres (no ms de 70
caracteres), ya que se corta y algunas IDEs no las manejan bien.
Ruptura de lneas (Wrapping lines)
Cuando una expresin no cabe en una nica lnea, se debe romper de
acuerdo a estos principios generales:
if (condicin) {
sentencias;
}

if (condicin) {
sentencias;
} else {
sentencias;
}

if (condicin) {
sentencias;
} else if (condicin) {
sentencias;
} else {
sentencias;
}



Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 10

Romper despus de una coma.
Romper antes de un operador.
Preferir las rupturas de alto nivel a las de bajo nivel.
Alinear la nueva lnea con el principio de la expresin al mismo nivel que la
lnea anterior.
Si las reglas anteriores llevan a un cdigo confuso o demasiado pegado al
margen derecho, entonces tabular slo con 8 espacios.
Tantas normas solo porque la longitud de la lnea es mayor a 80 parecen
innecesarias e inmanejables. Usted tomar la que se acomode a su forma
de trabajar y documente el cdigo.
Para separar las lneas de los mtodos se respeta que sea despus de una
coma o delante de un operador lgico, matemtico o relacional. Por
ejemplo:
// tabulacin convencional tabulacin con 4 espacios.




// Usar 8 espacios para evitar pegarse al margen derecho




La ruptura de lneas para las sentencias if debera usar la regla de los 8
espacios, ya que la tabulacin convencional (4 espacios) dificulta la lectura
del cuerpo de la sentencia if. Por ejemplo:
// NO UTILIZAR ESTA TABULACION
if ((condition1 && condition2)
|| (condition3 && condition4)
||!(condition5 && condition6)) { // MALAS RUPTURAS
mtodo(); // HACEN QUE ESTA LINEA SE PIERDA
FACILMENTE
}

// Usar esta tabulacin en su lugar
metodo(int i, Object ob, String s,
Object ob2) {
...
}

private static metodo(int anArg,
Object ob, String s,
Object ob2) {
...
}



Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 11

if ((condition1 && condition2)
|| (condition3 && condition4)
||!(condition5 && condition6)) {
metodo();
}

// o usar esta otra forma
if ((condition1 && condition2) || (condition3 && condition4)
||!(condition5 && condition6)) {
doSomethingAboutIt();
}
Sentencia switch
La sentencia switch permite ejecutar una de varias acciones, de acuerdo al
calor de una expresin, la cual es de tipo char, byte, short o int. Es una
sentencia para decisiones mltiples que elimina el if anidado.
Una sentencia switch debe tener el siguiente formato:
switch (condicin) {
case ABC:
sentencias;
/* continua con el siguiente */

case DEF:
sentencias;
break;

case XYZ:
sentencias;
break;

default:
sentencias;
break;


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 12

}
Cada vez que un caso contina con el siguiente (no incluye una sentencia
break), se aade un comentario donde ira la sentencia break, como se
muestra en el ejemplo anterior con el comentario /* continua con el
siguiente */.




Veamos sus estndares:
Sentencia for
Una sentencia for debera tener el siguiente formato:
for (inicializacin; condicin; actualizacin) {
sentencias;
}
Una sentencia for vaca debe tener el siguiente formato:
for (inicializacin; condicin; actualizacin);
Sentencia while
Una sentencia while debe tener el siguiente formato:
while (condicin) {
sentencias;
}
Una sentencia while vaca debe tener el siguiente formato:
while (condicin);
Sentencia do-while
Una sentencia do-while debe tener el siguiente formato:
do {
sentencias;
} while (condicin);
Todas las sentencias switch deberan incluir un caso por defecto. El
break en el caso por defecto es redundante, pero previene el error de
continuar con el siguiente si en otro momento se incluye otro caso.
Es importante que repase tambin las sentencias
repetitivas for, while y do while utilizndolos en la
programacin.



Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 13

1.3 Arreglos
Guardar tipos bsicos de datos

Un array es una estructura de datos del tipo estructurada simple que
permite almacenar un conjunto de objetos del mismo tipo, ya sea primitivos
y objetos. Se accede a cada elemento individual del array mediante un
nmero entero denominado ndice, siendo el ndice del primer elemento 0
(cero) y n-1 el del ltimo elemento, donde n es la dimensin del array
otorgada en el momento de la definicin.

Los arrays son objetos en Java, el correcto uso supone los siguientes pasos:

1. Declarar el array
o Tipo [] nombreDelArray; //Sintaxis
o int[] numeros; //declarar un array de enteros escribimos
o
2. Crear el array
o numeros=new int[4]; //crear un array de 4 nmero enteros
o int[] numeros =new int[4]; //La declaracin y la creacin del
array en una lnea
3. Inicializar los elementos del array
numeros[0]=278; //inicializar el array de 4 enteros
numeros[1]=-45;
numeros[2]=15;
numeros[3]=-125;

4. Usar el array


El uso de un array supone que puede declararlo, crearlo e inicializarlo en un
mismo rengln o en distintos lugares del programa, segn sea necesario,
por ejemplo, se pueden inicializar en un bucle for como resultado de
alguna operacin:









Si bien es una estructura esttica que conoce su longitud ya que est en su
creacin, no necesita recordar el nmero de elementos del array, su
miembro dato length proporciona la dimensin del mismo. Su sintaxis es:








for(int i=0; i<4; i++)
{
numeros[i] = i +7;
}

for(int i=0; i<numeros.length; i++)
{
numeros[i]=i +7;

}



Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 14

Los arrays se pueden declarar, crear e inicializar en una misma lnea, del
siguiente modo

int[] numeros={278, -45, 15, -125};
String[] nombres={"lunes", "mircoles", "viernes", "somingo"};

Cmo se muestran los elementos almacenados en un Array?

Se utiliza una estructura repetitiva for para recorrerlo y sacar cada
elemento:










Cmo se almacenan objetos en un Array?


Suponga que debe almacenar objetos Integer en un array, la sintaxis es:

Declarar
Integer [] num;
Crear el array
num=new Integer[2]; //longitud, para 2 objetos enteros
Inicializar los elementos del array
num[0]=new Integer(10); //se inicializa el objeto y almacena
num[1]=new Integer(30);

Usar el array

Para calcular la suma de los valores almacenados












Utilizando length Java verifica que el ndice no sea mayor o igual que la
dimensin del array, garantizando que no acceder a un lugar que
supere la longitud y se interrumpa la ejecucin del programa.
for(int i=0; i<vec.length; i++)
{
System.out.println(vec[i]);
}

for(int i=0; i<num.length; i++){
Int total = total + num[i];
System.out.println(total);
//para mostrarlos como short llamo al mtodo de la clase Integer
System.out.println(num[i]. shortValue());
}



Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 15

Los Array pueden ser bidimensionales o multidimensionales, pero no es el
objeto de estudio y aplicacin en este mdulo, por lo que no lo
desarrollaremos.
CLASE VECTOR

Es una implementacin heredada desde JDK 1.1. En JDK 1.2 fue adaptada
para que implementase List. De hecho deriva de AbstracList.
Su rbol dentro de Java est organizado de la siguiente forma:










Si bien no es ms rpida que las implementaciones ArrayList o
LinkedList, est sincronizada. Sus iterators tambin son rpidos.

La instancia de la clase Vector nos da una coleccin pseudodinmica, ya que
vara su longitud cuando se llena, por lo que no tiene desbordamiento.
Para usar la clase Vector debe importar el paquete java.util al principo del
archivo del cdigo fuente
import java.util.*;

Para instanciar la clase Vector puede utilizar distintos constructores:

Vector vector=new Vector();

Cuando se utiliza el constructor sin argumentos la capacidad inicial es diez,
cuando se llena aumenta de tamao duplicndose.
Vector vector = new Vector( capacidadInt)
El vector creado tiene la capacidad especificada, cuando se llena duplica su
tamao, por ejemplo:
Vector vector = new Vector(5);
java.util
Class Vector<E>
java.lang.Object
java.util.AbstractCollection<E>
java.util.AbstractList<E>
java.util.Vector<E>
All Implemented Interfaces:
Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>,
RandomAccess



Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 16

Inicialmente tiene una capacidad de 5, cuando se llena de elementos pasa a
tener una capacidad de 10.

Vector vector = new Vector( capacidadInt, incrementoInt )
El vector creado tiene la capacidad especificada. El segundo elemento es el
nmero en que la capacidad ser incrementada cuando el tamao sea
mayor que la capacidad. Por ejemplo:
Vector vector = new Vector(5, 3) //inicialmente tiene capacidad para 5
elementos, cuando se llena aumenta de a 3 lugares.
Los Mtodos de la clase son:


addElement(objeto) Agrega un nuevo elemento al vector
capacity() Muestra la capacidad del vector
clone() Copia un vector en otro
elementAt(int) Regresa un elemento particular
elements() Muestra el total de elementos
firstElement() Primer elemento
indexOf(objeto) Muestra el ndice de un elemento
insertElementAt(obj,int) Insertar objeto desde una posicin
lastElement() ltimo elemento
setElementAt(obj,int) Escribe un elemento en una posicin
size() Tamao del vector
toString() Conversin a cadena
Vector() Constructor normal
Vector(int) Constructor con tamao de vector
Vector(int, int) Constructor con incrementos
La menor dimensin es Vector(1,1), ya que de esta forma almacena un
elemento, se llena y agrega solo de a un lugar .


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 17

Veamos un ejemplo:

































Algunos mtodos importantes de la Clase Vector, que podrn serle de
utilidad en otros programas:

Para insertar un elemento en el vector del ejemplo anterior puede
utilizar el mtodo insertElementAt(elemento a insertar, lugar)
import java.lang.*;
import java.util.*;

class CVector {
public static void main(String Args[]) {
int j;
Vector v=new Vector(7,5);

for(j = 0; j < 14; j++) {
v.addElement(new Integer(j)); // ingresa elementos enteros, los valores de j
}

System.out.println("vector en el orden original: ");

for(j = 0; j < v.size(); j++) { // usa como tope de elementos v.size()
System.out.print(v.elementAt(j) + " "); // muestra los elementos del vector
}

System.out.println();
System.out.println("vector en reversa: ");

for(j = v.size() - 1; j >= 0; j--) {
System.out.print(v.elementAt(j)+" ");
}

System.out.println();
System.out.println("imprime el vector como cadena: ");
System.out.println(v.toString()); // convierte en string los elemento
System.out.println("cantidad de elementos: " + v.size());
System.out.println("capacidad del vector: " + v.capacity());
}
}

vector en el orden original :
0 1 2 3 4 5 6 7 8 9 10 11 12 13
vector en reversa :
13 12 11 10 9 8 7 6 5 4 3 2 1 0
imprime el vector como cadena :
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
cantidad de elementos: 14
capacidad del vector: 17


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 18


Por ejemplo:
v.insertElementAt(8, 2);

Para saber cuntos elementos guarda un vector, utilice el mtodo
size().

Para saber la dimensin actual de un vector se llama al mtodo
capacity()

Por ejemplo, en la porcin de cdigo hemos guardado 14 elementos en el
vector v. La dimensin de v es 17, ya que se ha superado la dimensin
inicial de 7 establecida en la llamada al constructor cuando se ha creado el
vector v, aunmentando 5 posiciones a 12 y nuevamente 5 posiciones ms.
System.out.println("cantidad de elementos " + v.size());
System.out.println("capacidad del vector: " + v.capacity());

Se puede eliminar todos los elementos de un vector, llamando al
mtodo removeAllElements.
Se puede eliminar un elemento concreto, llamando al mtodo
v.removeElement(elemento);
Se puede eliminar dicho elemento, si especificamos su ndice.
v.removeElementAt(2);

Acceso a los elementos de un vector

En vez de dar un ndice como en el Array, se utiliza el mtodo
elementAt(ndice). Por ejemplo, v.elementAt(4) sera equivalente a
v[4], si v fuese un array.

Para acceder a todos los elementos del vector, se puede utilizar una
estructura repetitiva, como en el ejemplo anterior.

for(int i=0; i<v.size(); i++) {
System.out.print(v.elementAt(i)+"\t");
}

Existe otra alternativa, que es la de usar las funciones del interface
Enumeration.



Enumeration permite acceder a los elementos de una estructura de datos
de forma secuencial, su cdigo es:

public interface Enumeration
{
boolean hasMoreElements();
Object nextElement();
}
Esta interface declara dos funciones pero no implementa ninguna de
ellas.


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 19

La funcin miembro elements de la clase Vector devuelve un objeto de la
clase VectorEnumerator que implementa el interface Enumeration
y tiene que definir las dos funciones hasMoreElements y nextElement.

Veamos un ejemplo simple:





















Cmo saber qu utilizar? Vectores o Array?

Los arreglos ofrecen tres ventajas sobre el Vector:
1. Pueden almacenar directamente tipos de datos primitivos.
2. Sus elementos pueden ser accedidos sin necesidad de mensajes,
por lo que el cdigo es ms rpido que si se usara un Vector
3. Como los arreglos son tipados, ofrecen una verificacin en
tiempo de compilacin que no la tiene el Vector. Si
almacenamos accidentalmente un objeto String en un Vector
donde tenemos almacenados objetos de Integer, Java lo
permite. Pero Java nos dara un error de compilacin si
tratamos de almacenar un String en un arreglo de referencias a
Integer.

Sin embargo, los arreglos tambin presentan algunas desventajas sobre el
Vector:
1. Son de tamao fijo y no crecern.
2. No nos ofrece un conjunto de operaciones ricas como la clase
Vector (a travs de mtodos como insertElementAt()).

Import java.util.*;
import java.util.Enumeration;

final class VectorEnumerator {

public static void main(String[] args) {
Vector<String> v = new Vector<String>();
v.add("A");
v.add("B");

Enumeration e = v.elements();
while (e.hasMoreElements()) {
System.out.println(e.nextElement());
}
}
}



Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 20

1.4 Objetos: constructores, paquetes y
herencia
Recordemos el Paradigma Orientado a Objetos y su aplicacin en la
Programacin Orientada a Objetos, para luego poder resolver situaciones
reales que implican integrar todos los conceptos en la resolucin codificada
en lenguaje Java. Estos temas estn tratados en los captulos 3 y 4 de la
bibliografa bsica de la materia.
Como ya saben un Objeto es el corazn de la POO. Un objeto es un tipo de
dato con estructura y estado, es una unidad atmica, principio conocido
como ocultamiento de la informacin.
El objeto est compuesto por atributos que le dan el estado y los mtodos
que representan su comportamiento.
El concepto de objeto con sus componentes son representados en una clase.
Una clase es una agrupacin de datos (variables o campos) y de funciones
(mtodos) que operan sobre esos datos. A estos datos y funciones
pertenecientes a una clase se les denomina variables y mtodos o funciones
miembro. La programacin orientada a objetos se basa en la programacin
de clases. Un programa se construye a partir de un conjunto de clases.
Una vez definida e implementada una clase, es posible declarar elementos
de esta clase de modo similar a como se declaran las variables del lenguaje
(de los tipos primitivos int, double, String, entre otros). Los elementos
declarados de una clase se denominan objetos de la clase. De una nica
clase se pueden declarar o crear numerosos objetos. La clase es lo genrico:
es el patrn o modelo para crear objetos. Cada objeto tiene sus propias
copias de las variables miembro, con sus propios valores, en general
distintos de los dems objetos de la clase.
Las clases pueden tener variables static, que son propias de la clase y no de
cada objeto.

Normalmente, las definiciones de clases incluyen:
Modificador de acceso: especifica la disponibilidad de la clase a
partir de otras clases.
Palabra clave de clase: class indica a Java que el bloque de cdigo
siguiente define una clase.
Campos de instancia: se denomina as a las variables y constantes
utilizadas por los objetos de la clase.
Constructores: son los mtodos que se invocan para instanciar la
clase, tienen el mismo nombre que la clase.
Mtodos de instancia: Definen las funciones que pueden actuar sobre
los datos de una clase.


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 21

Campos de clase: Contienen variables y constantes que pertenecen a
la clase y que todos los objetos de la clase comparten (static).
Mtodos de clase: Son los mtodos que se utilizan para controlar los
valores de los campos de la clase.


Veamos un ejemplo:





















Las clases de los niveles inferiores son por lo general las que poseen los
objetos que tendrn los atributos y mtodos de su clase ms los atributos y
mtodos que hereden.
En la programacin orientada a objetos, un objeto es una instancia de la
clase, donde todas las instancias tienen la misma estructura, la definida en
la clase a la que pertenece y de las que hereda, pero cada instancia tiene sus
propios valores en los campos de instancia.
Cmo se crean los objetos? Se crean con la instruccin new, pero necesita
un par de instrucciones, por ejemplo, si tenemos la clase Persona, el objeto
se crea:
Persona unoNuevo; //declara la referencia al objeto
unoNuevo = new Persona( ); //crea el espacio en memoria y
devuelve una instancia de la clase Persona.
La primera lnea crea una referencia a un objeto que se llama unoNuevo de
la clase Persona. La segunda lnea crea el objeto.
Tambin se puede definir en una sola lnea, quedando:


public class Persona {
//variable de clase
Static int contadorPersonas;
//variable de instancia
private int dni;
private String apellido;
..
//mtodo de instancia
Public int getDni(){
.
}
}



Modificador de acceso
Inicio y fin de
la clase
Inicio y fin del
mtodo


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 22

Persona unoNuevo = new Persona( );

El operador new convoca al mtodo constructor de la clase (veremos en
detalles ms adelante), quien construye un espacio en memoria para alojar
la estructura del objeto, o sea que la llamada al operador new devuelve una
referencia al objeto nuevo.
Recordemos los conceptos fundamentales de los Atributos
Los atributos son los datos especficos de una clase. Los que se definan en
las clases sern comunes a todos los objetos creados en ella, pero
independientes de sus valores.
Ya vimos dnde se definen y cmo, para asignarle un valor debemos
convocarlo con el objeto, en nuestro ejemplo sera:
unoNuevo.nom = Jos;

Si el atributo es declarado con el modificador private, (aplicando el
concepto de encapsulamiento) la asignacin directa podr realizarla dentro
de la misma clase. Fuera de la clase deber utilizar el mtodo de instancia
pblico setxx(). En nuestro caso sera:
unoNuevo.setNom(Jos);
Si el atributo es declarado pblico, la asignacin la podr realizar desde un
mtodo ubicado en otra clase y en otro paquete dentro del mismo proyecto.
Los tipos de valores que se definen para un atributo pueden ser:
Primitivos: los tipos de datos que viene con el lenguaje Java, como
int
Objetos: los definidos por el lenguaje como es String o Integer, o
bien definido por el usuario, por ejemplo: dentro de la clase Auto, el
atributo volante puede ser tipo Volante, el cual es un objeto con
estado y comportamiento por lo que tiene una Clase Volante para
instanciarla.
Las variables de objeto almacenan la referencia a un objeto, por lo que
hacen referencia a todos sus atributos y mtodos definidos en su clase.
Inicialmente la referencia de una variable objeto es null, hasta tanto se le
asigne la referencia del objeto creado.
En nuestro ejemplo, en una clase Test con un mtodo main() podra tener el
siguiente cdigo:


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 23

















Concepto de Package

Java como lenguaje est organizado en paquetes.
Un package es una agrupacin de clases. Existen una serie de packages
incluidos en el lenguaje (ver jerarqua de clases que aparece en el API -
Application Programming Interface- de Java).
Adems el usuario puede crear sus propios packages. Lo habitual es juntar
en packages las clases que estn relacionadas. Todas las clases que formen
parte de un package deben estar en el mismo directorio.

Veamos los paquetes principales de Java:
Paquete Contenido
java.applet Clases para implementar appletscorrespondientes
a aplicaciones que corren dentro de los
browsers.
Persona unoNuevo; //referencia null
unoNuevo = new Persona( ); //referencia al espacio en memoria
unoNuevo.setNom(Jos); //asigna un valor
System.out.print(Nombre: + unoNuevo.getNom()) //muestra el valor
unoNuevo = null //pierde la referencia anterior
System.out.print(Nombre: + unoNuevo.getNom()) //error en tiempo de ejecucin
porque no tiene ninguna referencia de memoria.
Si creamos otra instancia de Persona, se pueden asignar las referencias mutuamente, por
ejemplo:
Persona otroNuevo; //referencia null
otroNuevo = new Persona( ); //referencia al espacio en memoria
otroNuevo.setNom(Ana); //asigna un valor
System.out.print(Nombre: + otroNuevo.getNom()) //muestra el valor Ana
unoNuevo = otroNuevo //pierde la referencia anterior
System.out.print(Nombre: + unoNuevo.getNom()) //muestra Ana



Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 24


La jerarqua de clases de Java (API)
Durante la generacin de cdigo en Java, es recomendable y casi
necesario tener siempre a la vista la documentacin on-line del API de Java
de la versin que est utilizando. En dicha documentacin es posible ver
tanto la jerarqua de clases, es decir la relacin de herencia entre clases,
como la informacin de los distintos packages que componen las libreras
base de Java.
Es importante distinguir entre lo que significa herencia y package. Un
package es una agrupacin arbitraria de clases, una forma de organizar las
clases. La herencia sin embargo consiste en crear nuevas clases en base a
otras ya existentes. Las clases incluidas en un package no derivan por lo
general de una nica clase.

En la actualidad se cuenta con el API JavaTM 2 Platform
Standard Ed. de Java, mejor conocido como Java2, el cual incluye adems
java.awt Clases para grficas, componentes (GUI
Graphic User Interface) y administradores de
control de ventanas, adems de clases ms
especializadas como para procesamiento de
imgenes (AWT Advanced Window Toolkit).
java.beans Clases e interfaces para construir
JavaBeanscorrespondientes a GUIs
independientes de plataformas.

java.io Clases para control de entradas y salidas, tales
como archivos y streams.
java.lang Clases que componen el ncleo del lenguaje.
java.math Clases para aritmtica avanzada, incluyendo
manejo de precisin numrica arbitraria.
java.net Clases relacionadas con el manejo de redes, tales
como datagramas y sockets.
java.rmi Clases para el manejo de mtodos remotos.
java.security Clases para aspectos de seguridad, tales como
criptografa.
java.sql Clases para acceso a base de datos con el lenguaje
SQL.
java.text Clases para internacionalizacin del idioma,
independiente del lenguaje particular.
java.util Clases adicionales, tales como estructuras de
datos avanzadas y compresin de datos.


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 25

del paquete java, el paquete javax donde se encuentran componentes
ms avanzados, como se muestra en la siguiente Tabla.


Cmo organizamos nuestro proyecto en package?
Supongamos que necesitamos realizar una encuesta a 10 Personas, en
principio necesitamos una clase Persona y otra que tenga el main().
Como hay que ingresar datos ser necesario validarlos. Estos mtodos no es
conveniente que se ubiquen dentro del main() ni en la clase Persona, ya que
no son comportamiento de ella, por lo que necesitamos una o dos clases
para leer y validar. Estas clases se ubican en un Package independiente para
que sean libreras a ser utilizadas en otros proyectos.
Necesitamos un Men que presente los datos a ingresar y los resultados de
la encuesta, esto es parte de la Vista, o sea de la interfaz con el usuario.

Paquete Contenido
javax.accessibility Clases que definen contratos entre componentes
de interfaces de usuario y
una tecnologa asistente que provee acceso a
esos componentes.
javax.activation Clases que definen activacin de los
componentes de JavaBeans.
javax.ejb Clases para el manejo de EJB(Enterprise
JavaBeans).
javax.jms Clases para el manejo de JMS(Java Message
Server).
javax.mail Clases para el manejo de correo.
javax.naming Clases para el acceso de los servicios de
nombres.
javax.rmi Clases para la invocacin de mtodos remotos
incluyendo CORBA.
javax.servlet Clases para el manejo de servletsy JSP(Java
Server Pages).
javax.sql Clases para el acceso a base de datos con SQL.
javax.swing Clases que proveen un conjunto de componentes
para GUIs que trabajan en
cualquier plataforma.
javax.transaction Clases para el manejo de transacciones entre
componentes.


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 26


Nos quedara:










La ventaja que tendr este proyecto, aparte de la organizacin y el reuso, es
la posibilidad de encontrar errores ms rpido y crecer en clases de cada
paquete.
Herencia
Como hemos visto anteriormente, la herencia permite que se pueden definir
nuevas clases basadas en clases existentes, lo cual facilita re-utilizar cdigo
previamente desarrollado. Si una clase deriva de otra (extends) hereda
todas sus variables y mtodos. La clase derivada puede aadir nuevas
variables y mtodos y/o redefinir las variables y mtodos heredados.
En Java, a diferencia de otros lenguajes orientados a objetos, una clase slo
puede derivar de una nica clase, con lo cual no es posible realizar herencia
mltiple en base a clases. Sin embargo es posible simular la herencia
mltiple en base a las interfaces.
Qu se hereda? Se heredan atributos y mtodos de la superclase, de una
sola ya que tiene herencia simple. Para que esto se d, usted debe crear una
nueva clase que sea una extensin de la superclase.







Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 27








En nuestro ejemplo, las clases Persona y Empleado son abstractas, mientras
que las clases Administrativo, Vendedor y Cliente son hojas o concretas, las
que se instancian y cada objeto hereda los atributos y mtodos de las
superclases que tiene en su jerarqua.

La definicin de cada clase es:
public abstract class Persona {
..
}

public abstract class Empleado extends Persona {

}

public class Cliente extends Persona {
.
}

public class Administrativo extends Persona {

}

public class Vendedor extends Persona {
..
}



Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 28

Mtodos constructores

Conocemos el new para la creacin de un objeto, el cual involucra la
invocacin de un mtodo constructor de la clase de la cual el objeto es
representante.
Pero, an no hemos definido mtodos constructores, sin embargo, podemos
definir constructores del mismo modo que cualquier otro tipo de mtodos,
con las siguientes salvedades:







Por ejemplo: la clase java.lang.Double, tiene estos dos constructores.
public Double (double valor);
public Double (String s) throws NumberFormaException;
La utilizacin real sera:
Double unDoble = new Double (3.5);
Double unDoble = new Double (3.534);
Toda clase tiene un mtodo constructor por defecto, no explcito, que se
convoca con el operador new, sus variables de instancia se inicializan con
sus valores por defectos.
No obstante, normalmente se necesita ms de un constructor en una clase,
por lo que hay que hacer explcitos todos. Estos constructores tendrn
caractersticas en comn y se diferenciarn en los atributos que reciba.
Por ejemplo:
Persona unoNuevo = new Persona() //invoca al constructor por defecto
Persona otroNuevo = new Persona(Jos) //invoca al constructor que
recibe un parmetro.
El constructor en la clase persona tiene el siguiente cdigo:




Debe omitirse la inicializacin sobre el tipo de dato devuelto,
pues implcitamente se sabe que el resultado es un objeto
representante de la clase.

public class Persona {
.
public Persona() { //constructor por defecto
}

public Persona(String nom) {//constructor con paso de parmetro
Nombre = nom;
}
}



Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 29


El constructor this
Si aparece en un cdigo la siguiente lnea:
this.nombre = nombre;
Es posible pensar que this es un objeto, en realidad lo es, pero uno muy
especial: es una referencia al objeto que se acaba de crear con new y cuyo
constructor se est ejecutando.
Este objeto est disponible en cualquier mtodo de cualquier clase (salvo
en los mtodos estticos, ya que no estn asociados a ningn objeto
concreto, sino a la clase en su conjunto).
Por ejemplo:









o bien,










//Constructores
public EntradaAgenda ( String nombre) {
this.nombre = nombre;
}
public EntradaAgenda ( String nombre, String apellido) {
this.nombre = nombre;
this.apellido = apellido;
}

public EntradaAgenda ( String nombre) {
this.nombre = nombre;
}
public EntradaAgenda ( String nombre, String apellido) {
this(nombre);
this.apellido = apellido;
}



Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 30

Como vemos aparece en el segundo ejemplo this( ) como mtodo, esto
permite invocar el primer constructor desde el segundo, asegurndonos la
sincronizacin entre los dos. El uso del this ( ) se permite cuando es la
primera instruccin de un constructor.
El constructor super ( )

Sirve para acceder desde un constructor al constructor de la superclase. Al
igual que this ( ), super ( ) debe ser la primera invocacin que aparezca
en el constructor.
En nuestro ejemplo de Persona y Cliente, sus constructores se pueden
plantear de la siguiente forma:













super (); //invoca al constructor por defecto de la
superclase
}
El segundo constructor es Sobrecargado, esto sucede porque tiene
distinta firma pero la misma funcionalidad. En una clase puede haber
varios constructores.
public class Persona {
.
public Persona() { //constructor por defecto
}
public Persona(String nom) {//constructor con paso de parmetro
Nombre = nom;
}
}

public class Cliente extend Persona {
int idCli;
public Cliente (){
public Cliente (String nom, int id){
super (nom); //invoca al constructor con paso de un
parmetro String de la super clase
this.idCli = id; //asigna a la instancia de clase el parmetro
recibido utilizando la referencia this
}



Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 31

Concepto de Interface
Java como lenguaje presenta en cada paquete, las Classes, Interfaces y
Exceptions, por lo que es muy importante acostumbrarse a utilizarlas.
Una interface debe ser considerado como un contrato entre un proveedor
de servicios y sus clientes.
En Java, la Interfaz es un tipo.
Es una clase abstracta que no puede ser instanciada que debe ser
implementada en otra clase.
Es un conjunto de declaraciones de mtodos.
Si una clase implementa (implements) una interface, debe definir todos los
mtodos especificadas por la interface, si alguno de los mtodos no tiene
cdigo aun se colocan las llaves de apertura y cierre definindolo vaco.
Una clase puede implementar ms de una interface, representando una
forma alternativa de la herencia mltiple.
A su vez, una interface puede derivar de otra o incluso de varias interfaces,
en cuyo caso incorpora todos los mtodos de las interfaces de las que
deriva.
Definicin de la interfaz en forma general:

modificador interfaz nombreI {
modificador tipoDevuelve nombreDelMetodo(parametros);
}
Veamos un ejemplo con la clase Persona y la interfaz IActividad:









public interfaz IActividad{ //definicin de la interfaz
public void caminar(); //definicin del mtodo abstracto
public String comenta(); //definicin del mtodo abstracto
public int calcula(int a, int b); //definicin del mtodo abstracto
}



Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 32












Grficamente:











La implementacin de la interfaz por parte de la clase Persona se puede
establecer con una lnea de puntos sin flecha, depende del modelador que
est utilizando.
La Interfaz define los mtodos abstractos, o sea da su firma pero no su
cdigo. La clase que la implementa define el mtodo con la misma
firma estableciendo cmo lo aplica.

public class Persona implement IActividad {
.. //definiciones de atributos y mtodos
public void caminar() { //definicin del mtodo concreto

}

public String comenta() { //definicin del mtodo abstracto

}

public int calcula(int a, int b) { //definicin del mtodo abstracto
.
}
}



Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 33

1.5 Manejo de excepciones
Las Excepciones son el mecanismo que utiliza la Java Virtual Machine
para el manejo de errores leves que pueden llegar a producirse durante
la ejecucin de una aplicacin y detener la ejecucin del mismo.
Las excepciones se crean en el momento en que se produce una
situacin anormal o excepcional en tiempo de ejecucin, como por
ejemplo, utilizacin de una referencia con valor null, intento de
apertura de un archivo que no existe, entre otras.
Para hacer ms organizado e informativo el manejo de errores, la
especificacin Java provee un conjunto de excepciones que es lanzado
de acuerdo al tipo de error. Por ejemplo, el uso de referencias nulas
utiliza NullPointerException; las operaciones de I/O utilizan
IOException, as sucesivamente.










Tambin es posible la definicin de nuevas excepciones, las cuales
deben heredar de Excpetion o de alguna de sus subclases.
El lenguaje Java provee de la sintaxis necesaria para el control de
excepciones dentro de un programa. Los operadores son
try: observa el comportamiento de un determinado bloque de cdigo
que es susceptible de arrojar excepciones
catch: en caso de que el bloque observado por try arroje una
excepcin, catch captura el error permitiendo algn tipo de
procesamiento del mismo, y poder tomar de esta forma un curso
correctivo
finally: bloque de sentencias que se ejecutan siempre que exista el
bloque try, aunque este no arroje excepcin. Generalmente se lo utiliza
para liberar recursos, como conexiones de bases de datos o cierre de
archivos abiertos.
throw: fuerza el lanzamiento de una excepcin.
Error
NullPointerException
IndexOutOfBoundsException
NegativeArraySizeException
...
RuntimeException
EOFException
FileNotFoundException
MalformedURLException
...
IOException AWTException ...
Exception
Throwable



Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 34

throws: informa que determinado mtodo puede arrojar algn tipo de
excepcin
Veamos el siguiente ejemplo:
Se crea una nueva Excepcin





Se crea la clase Persona























public class PersonaException extends Exception{
public PersonaException(String msg){
super(msg);
}
}

public class Persona{
private Integer id;

public Persona(){
}

publicvoid setId(Integer id){
this.id=id;
}
//se marca el cdigo que puede lanzar una excepcin
public Integer getId() throws PersonaException{
if(this.id==null){
thrownew PersonaException("ID nulo");
}
returnthis.id;
}
}




Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 35

Se crea la clase Test y marca el bloque de cdigo
con try y catch()





















La clase PersonaException es un tipo de excepcin personalizado
que creamos para manejar los posibles errores que se producen en
torno a la clase persona
En la clase Persona, el mtodo getId() arroja PersonaException en
caso de que el id sea nulo. Vemos como al final de la declaracin se
utiliza throws para informar que el mtodo puede arrojar excepcin.
Tambin vemos que si la evaluacin del if es verdadera, se fuerza el
retorno de PersonaException mediante throw.
En la clase Test, el cdigo susceptible de excepciones se evala dentro
del bloque try. En caso de producirse la excepcin, se ejecuta el bloque
catch. En todos los casos, se va a ejecutar el bloque de cdigo de finally.
Para probar el programa, desde lnea de comandos, ejecutamos los
siguientes pasos:
ingresar a la carpeta donde se encuentran los archivos .java
compilar con javac Persona.java PersonaException.java Test.java
Para probar con excepcin, ejecutar con java Test
public class Test{

public static void main(String [] args){
try{
Persona p=new Persona();
if(args.length > 0 &&args[0] != null && args[0] != ""){
p.setId(Integer.valueOf(args[0]));
}
System.out.println("ID de la persona: " + p.getId());
}
catch(Exception e){
System.out.println(e.getMessage());
}
finally{
System.out.println("Cerrando programa");
}
System.exit(0);
}
}



Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 36

Para probar sin excepcin, agregar un parmetro del tipo int a la lnea
anterior: java Test 1
1.6 Entrada /Salida bsica
El paquete java.io contiene todas las clases necesarias para la lectura y
escritura de datos en archivos y conexiones a sistemas que necesitan
transmitir flujos de datos. En el paquete se encuentran distintas
implementaciones, que se caracterizan por el origen y forma de los
datos.
Los trminos "entrada" y "salida" a veces pueden ser un poco
confusos. La entrada de datos para una aplicacin es a menudo la
salida de otra parte de la misma aplicacin, o proviene de otra
aplicacin.
Bsicamente, el paquete IO define 2 tipos principales: los streams de
entrada o salida (InputStream y OutputStream) y los Reader y Writer.
Los streams se encargan de manejar datos en forma de bytes, mientras
que los Readers y Writers lo hacen en forma de caracteres.
Estos 2 grandes grupos, engloban una serie muy compleja de clases
que permiten utilizar y transformar los datos entre ellos, dentro de un
programa.
Entre los objetivos que cumplen todas las clases del paquete, podemos
nombrar:
Acceso a redes de datos
Comunicacin asncrona entre hilos (pipes)
Acceso a archivos en disco
Acceso a datos en memoria
Parseo de datos
Serializacin / deserializacin de objetos
Acceso a buffers de memoria
Lectura y escritura de datos en la consola
A modo de organizacin, se presenta la siguiente tabla, en donde se
separan los 2 grupos y se los asocia con las distintas clases que los
implementan.
Streams Caracteres
Entrada Salida Entrada Salida
Base InputStream OutputStream
Reader
InputStreamReader
Writer
OutputStreamWriter
Arrays ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter
Pipes PipedInputStream PipedOutputStream PipedReader PipedWriter
Buffers BufferedinputStream BufferedOutputStream BufferedReader BufferedWriter
Cadenas -- -- StringReader StringWriter
Archivos
FileInputStream
RandomAccesFile
FileOutputStream
RandomAccesFile
FileReader FileWriter
Datos DataInputStream DataOutputStream -- --


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 37

Datos con
formato
-- PrintStream -- PrintWriter
Objetos ObjectInputStream ObjectOutputStream -- --

A continuacin, desarrollaremos paso a paso las clases utilizadas con
mayor frecuencia en los desarrollos actuales.
Lectura y escritura de datos en consola.
La lectura de datos de consola permite que los usuarios ingresen datos
mediante la interfaces de comandos del sistema operativo subyacente.
As mismo, la escritura de datos en consola permite la visualizacin de
datos o mensajes que arroja la ejecucin de nuestra aplicacin.
Para esto, la clase System tiene un InputStream en el atributo esttico
in generalmente conectado al teclado, y define adems 2 atributos
estticos del tipo PrintStream denominados out y err. El primero es la
salida estndar del sistema, generalmente conectado a la pantalla, y el
segundo es especfico de los mensajes de errores, tambin por default
dirigidos a la pantalla.
Ejemplo:


















import java.io.*;
public class Test{
public static void main(String[] arg) {
InputStream entrada1 = System.in;
InputStreamReader entrada2 = new InputStreamReader(entrada1);
BufferedReader entrada = new BufferedReader(entrada2);
PrintStream salida = System.out;
PrintStream salidaError = System.err;

salida.println("Programa de prueba de entrada salida por consola ");
salida.println("Ingrese una frase y presione Enter");
try {
String cadena = entrada.readLine(); //#7
salida.println(La cadena ingresada es + cadena); //#8
} catch (IOException e) {
salidaError.println(e.toString()); //#9
}
}
}




Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 38

En el ejemplo podemos observar que se crean instancias de
InputStream, InputStreamReader y de BufferedReader. Cada una de
ellas pasa como parmetro a la anterior en la llamada a su constructor.
Esto se debe a que System.in es un InputStream que lee datos segn
estos vayan ingresando. El inputStreamReader transforma los
caracteres ingresados en una cadena, mientras el BufferedReader los
acumula hasta que el usuario presiona la tecla Enter luego de haber
ingresado la cadena.
Luego observamos que los mensajes son mostrados en pantalla
mediante el mtodo println() del PrintStream salida. En caso de que se
produzca un error durante la ejecucin del programa, los mensajes se
imprimen en el PrintStream salidaError.
A partir de la versin 6 del JDK, se encuentra la clase Console en el
paquete java.io. La misma permite leer y escribir en la lnea de
comandos de forma muy similar al ejemplo anterior.
Ejemplo:














Observamos que el objeto Console se obtiene llamando al mtodo
esttico console() de la clase System. Luego leemos los caracteres
ingresados mediante el mtodo readLine().
Para la impresin de mensajes por pantalla, llamamos al mtodo
writer() que nos retorna una instancia del PrintWriter asociado a la
pantalla.
Luego imprimimos la salida mediante el mtodo println(), tal cual lo
hacamos en el ejemplo anterior.
import java.io.*;
public class Test{
public static void main(String[] arg) {
Console consola=System.console();
consola.writer().println("Programa de prueba de entrada salida por consola");
consola.writer().println("Ingrese una frase y presione Enter");
try {
String cadena = consola.readLine();
consola.writer().println(La cadena ingresada es + cadena);
} catch (IOException e) {
consola.writer().println(e.toString()); //#9
}
}
}




Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 39

Lectura y escritura de archivos en disco
La lectura y escritura de archivos es muy comn en aplicaciones de
escritorio. Tambin se utiliza en APIs como Log4j, que sirve para
escribir en distintos dispositivos de salida los estados por los que pasa
la ejecucin de un programa, tambin conocido como loging. Una de
las formas de escribir estos estados es agregarlos a un archivo de log.
Dicho archivo se escribe mediante las clases de java.io.
Ahora veremos un ejemplo de lectura sobre un archivo de texto:
























import java.io.*;

public class TestReadFile {
public static void main (String args[]) {
//Crea un FileInputStream para leer el archivo
FileInputStream lector;
try{
// Abre el archivo
lector = new FileInputStream ("archivo.txt");

// Lee una linea del archivo
System.out.println( new BufferedReader(new InputStreamReader(
lector )).readLine() );
// Cierra el lector
lector.close();
}
// Agarra cualquier excepcion que se puede producer al leer el
archivo
catch (IOException e) {
System.err.println ("No se ha podido leer el archivo");
System.exit(-1);
}
}
}




Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 40

Para el ejemplo anterior, necesitamos que el archivo de texto est
situado en la misma carpeta que la clase TestReadFile para que
funcione, de lo contrario lanzar una excepcin de
FileNotFoundException.
Luego de utilizar las funciones de los objetos del paquete IO, es
recomendable que los recursos sean liberados. Caso contrario, se
pueden producir errores inesperados. Para lograr esto, se llama al
mtodo close().
Estndares y codificacin para una buena prctica de
codificacin en Java
Las convenciones de cdigo son importantes no solo para los
programadores, sino para todos los integrantes del equipo de trabajo, por
numerosas razones:
Las convenciones de cdigo aumentan la legibilidad de los programas,
permitiendo al equipo de desarrolladores comprender nuevo cdigo rpida
y perfectamente.
Si el cdigo fuente se distribuye como un producto, es necesario asegurar
que est tan bien empaquetado y limpio como cualquier otro producto que
se crea.
Nombre del archivo
1- Sufijos de archivo
Java utiliza los siguientes sufijos de archivo:







2- Nombres de archivos comunes







Tipo de archivo Sufijo
Cdigo fuente Java .java
Cdigo compilado Java .class

Nombre de
archivo
Uso
LEEME
Nombre preferido para el archivo que resume
el contenido de un directorio en particular.



Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 41

Organizacin de archivos
Un archivo consiste en secciones que deberan estar separadas por lneas en
blanco y un comentario opcional identificando cada seccin.
Los archivos de ms de 2000 lneas son demasiado largos y deberan
evitarse.

Ficheros de cdigo fuente Java
Cada archivo de cdigo fuente Java contiene una nica clase o interfaz
pblico. Cuando una clase pblica tiene clases privadas e interfaces
asociados, se pueden poner en el mismo archivo de cdigo fuente que la
clase pblica. La clase pblica debera ser la primera clase o interfaz en el
archivo.
Los archivos de cdigo fuente Java tienen la siguiente ordenacin:
Comentarios iniciales
Sentencias package e import
Declaraciones de clase e interfaz

Comentarios iniciales:
Todos los archivos de cdigo fuente deberan comenzar con un comentario
que muestre el nombre de la clase, informacin sobre la versin, la fecha y
el copyright.
/*
* Nombre de la clase
*
* Informacin sobre la versin
*
* Fecha
*
* Copyright
*/

Sentencias package e import
La primera lnea que no sea un comentario es una sentencia package.
Despus, puede haber sentencias import. Por ejemplo:



Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 42

package edu.modelo;
import java.util.List;

El primer componente de un nombre de paquete nico se escribe en letras
ASCII minsculas y es uno de los nombres de dominio de nivel superior
(actualmente com, edu, gov, mil, net, org o uno de los cdigos de pas de
dos letras, como se especifica en el estndar ISO 3166).
Declaraciones de clase e interfaz
En el cuerpo de la clase es necesario colocar comentarios, en las
declaraciones de las variables o antes de un mtodo. Este comentario debe
contener aclaraciones sobre la implementacin del cdigo de la clase o de la
interfaz.
Variables de clase (estticas). El orden correcto de aparicin de las
variables es: primero las variables pblicas (public), luego las protegidas
(protected), despus las de paquete (sin modificador de acceso) y por
ltimo las privadas (private).

Variables de instancia. Primero las variables pblicas (public), luego las
protegidas (protected), despus las de paquete (sin modificador de acceso)
y por ltimo las privadas (private).
Mtodos. Los mtodos deberan estar agrupados por funcionalidad en lugar
de por mbito o accesibilidad. Por ejemplo, un mtodo esttico privado
puede estar entre dos mtodos de instancia pblicos.
El objetivo es hacer la lectura y comprensin del cdigo ms fcil.

Declaraciones
Nmero por lnea
Se recomienda una declaracin por lnea
int level; // nivel de tabulacin
int size; // tamao de la tabla es preferible antes que
int level, size;
No poner tipos diferentes en la misma lnea. Por ejemplo:
int foo, fooarray[]; // MAL!
Ejemplo:
int level; // nivel de tabulacin


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 43

int size; // tamao de la tabla
Object currentEntry; // elemento de la tabla seleccionado

Inicializacin
Intente inicializar las variables locales donde se declaren. Si el valor inicial
depende de algn clculo que debe ocurrir primero, es la nica razn para
no inicializar una variable donde se declara.
Colocacin
Coloque las declaraciones slo al principio de los bloques. (Se entiende por
bloque cualquier cdigo rodeado por llaves "{" y "}".)
void metodo() {
int int1 = 0; // principio del bloque de mtodo
if (condicin) {
int int2 = 0; // principio del bloque de "if"
...
}
}
Excepcin a esta regla: se da con el ndice de los bucles for, que en Java se
puede declarar dentro de la sentencia for:
for (int i = 0; i < tope; i++) { ... }
Evite declaraciones locales que oculten declaraciones de ms alto nivel. Por
ejemplo, no declare el mismo nombre de variable en un bloque interno:
int count;
...
metodo() {
if (condicin) {
int count = 0; // EVITAR
...
}
...
}

Importante: Los ejemplos anteriores usan un espacio entre el tipo y el
identificador. Otra alternativa aceptable es usar tabuladores


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 44

Declaraciones de clase e interfaz
Mientras se codifican clases e interfaces Java, se deben seguir las siguientes
reglas de formato:
Ningn espacio entre el nombre del mtodo y el parntesis "(" que abre su
lista de parmetros.
La llave de apertura "{" aparece al final de la misma lnea que la sentencia
de declaracin.
La llave de cierre "}" comienza una lnea nueva tabulada para coincidir con
su sentencia de apertura correspondiente, excepto cuando es un bloque
vaco que se presentan juntas {}
Los mtodos estn separados por una lnea en blanco.

Veamos un ejemplo correcto:

class Ejemplo extends Object {
int ivar1;
int ivar2;

Ejemplo(int i, int j) {
ivar1 = i;
ivar2 = j;
}

int emptyMethod() {}

...
}

Sentencias
Sentencias simples
Cada lnea debe contener una sentencia como mucho. Por ejemplo:
argv++; // Correcto
argc--; // Correcto


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 45

argv++; argc--; // EVITAR!

Sentencias compuestas
Las sentencias compuestas son sentencias que contienen una lista de
sentencias encerradas entre llaves "{" y "}".
Las sentencias internas deben estar tabuladas un nivel ms que la sentencia
compuesta.
La llave de apertura debe estar al final de la lnea que comienza la sentencia
compuesta; la llave de cierre debe estar en una nueva lnea y estar tabulada
al nivel del principio de la sentencia compuesta.
Las llaves se usan en todas las sentencias compuestas, incluidas las
sentencias nicas, cuando forman parte de una estructura de control. .
Sentencia return
Una sentencia return con una estructura de datos no debera usar
parntesis a menos que destaque el valor devuelto por alguna razn
aceptable. Por ejemplo:
return;

return metodo();

return (size > 0 ? size : defaultSize);
Sentencia try-catch
Una sentencia try-catch debe tener el siguiente formato:
try {
sentencias;
} catch (ExceptionClass e) {
sentencias;
}
Una sentencia try-catch puede venir seguida de una sentencia finally, la
cual se ejecuta siempre independientemente de que el bloque try se haya
completado correctamente o no.
try {
sentencias;
} catch (ExceptionClass e) {
sentencias;


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 46

} finally {
sentencias;
}
Espacios en blanco
Lneas en blanco
Las lneas en blanco para separar son necesarias porque mejoran la
legibilidad resaltando secciones de cdigo que estn relacionadas
lgicamente.
En los siguientes casos, siempre se deben usar dos lneas en blanco:
Entre secciones de un archivo fuente.
Entre definiciones de clases e interfaces.
En los siguientes casos, siempre se debe usar una lnea en blanco:
Entre mtodos.
Entre las variables locales de un mtodo y su primera sentencia.
Antes de un comentario de bloque o de una sola lnea.
Entre las secciones lgicas de un mtodo, para mejorar la legibilidad.
Espacios en blanco
Los espacios en blanco deben usarse en los siguientes casos:
Una palabra clave seguida por un parntesis debe estar separado por un
espacio. Por ejemplo:
while (true) {
...
}
En las listas de argumentos, debe haber un espacio despus de cada coma.
Todos los operadores binarios, excepto el operador punto (.) deben estar
separados de sus operandos por espacios. Los operadores unarios
(incremento ++, decremento --, negativo -) nunca deben estar separados de
sus operandos. Por ejemplo:
a += c + d;
a = (a + b) / (c * d);

while (d++ = s++) {
n++;
}


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 47

print("el resultado es " + n + "\n");
Las expresiones de una sentencia for deben estar separadas por espacios en
blanco. Por ejemplo:
for (expr1; expr2; expr3)
Las conversiones de tipo (cast) deben estar seguidas de un espacio en
blanco. Por ejemplo:
metodo((byte) aNum, (Object) x);
metodo((int) (cp + 5), ((int) (i + 3))
+ 1);

Convenciones de nombrado
Las convenciones de nombrado hacen los programas ms fciles de leer.
Tambin pueden dar informacin acerca de la funcin del identificador (por
ejemplo, si se trata de una constante, un paquete o una clase), puede ayudar
a entender el cdigo.
Tipo de
identificador
Reglas de nombrado Ejemplos
Paquetes
El prefijo de un nombre de
paquete nico se escribe
siempre en letras ASCII
minsculas y debera ser uno de
los nombres de dominio de nivel
superior (actualmente com, edu,
gov, mil, net, org o uno de los
cdigos de pas de dos letras,
como se especifica en el
estndar ISO 3166 [6]).

com.sun.modelo

com.apple.quicktime.v2

edu.ue.cs.estilos

es.nom.aperez
Clases
Los nombres de clases deben ser
sustantivos, escritos en
CamelCase
(Mayscula/minscula/Maysc
ula o viceversa). Trate que los
nombres de clases sean simples
y descriptivos. Use palabras
completas, evite acrnimos y
abreviaturas (a menos que la
abreviatura sea mucho ms
usada que la forma larga, como
URL o HTML).
class Raster

class ImageSprite


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 48

Tipo de
identificador
Reglas de nombrado Ejemplos
Interfaces
Los nombres de interfaz deben
ser escritos como los nombres
de clases.
interface
RasterDelegate
interface Storing
Mtodos
Los nombres de mtodos deben
ser verbos, escritos en
CamelCase con la primera letra
en minscula.
run();
runFast();
getBackground();
Variables
Todos los nombres de variable
deben estar escritos en
CamelCase con la primera letra
en minscula. No deben
comenzar con un caracter de
subrayado (_) o un signo de
dlar ($), aunque ambos estn
permitidos.
Los nombres de variables deben
ser cortos y significativos. El
nombre de variable debe ser
mnemotcnica, esto es, pensada
para indicar la intencin de su
uso a un posible observador
ocasional. Se debern evitar los
nombres de variables de un solo
caracter excepto para variables
temporales "desechables".
Algunos nombres comunes para
variables temporales son i, j, k,
m y n para nmeros enteros; c,
d y e para caracteres.
int i;
char c;
float myWidth;
String streetName;
Constantes
Los nombres de variables
declaradas como constantes de
clase deben estar escritos todo
en maysculas separando las
palabras con un caracter de
subrayado (_).
static final int
MIN_WIDTH = 4;
static final int
MAX_WIDTH = 999;
static final String
DEFAULT_PROTOCO
L = "http";





Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 49

Prcticas de programacin
Proporcionar acceso a variables de clase e instancia
No debe ser pblica ninguna variable de clase o instancia, a no ser que sea
necesario y justificable. Por lo general, las variables de instancia no
necesitan ser accedidas o modificadas explcitamente.
Referenciar variables y mtodos de clase
Evite usar una instancia de un objeto para acceder a un mtodo o variable
de clase (esttica). Use el nombre de la clase en su lugar. Por ejemplo:
classMethod(); // OK
AClass.classMethod(); // OK
anObject.classMethod(); // EVITAR!

Constantes
Las constantes numricas no deben codificarse directamente, excepto -1, 0
y 1, que pueden aparecer en un bucle for como contadores. Por ejemplo:
static final int MAX_SIZE = 25;

for (i = 0; i < MAX_SIZE; i++)

Asignaciones de variables
Evite asignar a varias variables el mismo valor en una sola sentencia, es
difcil de leer. Por ejemplo:
str = str2 = 'c'; // EVITAR!
No use el operador de asignacin (=) en un lugar donde se pueda confundir
fcilmente con el operador de igualdad (==). Ejemplo:
if (c++ = d++) { // EVITAR! (Java lo rechaza)
...
}
debe ser escrito as:
if ((c++ = d++) != 0) {
...
}
No use asignaciones incrustadas en un intento de mejorar el rendimiento
en tiempo de ejecucin, esto es trabajo del compilador. Ejemplo:


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 50

d = (a = b + c) + r; // EVITAR!
debe ser escrito de la siguiente manera:
a = b + c;
d = a + r;

Prcticas varias
Parntesis
Generalmente, es una buena idea usar parntesis en expresiones que tienen
operadores para evitar problemas de precedencia de operadores. Incluso si
la precedencia de operador parece clara, puede no serlo para otros.
if (a == b && c == d) // EVITAR!
if ((a == b) && (c == d)) // BIEN

Devolver valores
Trate de hacer que la estructura del programa coincida con su propsito.
Ejemplo:
if (expresinBoolean) {
return true;
} else {
return false;
}
debe ser escrito as:
return expresinBoolean;
Igualmente,
if (condicin) {
return x;
}
return y;
debe ser escrito as:
return (condicin ? x : y);




Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 51

Expresiones antes de '?' en el operador condicional
Si una expresin con un operador binario aparece antes del signo ? en el
operador ternario ?:, debe ser puesta entre parntesis. Ejemplo:
(x >= 0) ? x : -x;
Comentarios especiales
Use XXX en un comentario para indicar algo que funciona pero que no est
del todo bien.
Use FIXME (fix me, corrgeme) para indicar algo que no funciona del todo y
debe corregirse.
Use TODO (to do, hacer) para indicar algo que no est totalmente
terminado.

Integracin
Las buenas prcticas de programacin exigen un orden, una normalizacin,
estandarizacin de la escritura y estructura capaz de ser entendida por
cualquier persona que lea su cdigo, es por ello que las convenciones del
lenguaje y del Paradigma Orientado a Objeto las tenemos que conocer,
respetar y utilizar.
Reuso de Software
Una de las caractersticas ms importantes de la Programacin Orientada a
Objetos es el reuso de software, o sea, si una funcionalidad dentro de la
clase la usa ms de una vez, no debe escribirlo N veces, sino una vez y
llamarlo N veces. Para lograr este cometido es importante analizar el
comportamiento de los objetos para decidir dnde colocar el mtodo a
reusar. Si no perteneciera a un comportamiento de un objeto especfico, se
coloca en una clase que tiene funcionalidades. Esta clase se debe colocar en
un paquete bien identificado que le permita utilizarlo en distintos
proyectos, as se convierte en parte de su librera. Por ejemplo, las
validaciones de datos ingresados que deben ser numricos, es una
validacin que har ms de una vez y en todos los proyectos. Es conveniente
hacer una clase para estos mtodos considerados libreras y colocarlos en
un pakage, para poder reusar en ms de un proyecto, o sea en ms de un
mdulo o sistema.
Conclusin
Con lo visto en esta unidad usted est en condiciones de plantear el diseo
de clases y la codificacin organizada en paquetes de dichas clases.
En el planteo de solucin de un caso trate de integrar todos los conceptos
definidos, Herencia, encapsulamiento, Interfaz, Excepciones, validaciones
utilizando la nomenclatura correcta.
Un programa de calidad no solo respeta la Programacin Orientada a
Objetos sino que tambin funciona correctamente, sin errores ni
excepciones.
Espero que le haya sido de utilidad lo aprendido en este mdulo.


Materia: Taller de Algoritmos y Estructuras de Datos I
Profesora: Adriana Prez | 52

Bibliografa Lectura 1

Mark Allen Weiss, Estructuras de Datos en Java, ed. Addison Wesley.
Deitel y Deitel, Java cmo programar , sptima edicin, ed. Pearson, 2008.
Pressman Roger, (2006), Ingeniera de Software. Un enfoque prctico 6ta.
edicin, Ed. McGraw Hill
ORACLE, Oracle 10g: Programacin Java, Gua del Alumno, 2003

www.uesiglo21.edu.ar

Vous aimerez peut-être aussi