Documente Academic
Documente Profesional
Documente Cultură
Tecnolgico de Saltillo
Departamento de Sistemas
Apuntes de Programacin Orientada a Objetos
Dr. Scrates Torres Ovalle
Enero de 2016
Programa
Contenidos especficos
1. Arreglos de una dimensin
(vectores)
4. Extensin de clases
5. Excepciones
6. Flujos y archivos
Temas de aprendizaje
1.1 Definicin del concepto de vector
1.2 Declaracin de una referencia de tipo
vector
1.3 Creacin de un objeto vector
1.4 Seleccin de los componentes
2.1 Definicin del concepto de matriz (Vector
de vectores)
2.2 Declaracin de una referencia de tipo
matiz
2.3 Creacin de un objeto matriz
2.4 Seleccin de los componentes
2.5 Diseo de una clase instanciable con una
matriz como atributo
3.1 Declaracin y uso de parmetros de tipo
objeto
3.2 Declaracin y uso de mtodos de tipo
objeto
3.3 Vector de objetos
4.1 Inner clases (clases dentro de clases)
4.2 Concepto de herencia
4.3 Jerarqua de clases y atributos protected
4.4 Compatibilidad de tipos (uso de downcasting y up-casting)
4.5 La super clase Object
4.6 Polimorfismo
4.7 Vector de objetos de tipo Object
4.8 Herencia forzada y clases abstractas
4.9 Declaracin y uso de una interface
5.1 Definicin del concepto de excepcin
5.2 Tipos de excepciones predefinidas
5.3 Propagacin
5.4 Manejo y lanzamiento de excepciones
5.5 Excepciones definidas por el usuario
6.1 Concepto de flujo
6.2 Tipos de flujos
6.3 Lectura y escritura en un archivo
6.4 La clase File
6.5 Archivos de acceso aleatorio
6.6 Lectura y escritura de objetos
NDICE
35
45
49
5.- Excepciones
62
73
Referencias
82
Anexo A
83
Anexo B
89
=
=
=
=
=
100;
200;
400;
700;
800;
indice = 4;
nominas[indice]= 300;
Tabla 1.1.- Cambia el valor del ndice y se accede a otro miembro del
arreglo
Nota: cuando aplicas el operador unario incremento (++) o decremento
(--) a un ndice, el efecto es diferente si lo usas como prefijo o sufijo del
ndice. La Tabla 1.2 muestra dos fragmentos de cdigo: La primer
columna asigna un cien al elemento 5 del arreglo, mientras que en la
columna de la derecha se asigna un cien al elemento 6 del arreglo. El
operador incremento situado como prefijo del ndice indica que primero
se realiza el incremento y luego la asignacin. Caso contrario cuando el
operadore incremento es un sufijo de ndice.
int
arreglo
int[10];
int indice = 5;
new int
arreglo
int[10];
new
int indice = 5;
arreglo[indice++] = 100;
arreglo[++indice] = 100;
Tabla 1.2.- Efecto de usar el operador unario como prefijo o sufijo de un
ndice
MEMORIA ESTTICA
Por ltimo, una tercera caracterstica de los arreglos tiene que ver con el
uso de memoria esttica: una vez dimensionado el arreglo, una vez que
se declar cuantos elementos tiene, no habr forma de cambiarlo. Si lo
contrastamos con la memoria dinmica propia de una lista, veremos que
en esta ltima se podr insertar o borrar tantos nodos como sea
necesario, pero al arreglo no se le podr agregar o quitar un elemento.
Esto en s es una desventaja. Aunque tambin existe la clase ArrayList
contenida en el paquete java.util (package).
Sintaxis en la declaracin de un arreglo
Lo fro de la sintaxis, nadie quiere lidiar con esto, pero si te acostumbras,
vers que son como asntotas que te guan en la buena escritura y uso
de un arreglo. Sintaxis:
tipo [] nombreArreglo = new tipo[tamao];
tipo nombreArreglo[] = new tipo[tamao];
8
implcita el tamao
dimensionamiento).
del
arreglo
se
fij
en
cuatro
(auto-
=
=
=
=
12;
37;
21;
24;
10
double[] otraReferencia;
//se asigna la primer referencia a la segunda
otraReferencia = unaReferencia;
//ahora el arreglo tiene dos nombres (referencias)
Un arreglo, entonces, s puede tener ms de una referencia, los
elementos del arreglo pueden ser manipulados a travs de cualquiera de
estas referencias. No se trata de dos arreglos, son dos referencias que
tienen control de los mismos elementos en un arreglo.
unaReferencia[5] = 21.7;
otraReferencia[5] = 14.18;
El valor final para el elemento cinco es 14.18. Se puede pensar que,
tener dos referencias (nombres) para un arreglo es de poca utilidad,
pero su utilizacin es bastante frecuente al menos de forma indirecta
: El caso de enviar como argumento un objeto cualquiera (un arreglo
por ejemplo), el cual es recibido por una referencia. Al primero se le
relaciona con un argumento actual, al segundo como argumento formal.
De esta manera los cambios que el objeto sufra a su paso por el mtodo
que lo recibe (mediante la referencia formal) son los mismos que se
reflejan en el objeto enviado (referencia actual).
Es cierto que puedo liberar la memoria del arreglo?
Cuando se asigna a una referencia el valor de null, se dice que la
referencia pierde el control del arreglo. Esto tambin es cierto cuando la
referencia controla un objeto. De hecho un arreglo es considerado un
objeto.
Tambin, cuando un arreglo ya no lo controla ninguna referencia, se dice
que la memoria que ocupan todos los elementos del arreglo queda
disponible para asignarse a otras variables. Lo anterior sucede mediante
el trabajo del recolector de basura de Java. Para el ejemplo del arreglo
que es controlado por dos referencias, si se asigna null a ambas
referencias:
unaReferencia = null;
otraReferencia = null;
Estamos indicando que el recolector de basura (Garbage Collector) de
Java puede regresar el bloque de memoria que ocupaba el arreglo.
Cuando el colector acta, el Sistema Operativo marca este bloque de
memoria como disponible.
13
uno++;
dos++;
tres++;
cuatro++;
cinco++;
seis++;
siete++;
ocho++;
nueve++;
diez++;
break;
break;
break;
break;
break;
break;
break;
break;
break;
break;
System.out.println("Frecuencia de nmeros
generados:");
System.out.println("1.- " + uno);
System.out.println("2.- "
+ dos);
System.out.println("3.- "
+ tres);
System.out.println("4.- "
+ cuatro);
System.out.println("5.- "
+ cinco);
System.out.println("6.- "
+ seis);
System.out.println("7.- "
+ siete);
System.out.println("8.- "
+ ocho);
System.out.println("9.- "
+ nueve);
System.out.println("10.- " + diez);
}//main
}//class
18
contador[1]++;
contador[2]++;
contador[3]++;
contador[4]++;
contador[5]++;
contador[6]++;
contador[7]++;
contador[8]++;
contador[9]++;
contador[10]++;
break;
break;
break;
break;
break;
break;
break;
break;
break;
break;
System.out.println("Frecuencia de nmeros
generados:");
for(int i = 1; i <= 10; i++)
{
System.out.println(i + ".- " + contador[i]);
}
}//main
}//class
Tercer idea: Utilizar un arreglo de contadores. De la segunda idea, se
puede observar que el caso dentro del estatuto switch siempre
corresponde con el ndice del contador que se incrementa. Entonces el
dato generado aleatoriamente se utiliza como ndice del contador que se
19
10.- 1014
Los arreglos, se pasan por referencia como los objetos, de hecho, un
arreglo es un objeto. Dado que los arreglos son referencias a objetos,
stos, cuando se pasan como parmetros en un mtodo, no son paso de
parmetros por valor sino por referencia. Considera el siguiente cdigo:
int[] unArreglo = {15, 21, 0, -72, 100};
System.out.println("Contenido del arreglo");
System.out.println( Arrays.toString( unArreglo ) );
Arrays.sort(unArreglo);
System.out.println("Contenido del arreglo despus de ser
enviado como parmetro");
System.out.println( Arrays.toString( unArreglo ) );
La ejecucin nos muestra que el arreglo cambi despus de haber sido
enviado como parmetro, lo cual indica que los arreglos, siendo objetos,
siempre son enviados por referencia y no por valor como sucede cuando
enviamos variables de tipo primitivo.
Contenido del arreglo
[15, 21, 0, -72, 100]
Contenido del arreglo despus de ser enviado como parmetro
[-72, 0, 15, 21, 100]
Sumarizando: Debemos tener cuidado cuando enviamos un arreglo
como parmetro o argumento de un mtodo, ya que si el mtodo
cambia algn elemento del arreglo, ste se ve reflejado en nuestro
arreglo original.
Cmo puedo hacerle para que mi arreglo original no cambie? La
respuesta consiste en hacer una copia (o clone) del arreglo original, y
enviar la copia como parmetro, al trmino de la ejecucin del mtodo,
la copia podra haber cambiado, pero el arreglo original permanece
intacto. En general est regla aplica para cualquier objeto (referencia)
que es enviado como parmetro. La idea anterior se ilustra en el
siguiente cdigo:
int[] unArreglo = {15, 21, 0, -72, 100};
System.out.println("Contenido del arreglo original");
System.out.println( Arrays.toString( unArreglo ) );
int[] copiaDelArreglo = unArreglo.clone();
Arrays.sort(copiaDelArreglo);
System.out.println("Contenido ordenado del arreglo copia");
21
arreglo
Ejecucin de programa:
Contenido del arreglo original
[15, 21, 0, -72, 100]
Contenido ordenado del arreglo copia
[-72, 0, 15, 21, 100]
Otra vez, contenido del arreglo original
[15, 21, 0, -72, 100]
Conclusin: Debemos recordar que los arreglos si se envan como
parmetro en la llamada de un mtodo, siempre se envan por
referencia.
La clase Arrays, una clase contenida en el paquete java.util del API de
Java, permite la manipulacin de arreglos. Utiliza de la clase Arrays los
mtodos tipo static, fill() y toString(), para programar la aplicacin
anterior que generaba 10,000 nmeros aleatorios y mostraba la
frecuencia de aparicin:
import java.util.*;
public class AleatorioConArrays
{
public static void main(String args[])
{
Random r = new Random();
int[] contador = new int[11];
//contadores se inician en cero
Arrays.fill(contador, 0);
//generacin y conteo
for (int i = 1; i <= 10000; i++)
{
contador[ (r.nextInt(10) + 1) ]++;
}//for
System.out.println("Frecuencia de nmeros
generados:");
//se copia el arreglo de once elementos a uno de
//de diez elementos
int[]contadorConDiezElementos =
22
Arrays.copyOfRange(contador,1,11);
//seimprime el arreglo de contadores
System.out.println(Arrays.toString(
contadorConDiezElementos));
}
}
Resultado de la ejecucin:
Frecuencia de nmeros generados:
[984, 979, 982, 1017, 1009, 991, 993, 1057, 964, 1024]
Clases instanciables que contienen (has_a) arreglos como
campos
Los arreglos tambin pueden fungir como campos (variables en una
clase instanciable).
Problema propuesto 1.3
Podemos entonces realizar la suma de dos arreglos (vectores)
programando directamente sobre los arreglos o mediante una clase
definida por nosotros de nombre, digamos, Arreglo. Veamos las dos
opciones:
Para aumentar el grado de complejidad realicemos la suma punto que
permite la suma de arreglos an cuando sean de diferente tamao
(dimensin). La corrida se espera como sigue:
Tamao del arreglo a
3
Dato 0
1
Dato 1
2
Dato 2
3
Tamao del arreglo b
5
Dato 0
1
Dato 1
2
Dato 2
3
Dato 3
4
23
Dato 4
5
a = [1, 2, 3]
b = [1, 2, 3, 4, 5]
c = a +. b = [2, 4, 6, 4, 5]
Sin clase instanciable
import java.util.*;
public class SumaPunto
{
public static void main(String args[])
{
Scanner s = new Scanner(System.in);
System.out.println("Tamao de a");
int n = s.nextInt();
int a[] = new int[n];
for(int i=0; i<n; i++)
{
System.out.println("Dato "+i);
a[i] = s.nextInt();
}
System.out.println("Tamao de b");
int m = s.nextInt();
int b[] = new int[m];
for(int i=0; i<m; i++)
{
System.out.println("Dato "+i);
b[i] = s.nextInt();
}
int c[]=null;
if(n == m)
{
c = new int[n];
for(int i=0; i<n; i++)
{
c[i] = a[i] + b[i];
}
}
if(n > m)
{
c = new int[n];
//b es ms pequeo
for(int i=0; i < m; i++)
{
c[i] = a[i] + b[i];
}
for(int j = m; j < n; j++)
24
{
c[j] = a[j] + 0;
}
}
if(m > n)
{
c = new int[m];
//b es ms pequeo
for(int i=0; i < n; i++)
{
c[i] = a[i] + b[i];
}
for(int j = n; j < m; j++)
{
c[j] = b[j] + 0;
}
}
System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(b));
System.out.println(Arrays.toString(c));
}//main
}//class
Con clase instanciable
Una opcin del proyecto podra ser como se muestra en la Figura 1.9:
c = cx.arr;
//b es ms pequeo
for(int i=0; i < m; i++)
{
c[i] = a[i] + b[i];
}
for(int j = m; j < n; j++)
{
c[j] = a[j] + 0;
}
}
if(m > n)
{
cx = new Arreglo(m);
c = cx.arr;
//b es ms pequeo
for(int i=0; i < n; i++)
{
c[i] = a[i] + b[i];
}
for(int j = n; j < m; j++)
{
c[j] = b[j] + 0;
}
}
return cx;
}//sumar
public void mostrarArreglo()
{
System.out.println(Arrays.toString(arr));
}
}//class
El cdigo para la aplicacin PruebaArregloParaSumaPunto sera:
public class PruebaArregloParaSumaPunto
{
public static void main (String args[])
{
Arreglo a = new Arreglo();
a.leerDatos();
Arreglo b = new Arreglo();
b.leerDatos();
Arreglo c = a.sumarArregloCon(b);
27
a.mostrarArreglo();
b.mostrarArreglo();
c.mostrarArreglo();
}//main
}//class
28
diez
elementos
tipo
25
Para la opcin de Listado:
Tu opcin?
5
Ests en listado
Producto No. parte: 100
Descripcin: Cereal
costo: 23.5
Cantidad: 25
Producto No. parte: 200
Descripcin: Detergente
costo: 17.5
Cantidad: 122
Producto No. parte: 300
Descripcin: Refresco
costo: 9.5
Cantidad: 90
Para la opcin de Consulta:
Tu opcin?
3
Ests en consultas
Cul nmero de parte:
200
Producto No. parte: 200
Descripcin: Detergente
costo: 17.5
Cantidad: 122
Tu opcin?
3
Ests en consultas
Cul nmero de parte:
500
Producto no existe
Para la opcin de Baja:
Tu opcin?
2
Ests en bajas
Cul nmero de parte:
500
Producto no existe
32
Tu opcin?
2
Ests en bajas
Cul nmero de parte:
200
Tu opcin?
5
Ests en listado
Producto No. parte: 100
Descripcin: Cereal
costo: 23.5
Cantidad: 25
Producto No. parte: 300
Descripcin: Refresco
costo: 9.5
Cantidad: 90
Para la opcin de Cambio:
Tu opcin?
4
Ests en cambios
Cul nmero de parte:
100
Producto No. parte: 100
Descripcin: Cereal
costo: 23.5
Cantidad: 25
Qu campo (variable) deseas cambiar
Descripcin [D]
Costo [C]
Cantidad [Ca]
Tu opcin
c
Nuevo costo
20.50
Tu opcin?
3
Ests en consultas
Cul nmero de parte:
100
Producto No. parte: 100
Descripcin: Cereal
costo: 20.5
Cantidad: 25
33
Ejercicios propuestos:
1. Leer n nmeros y contar cuntos son pares, negativos y ceros.
2. Leer n calificaciones y contar cuntos estn arriba de la media, y
cuntos por debajo de ella.
3. Encontrar el mayor y el menor de un arreglo de n nmeros.
4. Leer n nombres de personas y determinar cul es la moda.
5. Crear un arreglo de 40 nmeros aleatorios binarios.
6. Crear un arreglo de 10 nmeros aleatorios hexadecimales irrepetibles.
7. Programar los siguientes mtodos de la clase Arrays (consulta el API de
Java para ver detalle de los mtodos):
Copiar un arreglo
Llenar un arreglo
Ordenar un arreglo
Convertir a String un arreglo.
Buscar un elemento dado en un arreglo.
copiaDe() y todas las sobrecargas.
busqueda()
copiaDeRango()
equals()
deepEquals()
fill()
hashCode()
deepHashCode()
sort()
toString()
deepToString()
8. Programar los mtodos que permitan operaciones bsicas sobre
arreglos [2]:
Bsqueda
Ordenamiento
Insercin
Eliminacin
9. Programar aplicaciones para los siguientes ejercicios bsicos entre
vectores:
Suma de vectores
Resta de vectores
Producto escalar o producto punto
Producto vectorial
34
Transpuesta de un arreglo
10. Programar una clase instanciable Triangulo Irregular que contenga,
35
new double[64][128];
new double[x][y];
36
37
38
39
}//class
El cdigo para la clase instanciable Arreglo2D es:
import java.util.*;
public class Arreglo2D
{
private int mx[][];
Scanner s = new Scanner(System.in);
public Arreglo2D()
{
System.out.println("Columnas? ");
int n = s.nextInt();
System.out.println("Filas? ");
int m = s.nextInt();
mx = new int[n][m];
}
public Arreglo2D(int col, int fil)
{
mx = new int[col][fil];
}
public void leerDatos()
{
for(int i=0; i<mx.length; i++)
{
for(int j=0; j<mx[i].length; j++)
{
System.out.println("matriz
["+i+"]["+j+"]");
mx[i][j] = s.nextInt();
}
}
}
public int getElemento(int col, int fil)
{
return mx[col][fil];
}
public void serElemento(int col, int fil, int dato)
{
mx[col][fil] = dato;
}
public String toString()
{
String aux = "Matriz de "+ mx.length+ "x"+
41
mx[0].length +"\n";
for(int i=0; i<mx.length; i++)
{
aux = aux + Arrays.toString(mx[i])+"\n";
}
return aux;
}
}
La ejecucin de la aplicacin es:
Columnas?
2
Filas?
2
Matriz A
matriz [0][0]
1
matriz [0][1]
2
matriz [1][0]
3
matriz [1][1]
4
Matriz de 2x2
[1, 2]
[3, 4]
Matriz
matriz
1
matriz
2
matriz
3
matriz
4
matriz
5
matriz
6
matriz
7
matriz
8
B
[0][0]
[0][1]
[0][2]
[0][3]
[1][0]
[1][1]
[1][2]
[1][3]
42
Matriz de 2x4
[1, 2, 3, 4]
[5, 6, 7, 8]
Problema propuesto 2.2
Disear una clase instanciable Matrices que permita realiza la operacin
suma de dos matrices. Deber utilizar la clase anterior (Arreglo2D) y
deber contener las variables y mtodos descritos por el diagrama UML
de la tabla 2.3.
Matrices
- a: Arreglo2D
- b: Arreglo2D
- c: Arreglo2D
+ Matrices()
+Matrices(col:int, fil: int)
+ leerMatrices(): void
+ sumarMatrices(): void
+ toString() : String
Tabla 2.3 Diagrama UML para la clase Matrices
El diagrama de clases puede verse en la Figura 2.5.
for(int i=0;i<a.getColumnas();i++)
{
for(int j=0; j<a.getColumnas(); j++)
{
c.setElemento(i,j, a.getElemento(i,j) +
b.getElemento(i,j));
}
}
}
public String toString()
{
String aux = a.toString() + "\n" +
b.toString() + "\n" +
c.toString() ;
return aux;
}
}
La corrida es:
Columnas?
2
Filas?
2
matriz [0][0]
1
matriz [0][1]
2
matriz [1][0]
3
matriz [1][1]
4
matriz [0][0]
1
matriz [0][1]
2
matriz [1][0]
3
matriz [1][1]
4
Matriz de 2x2
[1, 2]
[3, 4]
Matriz de 2x2
[1, 2]
[3, 4]
45
Matriz de 2x2
[2, 4]
[6, 8]
46
Como en todos los lenguajes un mtodo no podr ser duplicado (poseer la misma firma).
Dos o ms mtodos si podrn llamarse iguales (concepto de Sobrecarga overload ),
siempre y cuando posean diferente firma. Esto se logra diferendo en la cantidad y/o tipo de
sus argumentos.
Sintaxis:
modificador-acceso clase_o_instancia tipo_retorno nombre (argumentos_formales)
{
estatutos que dan funcionalidad particular al mtodo;
}
Cinco tipos de mtodos descritos en [6]:
Mtodos que reciben parmetros de entrada y retornan un valor, el mtodo
charAt, recibe un argumento de entrada, este es de tipo int (el nombre index
no es importante), y retorna un char. La funcin que desempea se anota
abajo. Adems el mtodo es de acceso pblico y de tipo instancia. Este mtodo
pertenece a la clase String que se encuentra en el package java.lang.
public char
charAt(int index)
Returns the char value
the specified index.
at
47
println(int x)
Prints an integer and then
terminate the line.
Tabla 3.2.- Mtodo println
nextInt()
Scans the next token of the
input as an int.
Tabla 3.3.- Mtodo nextInt
init()
Called by the browser or
applet viewer to inform this
applet that it has been
loaded into the system.
Tabla 3.4.- Mtodo init
sort(int[] a)
48
regresa
regresa
regresa
regresa
ordena
49
50
51
Si tenemos una
JugadorDeTenis:
clase
Jugador
podemos
extender
la
clase
52
53
no
modificador
+ PuntoUnaDimension()
+setX(a: int): void
+ getX(): int
+ leerX(): void
+ toString() : String
Tabla 4.4 Diagrama UML para la clase PuntoUnaDimension
Segn [8], en UML los diferentes modificadores de acceso son como se
muetra en la Tabla 4.5.
+
private
Public
Packag
e
# Protect
ed
Tabla 4.5 Diferentes modificadores de acceso segn UML
El cdigo para la clase PuntoUnaDimensin es:
import java.util.*;
public class PuntoUnaDimension extends Object
55
{
protected int x; //x es heredable
public PuntoUnaDimension()
{
x = 0;
}
public void setX(int abs)
{
x = abs;
}
public int getX()
{
return x;
}
public void leerX()
{
Scanner s = new Scanner(System.in);
System.out.println("valor de x= ");
x = s.nextInt();
}
@Override
public String toString()
{
return "Soy un punto en 1D x = "+x;
}
}
+ PuntoDosDimensiones()
+setY(a: int): void
56
+ getY(): int
+ leerY(): void
+ toString() : String
Tabla 4.6.- Diagama UML para la clase PuntoDosDimensiones
Al extendernos de la clase PuntoUnaDimension, heredamos la variable x
(abscisa), y slo aadimos el cdigo alrededor de la variable y
(ordenada).
import java.util.*;
public class PuntoDosDimensiones extends
PuntoUnaDimension
{
//la variable x la hereda
protected int y; //y es heradable
public PuntoDosDimensiones()
{
super();
//x=0;
y=0;
}
public void setY(int ord)
{
y = ord;
}
public int getY()
{
return y;
}
//leerX() lo hereda
public void leerY()
{
Scanner s = new Scanner(System.in);
System.out.println("valor de y= ");
y = s.nextInt();
}
@Override
public String toString()
{
return "Soy un punto en 2D x = "+x+" y= "+y;
}
}
+ PuntoTresDimensiones()
+setZ(a: int): void
+ getZ(): int
+ leerZ(): void
+ toString() : String
Tabla 4.7.- Diagrama UML para la clase PuntoTresDimensiones
El cdigo par la clase PuntoTresDimensiones es:
import java.util.*;
public class PuntoTresDimensiones extends
PuntoDosDimensiones
{
//la variable x la hereda
//la variable y la hereda
private int z;
PuntoTresDimensiones()
{
super();//x=0, y=0
z=0;
}
public void setZ(int aux)
{
z = aux;
}
public int getZ()
{
return z;
}
//leerX() lo hereda
//leerY() lo hereda
public void leerZ()
{
Scanner s = new Scanner(System.in);
System.out.println("valor de z= ");
z = s.nextInt();
}
@Override
58
}
}
59
p3.leerY();
p3.leerZ();
System.out.println(p3.toString());
60
Programacin
Si invertimos el orden, es decir que un objeto instancia de una subclase
se trate de construir usando una superclase:
String nombre = new Object();
System.out.println(nombre);
El error arrojado es:
incompatible types: java.lang.Object cannot be converted to
java.lang.String
En conclusin: Un objeto slo puede ser construido con cualquiera de las
subclases de la cual fue instanciado. Esto es el concepto de
polimorfismo
Clases abstractas:
Una clase abstracta es una clase que es declarada abstract. Puede tener
o no tener mtodos abstractos. No puede ser instanciada pero si puede
ser extendida. Tambin puede ser extendida por otra clase abstracta.
Como dijimos, ninguna clase abstracta superclase o subclasejams
podr ser instanciada.
La sintaxis de una clase abstracta es:
public abstract class UnaClase {
// declarar campos
// declarar mtodos no abstractos
abstract void draw(); //ejemplo de mtodo abstracto
}
Un mtodo abstracto es declarado sin su implementacin. No tendr
asociado un bloque de cdigo. Ejemplo:
abstract void desplazarseA(double incX, double incY);
Considera el uso de clases cuando, en el ambiente de herencia, deseas
que un conjunto de subclases compartan un cierto cdigo base. Con los
mtodos abstractos aseguras que todas las clases implementen su
propia versin de cdigo. Si la clase derivada no implementa el cdigo
de los mtodos abstractos entonces deber ser tambin una clase
abstracta. Las clases derivadas, sino son abstractas de nuevo, podrn
ser instanciadas.
Interfaces:
61
Una interface, al igual que una clase, es una referencia que puede tener
constantes, firmas de mtodos, mtodos tipo default, mtodos estticos,
y tipos anidados.
Ejemplo:
public interface Carro {
// declaracin de constantes, si son necesarias
// firmas de mtodos
int encender(Direccion direccion,
double radio,
double velInicial,
double velFinal);
int cambiarEngranes(Direccion direccion,
double velInicial,
double velFinal);
int encenderSeal(Direccion direccion,
boolean sealEncendido);
int getRadarFrontal(double distanciaACarro,
double velDeCarro);
int getRadarAtras(double distanciaACarro,
double velDeCarro);
...
// ms firmas de mtodos
}
Usa una interface cuando deseas que clases no relacionadas
implementen tu interface.
Las interfaces son usadas para tratar de emular la herencia mltiple que
en Java est prohibido. Se dice que una clase slo puede extenderse de
una clase pero implementar tantas interfaces como sea necesario:
public class TelefonoInteligente extends
DispositivoElectronico implements Calendario,
Calculadora, Agenda, Mensajera
{
//campos o variables
//mtodos
}
62
Ejercicios propuestos:
1. Disear el proyecto que se muestra en la Figura 4.5:
63
64
67
}
}
class Entrada
{
void metodo() throws EntradaEquivocadaException
{
throw new EntradEquivocadaException("Entrada invlida");
}
}
class PruebaEntrada
{
public static void main(String[] args)
{
try {
new Entrada().metodo();
}
catch(EntradaEquivocadaException eee) {
System.out.println(eee.getMessage());
}
}
}
Tu edad es 18
El cdigo para el mtodo leerInt() es:
public static int leerInt(String msg)
{
Scanner s = new Scanner(System.in);
int num = 0;
while(true)
{
System.out.println(msg);
String aux = s.next();
try
{
num = Integer.parseInt(aux);
break;
}
catch(NumberFormatException nfe)
{
System.out.println("Te equivocaste...");
}
}
return num;
}
69
}
}
catch(NumberFormatException nfe)
{
System.out.println("Te equivocaste...");
}
return num;
70
System.out.println(msg);
String aux = s.next();
return aux;
}
Alta");
Baja");
Consulta");
Cambio");
Listado");
Salvar");
Cargar");
Salir");
71
Alta");
Baja");
Consulta");
Cambio");
Listado");
Salvar");
Cargar");
Salir");
super();
}
@Override
public String toString()
{
return "Tecleaste un rango invlido...";
}
}
Agragar cdigo a la clase Producto para que utilice esta excepcin y
logre la validacin de entradas String invlidas:
private boolean checarRangoInvalido(String sp)
{
if(! (sp.toLowerCase().equals("d") ||
sp.toLowerCase().equals("c")||
sp.toLowerCase().equals("ca")) )
{
return true;
}
return false;
}
public void cambiar() throws FueraRangoException
{
System.out.println("Qu campo (variable) deseas
cambiar");
System.out.println("Descripcin [D]");
System.out.println("Costo [C]");
System.out.println("Cantidad [Ca]");
System.out.println("Tu opcin");
String subop = s.next();
if(
{
checarRangoInvalido(subop) )
throw new FueraRangoException();
}
...
Ejercicios propuestos:
1. La opcin de entrada del problema propuesto 5.2 ha sido validada para
recibir slo nmeros enteros. De lo contrario lanza un mensaje de
formato invlido. Sin embargo todava existen un gran nmero de
posibles entradas numricas enteras equivocadas. Se nos ocurre que
podemos programar una Excepcin definida por el programador para
73
que no slo valide a entrada de nmeros enteros sino que estn tambin
en el rango de nmeros enteros vlidos (1,2,3,4,5,6,7 y 9).
Programar la Excepcin RangoEnteroInvalidoException que pueda ser
lanzada cuando se tenga una de estas entradas invlidas.
Agregar al men el cdigo necesario que utiliza la excepcin
programada.
2. Programar la excepcin DivisionPorCerpException que colabore en la
deteccin de denominadores con valor de cero.
3. Si deseamos leer los datos para rellenar un arreglo normalmente
utilizamos un ciclo for, esto, dado que sabemos el numeor de elementos
que hay en la coleccin: arr.length, pero, deseamos hacerlo utilizando un
while, ciclo que sirve de forma natural cuando no sabemos el nmero de
ciclos a realizar. Entonces estaremos forzados a usar Manejo de
excepciones.
Implementa los primeros cinco ejercios propuestos en la Unidad uno
pero mediane excepciones.
4. Programar las excepciones que se muestran en la Figura 5.2.
Exceptio
nA
Exceptio
nB
Exceptio
n
Exceptio
nC
Exceptio
nD
Exceptio
nE
Exceptio
n
Exceptio
nA
Exceptio
nB
Exceptio
nC
Exceptio
nD
Exceptio
nE
74
Fuente de
Datos
Fluj
o
Programa
Fluj
o
Destino de Datos
Flujos
o
o
Flujos
o
o
binarios:
InputStream(read())
OutputStream(write(int b))
de texto:
Reader(read(char [] b, int o, int l ))
Writer(write(char[] b), int o, int l))
throws
75
{
System.out.println((char)c);
c = sr.read();
}//while
}//main
}//class
Notas:
76
{
e.printStackTrace();
}
finally
{
// cierra el flujo (stream)
if(fis!=null)
fis.close();
//libera recursos asociados con el flujo
if(isr!=null)
isr.close();
}
}//main
}//class
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
H
o
l
a
Caracter
Caracter
Caracter
Caracter
Caracter
Caracter
Caracter
Caracter
Caracter
Caracter
Caracter
Caracter
Caracter
Caracter
Caracter
Caracter
Caracter
Caracter
Caracter
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
E
s
t
o
j
a
v
a
e
s
u
n
a
p
r
u
e
b
a
77
Caracter
Caracter
Caracter
Caracter
Caracter
Caracter
Caracter
Caracter
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
ledo:
S
a
l
u
d
o
s
Caracter ledo:
Caracter ledo:
Escritura en un archivo:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class FlujoHaciaArchivo
{
public static void main(String[] args)
{
FileOutputStream fop = null;
File file;
String contenido = "Este es el contenido";
try {
file = new File("/Users/Mac/Documents/salida.txt");
fop = new FileOutputStream(file);
// si el archivo no existe, se crea
if (!file.exists())
{
file.createNewFile();
}
// obtener el contenido en bytes
byte[] contenidoEnBytes = contenido.getBytes();
//escribir en el flujo asociado al archivo
fop.write(contenidoEnBytes);
fop.flush();
fop.close();
System.out.println("Realizado");
}
catch (IOException e)
{
e.printStackTrace();
78
}
finally
{
try {
if (fop != null) {
fop.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}//main
}//class
try
{
File file = new File("C:/myfile.txt");
if(file.createNewFile())
System.out.println("xito!");
else
System.out.println("Error, archivo ya existe.");
}
catch(IOException ioe)
{
ioe.printStackTrace();
}
}//main
}//class
Archivos de acceso aleatorio
Los archivos de acceso aleatorio permiten un acceso no secuencial al
contenido de un archivo.
Las acciones naturales para manipular el contenido de un archivo de
acceso aleatorio son:
1. Abrir el archivo.
2. Buscar una posicin en particular dentro del archivo.
3. Leer desde o escribir hacia el archivo.
import java.io.Serializable;
public class Cliente implements Serializable
{
String nombre;
String calle;
String pais;
public void setNombre(String nombre)
{
this.nombre = nombre;
}
public String getNombre()
{
return this.nombre;
}
public void setCalle(String calle)
{
this.calle = calle;
}
public void setPais(String pais)
{
this.pais = pais;
}
public String getCalle()
{
return this.calle;
}
public String getPais()
{
return this.pais;
}
@Override
public String toString() {
return new StringBuffer("Nombre : ")
.append(this.nombre).append(" Calle : ")
.append(this.calle)
.append(" Pas : ")
.append(this.pais).toString();
}
}
81
82
import java.io.ObjectInputStream;
import java.io.Serializable;
public class PruebaLecturaArchivoObjeto
{
public static void main (String args[])
{
Cliente cliente = null;
try{
FileInputStream fin = new
FileInputStream("/Users/Mac/Documents/Agenda.dat");
ObjectInputStream ois = new ObjectInputStream(fin);
cliente = (Cliente) ois.readObject();
ois.close();
}
catch(Exception ex)
{
ex.printStackTrace();
}
System.out.println(cliente);
}
La ejecucin deber mostrar el contenido del objeto que ley del archivo
Agenda.dat.
Aqu la salida:
Nombre : Jos Alfredo Calle : Abasolo 611 Pas : Argentina
Ambas aplicaciones utilizaron la clase instanciable Cliente. El proyecto
se puede apreciar en la Figura 6.3.
83
84
Referencias
[1] Oracle Help Center. Class Arrays. Recuperado de:
https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html
[2] Informtica 11. Taller 5.3. Operaciones bsicas con arreglos.
Recuperado de:
https://informatica11cor.wordpress.com/2012/05/16/taller-5-3operaciones-basicas-con-arreglos/
[3] Stack overflow. Sintax for creating a two dimensional array.
Recuperado de: http://stackoverflow.com/questions/12231453/syntaxfor-creating-a-two-dimensional-array
[4] Oracle Help Cener. Capter 10. Arrays. Recuperado de:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html
[5] Oracle Help Center. Class ArrayList. Recuperado de:
https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
[6] Aprobar Java, Dr. Scrates Torres Ovalle. UAdeC. 2014.
[7] Oracle Help Center. Class StringTokenizer. Recuperado de:
https://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html
[8] UML. Visibility in UML. Recuperado de: http://www.umldiagrams.org/visibility.html
[9] Joyanes Aguilar, Luis., Programacin en Java 2 : algoritmos,
estructuras de datos y programacin orientada a objetos / Luis Joyanes
Aguilar, Ignacio Zahonero Martnez., 1a ed., Madrid ; Mxico : McGrawHill, c2002., Spain 2002.
[10] Sierra, Kathy., Head first Java / Kathy Sierra, Bert Bates., 2nd ed.,
Sebastopol, CA : O'Reilly, 2005, California, 2005.
[11] Deitel, Harvey M., 1945-, Java : how to program / H.M. Deitel, P.J.
Deitel., 6th ed., Upper Saddle River, N.J. : Pearson/Prentice Hall, c2005.,
New Jersey, c2005.
[12] Cohoon, James P., Programacin en Java 5.0 / James P. Cohoon, Jack
W. Davidson ; traduccin, Jess Snchez Allende ... [et al.], 1a ed.,
Madrid ; Mxico : McGraw-Hill/Interamericana, 2006., Spain, 2006.
85
Anexo A
Detalle de cdigo para el problema propuesto 1.4.
Clase Producto:
import java.util.*;
public class Producto
{
private int numParte;
private String descripcion;
private double costo;
private int cantidad;
Scanner s = new Scanner(System.in);
public Producto()
{
numParte = 0;
descripcion = null;
costo = 0.0;
cantidad = 0;
}
public Producto(int np, String d, double c, int ca)
{
numParte = np;
descripcion = d;
costo = c;
cantidad = ca;
}
public int getNumParte(){return numParte;}
public void setNumParte(int np){numParte=np;}
public String getDesc(){return descripcion;}
public void setDesc(String d){descripcion=d;}
public double getCosto(){return costo;}
public void setCosto(double c){costo=c;}
public int getCant(){return cantidad;}
public void setCant(int ca){cantidad=ca;}
public void leerProducto()
{
System.out.println("Nmero de parte: ");
numParte = s.nextInt();
System.out.println("Descripcin: ");
descripcion = s.next();
System.out.println("Costo: ");
costo = s.nextDouble();
86
System.out.println("Cantidad: ");
cantidad = s.nextInt();
}
private boolean checarRangoInvalido(String sp)
{
if(! (sp.toLowerCase().equals("d") ||
sp.toLowerCase().equals("c")||
sp.toLowerCase().equals("ca")) )
{
return true;
}
return false;
}
public void cambiar()
{
System.out.println("Qu campo (variable) deseas
cambiar");
System.out.println("Descripcin [D]");
System.out.println("Costo [C]");
System.out.println("Cantidad [Ca]");
System.out.println("Tu opcin");
String subop = s.next();
switch( subop.toLowerCase() )
{
case "d":
System.out.println("Nueva descripcin");
String d = s.next();
setDesc(d);
break;
case "c":
System.out.println("Nuevo costo");
double c = s.nextDouble();
setCosto(c);
break;
case "ca":
System.out.println("Nueva cantidad");
int ca = s.nextInt();
setCant(ca);
break;
default: System.out.println("Opcin
invlida"); break;
}
}
public String toString()
87
{
return "Producto No. parte: " + numParte +"\n"+
"Descripcin: " + descripcion +"\n"+
"costo: " + costo +"\n"+
"Cantidad: " + cantidad;
}
}
Clase Tienda:
public class Tienda extends Object
{
private Producto pros[];
private int centinela;
public Tienda(int n)
{
pros = new Producto[n];//dimensin
for (int i=0; i<n; i++)
{
pros[i] = new Producto();
}
centinela = 0;
}
public void alta()
{
if(centinela < pros.length)
{
pros[centinela].leerProducto();
centinela++;
}
else
{
System.out.println("Arreglo lleno");
}
}
public void baja(int np)
{
if ( encontrado(np) )
{
int pos = buscar(np);
for(int i = pos; i<(centinela-1); i++)
{
pros[i].setNumParte( pros[i+1].
getNumParte() );
pros[i].setDesc( pros[i+1].getDesc() );
pros[i].setCosto( pros[i+1].getCosto());
88
pros[i].setCant( pros[i+1].getCant() );
}
centinela--;
}
else
{
System.out.println("Producto no existe");
}
}
private boolean encontrado(int np)
{
for(int i=0; i<centinela; i++)
{
if (pros[i].getNumParte() == np)
return true;
}
return false;
//for(Producto p:pros)
//{
//
if(p.getNumParte() == np)
//
return true;
//}
//return false;
}
private int buscar(int np)
{
int pos=0;
for(int i=0; i<centinela; i++)
{
if(pros[i].getNumParte() == np)
{
pos = i;
break;
}
}
return pos;
}
public void consulta(int np)
{
if( encontrado(np) )
{
int pos = buscar(np);
System.out.println( pros[pos].toString() );
}
else
{
System.out.println("Producto no existe");
89
}
}
public void cambio(int np)
{
if( encontrado(np) )
{
int pos = buscar(np);
System.out.println( pros[pos].toString() );
pros[pos].cambiar();
}
else
{
System.out.println("Producto no existe");
}
}
public String toString()
{
String aux = "";
for(int i=0; i< centinela; i++)
{
aux = aux + pros[i].toString() + "\n";
}
return aux;
}
}//class
Clase AppTienda
import java.util.*;
public class AppTienda
{
public static void main(String args[])
{
Scanner s = new Scanner(System.in);
Tienda t = new Tienda(3);
int op=0;
do
{
System.out.println("[1] Alta");
System.out.println("[2] Baja");
System.out.println("[3] Consulta");
System.out.println("[4] Cambio");
System.out.println("[5] Listado");
System.out.println("[6] Salvar");
System.out.println("[7] Cargar");
System.out.println("[9] Salir");
90
Anexo B
Detalle de cdigo para la clase Entrada.
import java.util.*;
public class Entrada
{
public static int leerInt(String msg)
{
Scanner s = new Scanner(System.in);
int num = 0;
while(true)
{
System.out.println(msg);
String aux = s.next();
try
{
num = Integer.parseInt(aux);
break;
}
catch(NumberFormatException nfe)
{
System.out.println("Te equivocaste...");
}
}
return num;
}
public static double leerDouble(String msg)
{
Scanner s = new Scanner(System.in);
double num = 0.0;
while(true)
{
System.out.println(msg);
String aux = s.next();
try
{
num = Double.parseDouble(aux);
break;
}
catch(NumberFormatException nfe)
{
System.out.println("Te equivocaste...");
92
}
}
return num;
}
public static char leerChar(String msg)
{
Scanner s = new Scanner(System.in);
char ch;
System.out.println(msg);
String aux = s.next();
ch = aux.charAt(0);
return ch;
}
public static String leerString(String msg)
{
Scanner s = new Scanner(System.in);
System.out.println(msg);
String aux = s.next();
return aux;
}
public static boolean leerBoolean(String msg)
{
Scanner s = new Scanner(System.in);
boolean b;
System.out.println(msg);
String aux = s.next();
b = Boolean.parseBoolean(aux);
return b;
}
}
93