G.Bordel >Docencia >TAP Técnicas Actuales de Programación (curso 2010-2011)
desprotegido Intro. desprotegido Temario desprotegido Calendario desprotegido RPF desprotegido Recursos protegido Práctica protegido Gest. Alum.
tema_anterior Tema 4: Elementos relacionados con la orientación a objeto tema_siguiente
  1. Objetos y clases.
  2. Estructura de la definición de una clase.
  3. Herencia.
  4. Encapsulamiento (ámbitos de accesibilidad).
  5. El bloque static y los atributos static y final.
  6. Instanciación, inicialización y eliminación de objetos.[ejercicios]
  7. Clases y métodos abstractos.[ejercicios]
  8. Interfaces.[ejercicios]
  9. Polimorfismo.
  10. Arrays*.[ejercicios]
  11. Enumeraciones.

4.10- Arrays*

Como cualquier otro lenguaje algorítmico, Java tiene la posibilidad de manejar Arrays, es decir estructuras que almacenan de forma contigua un determinado numero de elementos del mismo tipo o clase. Nótese que en los lenguajes clásicos existe otra estructura capaz de almacenar un grupo de elementos heterogéneos (denominada "struct" en C o "record" en pascal) y que no existe en Java ya que es sustituida y ampliada con el concepto de clase.

Los arrays en Java no son elementos propios de la orientación a objeto, pero se les ha dotado de alguna característica que los asemeja puntualmente (de ahí que se encuentren en este capítulo pero se haya marcado el apartado con un asterísco).

Pueden declararse y definirse en Java arrays de cualquier tipo primitivo o clase, admitiendo una sintaxis muy similar a la de C además de una variación que pretende ser más correcta conceptualmente.


 1-
 2-
 3-
 4-


public   int       indices1[];    //array de enteros declarado con "estilo C"
public   int[]     indices2=null; //array de enteros
private  Animal    zoo1[];        //array de objetos "Animal" declarado con "estilo C"
private  Animal[]  zoo2=null;     //array de objetos "Animal"

En el ejemplo se declaran cuatro referencias para acceder a arrays. Las dos primeras son par arrays de un tipo primitivo y las dos últimas para objetos.Las primera y tercera declaraciones siguen una sintaxis identica a la del lenguaje C, donde los corchetes indican que la referencia no lo es a un solo elemento sino a un array. Las segunda y cuarta declaran dos referencias simplemente mediante unos identificadores que asociados a unos tipos que son en sí mismos arrays.

En el ejemplo anterior se han llevado a cabo sólo las declaraciones sin definir en realidad los arrays (sólo existen por el momento las referencias). En las declaraciones segunda y cuarta se ha dado un valor inicial de "referencia nula" mientras que en las otras dos ni siquiera se ha inicializado la referencia. La definición de un array en Java tiene cierta similitud con la instanciación de objetos y se realiza mediante el operador "new".


 1-
 2-


public  int[]     indices=new int[10];  //array de 10 enteros
private Animal[]  zoo=new Animal[20];   //array de 20 objetos "Animal"

Con las declaraciones enteriores disponemos ya de los arrays. En el caso de los enteros el array esta disponible para almacenar 10 valores accediendo a sus posiciones mediante su indice. Del mismo modo el array de objetos esta en disposiciónde almacenar hasta 20 objetos del tipo Animal, es decir esta compuesto de 20 referencias sin inicializar que podrán ser utilizadas para instanciar objetos. El siguiente ejemplo muestra unas asignaciones a estos arrays. Las asignaciones al array de "animales" muestra además el uso del polimorfismo ya que se instancian dos objetos de subclases de Animal.


 1-
 2-
 3-
 4-
 5-
 6- 


public   int[]     indices=new int[10];
private  Animal[]  zoo=new Animal[20];

indices[5]=7;
zoo[12]=new Pajaro();
zoo[17]=new Roedor();

Dado que los arrays se "instancian" en Java, a diferencia de otros lenguajes su tamaño puede ser determinado en tiempo de ejecución. Basta para ello declararlos sin definirlos y posteriormente hacer la instanciación dentro del bloque de sentencias en el punto que sea preciso. En el siguiente ejemplo se instancia en array de enteros en un punto del bloque de sentencias con una dimensión calculada mediante una expresión aritmética que incluye una llamada a un método.


 1-
 2-
 3-


public int[] indices;
// otras definiciones y bloque de sentencias
indices=new int[2*numParejas()];

Es tambien posible inicializar los arrays en el momento de la declaración. El siguiente ejemplo muestra la sintaxis definiendo un array de diez enteros inicializado y un array cinco de "animales" inicializado con tres referencias nulas y dos a objetos. Como puede verse, en este caso la dimension del array viene establecida por la inicialización.


 1-
 2-


public   int[]     indices={3,2,5,4,7,1,9,8,6,0};
private  Animal[]  zoo={null,null,new Pajaro(),null,new Roedor()};

Naturalmente es tambien posible definir arrays multidimensionales. Esto se consigue del mismo modo que se hace en C, es decir, considerando arrays de arrays. De este modo un array de dos dimensiones, por ejemplo, será un array de referencias a arrays unidimensionales. El siguiente ejemplo muestra algunas posibilidades: en la línea 1 se declara sin definir un array bidimensional; en la 2 se define un array bidimensional del que se "instancia" la primera dimensión con diez elementos, mientras que la segunda dimensión puede instanciarse dinámicamente (dentro del código) y diferenciadamente para cada elemento de la primera (en la línea 6 se instancia la segunda dimensión para la posición 6 de la primera); en la tercera línea se declara e "instancia" un array rectangilar de dimensión 10×3; y por último en la cuarta línea se declara y define por inicialización un array bidimensional no rectangular.


 1-
 2-
 3-
 4-
 5-
 6-
 7-


public int[][] indices1;
public int[][] indices2=new int[10][];
public int[][] indices3=new int[10][3];
public int[][] indices4={{3,2,5},{4,7},{1,9,8,6,0}};
// otras definiciones y bloque de sentencias
indices2[5]=new int[3];
indices4[2][1]=7;

Ya hemos visto una característica de los arrays que los asemeja en ciero modo a objetos: la instanciación. Hay otras de entre las cuales cabe destacar que estan dotados de un campo "interno" denominado "length" que almacena el número de elementos con que han sido instanciados (pueden estar inicializados o no). Esto permite actuar sobre el contenido del array sin necesidad de mantener información aparte sobre su dimensión. Un ejemplo importante de esta característica es el parámetro que se define en el método "main" que, como vimos en [§2.1] sirve como punto de comienzo de una aplicación. Recordemos el ejemplo inicial que veíamos en dicho tema.


 1-
 2-
 3-
 4- 
 5-
 6-
 7-
 8-
 9-


 //
 // Aplicación ejemplo "HolaMundo"
 //
 
 public class HolaMundo {
 	public static void main(String[] args) {
 		System.out.println("Hola, mundo");
 	}
 }

Ahora estamos en condiciones de comprender por completo la línea 6 que en su día dejamos de lado. Se trata de una función con acceso universal (public), no ligada a ningún objeto que -hipotéticamente- pudiera instanciarse de la clase (static), que no devuelve ningún valor (void) y que tiene un solo parámetro referenciado por args y que es de tipo array unidimensional de objetos de clase String. En realidad, no hemos estudiado aún los objetos String (se hará al hablar de la biblioteca de clases [§6.2]), pero como puede suponerse se trata de cadenas de caracteres. Nos valdremos de esta función para mostrar el uso del campo length de los arrays implementando un bloque para mostrar el conjunto de los parámetros recibidos.


 1-
 2-
 3-
 4- 
 5-
 6-
 7-
 8-
 9-
10-


 //
 // Aplicación ejemplo "EchoParameters"
 //
 
 public class EchoParameters {
 	public static void main(String[] args) {
		for (int i=0; i<args.length; i++)
 			System.out.println(args[i]);
 	}
 }

Cerramos este capítulo aclarando que, como puede observarse por el anterior ejemplo, los indices de los arrays en Java se especifican comenzando por el cero y por tanto el máximo válido es el correspondiente a la dimensión menos uno. En la instanciación, lógicamente, se indica exactamente el valor de la dimension requerida.

Siguiente punto: 4.11- Enumeraciones


Plataforma de soporte a curso y contenidos (c) German Bordel 2005.