Beruflich Dokumente
Kultur Dokumente
Colecciones de Objetos
y Fachadas en Java
Casting en Objetos
¾ Hay circunstancias en las cuales se tiene una referencia correspondiente a
una cierta clase base, pero se sabe que en realidad está referenciando a un
objeto de una clase derivada.
Vehiculo ve = new Auto (“Corsa”,“AAA 403”,15000,“Nafta”,5);
¾ En el contexto anterior, podríamos querer invocar a un método específico de
la clase derivada. Para el ejemplo anterior haríamos así:
String tipoMotor = ve.getTipoMotor();
¾ La asignación anterior es incorrecta pues desde el punto de vista del
compilador ve es un Vehiculo, no un Auto. Por lo tanto no posee un
método getTipoMotor(), el cual es específico de la Clase Auto. Este
problema puede resolverse mediante un casting:
String tipoMotor = ((Auto) ve).getTipoMotor();
// Le indico al compilador que en tiempo de ejecución,
// ve es en realidad un Auto.
Tema 3 - Material exclusivo prog.III - 3
INET
Casting e instanceof
¾ A su vez, los arreglos en Java son objetos en sí mismos, sin importar que
sus celdas contengan otros objetos o valores de tipos primitivos. Al ser
objetos, cuando los declaramos no hacemos más que declarar una
referencia , para la cual luego se asignará memoria en forma dinámica.
Creación y manipulación
¾ Los arreglos en Java se declaran de la siguiente manera:
tipoCelda nombreArreglo [];
¾ nombreArreglo es simplemente una referencia. El tamaño del arreglo
aún no ha sido determinado. Ello puede hacerse de dos formas:
• mediante el uso de la palabra reservada new.
• mediante el uso de llaves en la propia declaración
Ejemplo:
int tam = (int) (Math.random() * 10);
double miArreglo [] = new double [tam];
int otroArreglo [] = {9, 17, 5, 10, 0};
¾ Los arreglos en Java se indizan desde 0 hasta (tamaño - 1) y una vez
creados se accede a sus celdas usando la misma sintaxis que en C++. Si
no son inicializados explícitamente, sus celdas se cargan con valores nulos.
Tema 3 - Material exclusivo prog.III - 6
INET
Arreglos en Java
Arreglos de Objetos
¾ Se declaran y se crean de igual forma que los arreglos de tipos primitivos.
Sin embargo, la creación de un arreglo de Objetos no construye los objetos
a almacenar en el mismo. Sólo asigna en sus celdas referencias a null.
Ejemplo: String miArreglo [] = new String[3];
0 1 2
miArreglo
Arreglos polimórficos
¾ Son arreglos cuyas celdas contienen referencias correspondientes a una
determinada clase base. Al instanciar cada celda, se la puede crear como un
objeto de la clase base (si la misma es instanciable) o como un objeto de
cualquier clase derivada. Luego se puede recorrer el arreglo e invocar algún
método polimórfico sobre los Objetos almacenados en el mismo.
Ejemplo:
Vehiculo arre [] = new Vehiculo[3] ;
arre[0] = new Auto (“Corsa”,“AAA 403”,15000,“Nafta”,5);
arre[1] = new Camion (“Scania”,“SAP 3047”,25000,550,320.5);
arre[2] = new ConRemolque (“Scania”,“HQ 312”,35000,550,
320.5,750) ;
int max = arre[0].cantidadRuedas();
for (int i=1; i<arre.length; i++)
if (arre[i].cantidadRuedas() > max)
max = arre[i].cantidadRuedas();
Tema 3 - Material exclusivo prog.III - 9
INET
Arreglos en Java
Runtime Exceptions
¾ Consideremos el siguiente ejemplo:
public class PruebaExcepciones
{
public static void main (String [] args)
{
String arre[] = {“Uno”, “Dos”, “Tres”};
for (int i=0; i<20; i++)
System.out.println(arre[i]);
}
}
¾ Por lo tanto, Java nos permite “redireccionar” una Excepción hacia el método
superior. Es decir, el que invoca al método dentro del cual la Excepción es
lanzada.
Exception
…
RuntimeException SQLException AWTException IOException
… …
ArithmeticException NullPointerException FileNotFoundException
• Las claves utilizadas deben ser objetos que implementen los métodos
hashCode() y equals() apropiadamente. Estos métodos están
originalmente definidos en la clase Object y existen clases predefinidas
que los sobre-escriben (Por ejemplo, la clase String).
¾ int size()
// retorna la cantidad de objetos almacenados en la colección (las
// posiciones dentro de la secuencia se numeran a partir de cero).
Iteradores
¾ Para recorrer todos los elementos de una Secuencia, podemos hacerlo
fácilmente utilizando for, dado que los elementos se ubican linealmente.
¾ De hecho, desde java 1.5 se introdujo una variante al for tradicional que
permite iterar con facilidad los elementos de un array o de cualquier
secuencia.
Ejemplo:
Vehiculo arre[] = new Vehiculo[3];
arre[0] = new Auto (...);
arre[1] = new Camion (...);
arre[2] = new ConRemolque (...);
for (Vehiculo elem: arre)
// equivalente a for (int i=0; i<arre.length; i++)
System.out.println (elem.getMatricula());
// equivalente a arre[i].getMatricula();
Tema 3 - Material exclusivo prog.III - 40
INET
Colecciones de Objetos
Iteradores (continuación)
¾ Sin embargo, para recorrer los elementos de una colección que guarda los
elementos en una estructura no lineal (un árbol o un hash) lo anterior no es
posible (al menos no en forma directa), dado que el almacenamiento no es
secuencial.
¾ Por esta razón es que las colecciones del paquete java.util poseen
iteradores asociados. Los iteradores son objetos que proveen métodos para
poder recorrer todos los elementos de la colección sin necesidad de conocer
la estructura interna en la cual se almacenan. Los métodos son:
public boolean hasNext()
// determina si quedan elementos por visitar en la colección.
public Object next()
// retorna el próximo elemento a visitar en la colección.
Atributos Static
Ejemplo: Presentamos una clase con un contador de la cantidad de
instancias que han sido creadas para la clase.
public class Producto
{
private long codigo;
private double precio;
private static int contador;
public Producto (long codigo, double precio)
{
this.codigo = codigo;
this.precio = precio;
contador++;
}
...
}
Tema 3 - Material exclusivo prog.III - 47
INET
Static
codigo codigo
contador prod2
prod1 1573 8832
2
220.50 562.75
precio precio
Tema 3 - Material exclusivo prog.III - 48
INET
Static
Métodos Static
Ejemplo: Le agregamos un método estático a la clase Producto
public class Producto
{
private long codigo;
private double precio; ¿ Puedo acceder a un
private static int contador; atributo static desde
... un método común ?