Arreglos String Polimorfismo y Excepciones en Java

Share Embed Donate


Short Description

scrip...

Description

Módulo 4 Arreglos, String, Polimorfismo y Excepciones en Java

Programación Orientada a Objetos De las Heras, Sebastián

4.1- Arreglos y la clase Vector 4.1.1- Arreglos El objetivo que perseguiremos en esta sección será el aprendizaje de arreglos en Java. Estudiaremos qué es un arreglo y la sintaxis utilizada para declarar, crear, inicializar y manipular un arreglo. Conceptualmente, los arreglos en Java son objetos que pueden almacenar múltiples variables del mismo tipo de dato. A un arreglo también se lo suele denominar “array” por su denominación en inglés. Los arreglos pueden mantener referencias a tipos de datos primitivos o tipos de de datos por referencia (objetos), pero el arreglo propiamente dicho es siempre un objeto. Los arreglos se clasifican en:  Unidimensionales: almacenan datos indicando un solo índice debido a que están compuestos por una única dimensión. A estos tipos de arreglos se los denomina también vectores. La siguiente figura representa un arreglo unidimensional que almacena seis valores numéricos enteros: Índice Elementos

0 24

1 12

2 14

3 28

4 9

5 2

Para referenciar al primer elemento de un arreglo, se utiliza el índice cero, es decir el conteo del índice comienza en cero.  Bidimensionales: están compuestos por dos dimensiones, razón por la cual para manipularlos se deben indicar dos índices. Imaginemos que tenemos un arreglo en el cual los elementos de la primera dimensión, almacenan a su vez otros arreglos:

Dimensión 1

Dimensión 2

La figura anterior representa un arreglo bidimensional cuya primera dimensión contiene tres elementos que almacenan nuevos arreglos de cuatro elementos.

Programación Orientada a Objetos – De las Heras, Sebastián | 2

Filas

Otra representación más intuitiva es considerar que los datos de los arreglos bidimensionales se almacenan en una estructura con forma de matriz. La siguiente figura representa el mismo arreglo definido anteriormente pero para su representación se utiliza una matriz:

0 1 2

0 43 3 6

Columnas 1 2 21 7 67 34 2 56

3 25 67 87

Debido a que la primera dimensión del arreglo contiene tres elementos, entonces se puede considerar que la matriz que representa al arreglo contiene tres filas. También se puede considerar que la matriz contiene cuatro columnas debido a que la segunda dimensión del arreglo contiene cuatro elementos.  Multidimensionales: tienen más de dos dimensiones. Para manipular a este tipo de arreglo se tiene que utilizar un índice para cada una de las dimensiones que componen al arreglo. La siguiente figura representa un ejemplo de un arreglo multidimensional de tres dimensiones que almacena elementos de tipo char: -

La primera dimensión puede almacenar tres elementos. Los elementos que se almacenan son nuevos arreglos (dimensión 2).

-

Los arreglos de la segunda dimensión pueden almacenar dos elementos. Los elementos que se almacenan son nuevos arreglos (dimensión 3).

-

Los arreglos de la tercera dimensión pueden almacenar tres elementos. Se almacenan valores de tipo char. Dimensión 1

Dimensión 2

Dimensión 3

Debido a que el arreglo representado contiene tres dimensiones, entonces también se lo puede representar mediante la figura de un cubo como se muestra a continuación:

Programación Orientada a Objetos – De las Heras, Sebastián | 3

A modo de ejemplo, podemos observar que el elemento que se encuentra en la posición [0,1,1] tiene almacenado el valor “k”. Cuando indicamos la posición [0,1,1] hacemos referencia a la primera fila de la dimensión 1 (índice 0), la segunda fila de la dimensión 2 (índice 1) y la segunda fila de la dimensión 3 (índice 1). Es importante recordar que el conteo de los índices comienza en cero.

Para aprender a utilizar un arreglo, es fundamental conocer los siguientes conceptos: 

Declaración de un arreglo.



Creación de un arreglo.



Inicialización de un arreglo.

Cada uno de estos puntos tiene distintas variantes y estudiaremos las más utilizadas.

Declaración de un arreglo Un arreglo se declara indicando el tipo de dato de los elementos que el arreglo almacenará, pudiendo ser tipos de datos primitivos o tipos de datos por referencia (objeto), seguido de un par de corchetes que se pueden ubicar a la izquierda o a la derecha del identificador del arreglo. A continuación se declaran dos arreglos para ejemplificar: int []numeros; String palabras[]; El primer arreglo es un objeto cuyo identificador es “numeros” y almacena valores numéricos enteros (int). El segundo arreglo es un objeto cuyo identificador es “palabras” y almacena cadenas de caracteres de tipo String.

Programación Orientada a Objetos – De las Heras, Sebastián | 4

Los corchetes se pueden colocar indistintamente a la izquierda o a la derecha del identificador. En la declaración del primer arreglo, los corchetes se colocaron a la izquierda del identificador mientras que para el segundo arreglo se optó por colocarlos a la derecha del identificador. Si deseamos declarar un arreglo de más de una dimensión, entonces se deben colocar tantos pares de corchetes como número de dimensiones contenga el arreglo. Por ejemplo, declararemos un arreglo de tres dimensiones que contendrá objetos de tipo Persona. Persona[][][] listadoPersonas; También se lo podría haber declarado de la siguiente forma: Persona listadoPersonas[][][]; Por el momento, solamente hemos definido una variable que representa un arreglo pero no hemos creado ningún objeto. Para crear o construir un arreglo es necesario invocar al operador “new”.

Creación de un arreglo La creación de un arreglo significa invocar a su constructor para que esté disponible en memoria junto a todos los objetos creados por la Máquina Virtual Java. Para la creación de un arreglo, Java debe conocer cuánto espacio de memoria debe reservar, motivo por el cual se debe especificar el tamaño del arreglo durante la creación del mismo. El tamaño del arreglo hace referencia a la cantidad de elementos que el arreglo podrá almacenar. Hay diferentes alternativas para construir un arreglo. La formas más estandarizada es utilizando la palabra reservada “new”, seguida del tipo de dato del arreglo con un par de corchetes que indican la cantidad de elementos del arreglo. Veamos el siguiente ejemplo: int[] calificaciones;

// declaración de un arreglo // que contendrá números enteros

calificaciones = new int[3];

// Creación de un // arreglo unidimensional // de 3 elementos

También se puede declarar y crear un arreglo en una sola sentencia: int[] calificaciones = new int[3]; Para crear un arreglo de objetos también se procede de la misma manera: Alumno[] listadoAlumnos = new Alumno[3]; No hay que confundir la utilización del operador “new”. Si nos fijamos en el ejemplo anterior, cuando construimos el arreglo “listadoAlumnos” utilizando el operador “new”, no estamos invocando al constructor de la clase Alumno, no estamos creando instancias de tipo Alumno, sino que estamos construyendo o instanciando un objeto arreglo.

Programación Orientada a Objetos – De las Heras, Sebastián | 5

También es importante tener en cuenta que en la creación de un arreglo siempre se debe indicar el tamaño del mismo, de lo contrario obtendremos un error de compilación. En la siguiente línea de código, se intenta crear un arreglo sin especificar su tamaño, y por consiguiente obtenemos un error de compilación: Alumno[] listadoAlumnos = new Alumno[]; // No compila Esto se debe a que la Máquina Virtual Java necesita conocer cuánto espacio de memoria debe reservar para almacenar el arreglo. Para la construcción de arreglos de más de una dimensión, se debe seguir la misma lógica como lo muestra el ejemplo a continuación: Persona listadoPersonas[][][]; // // // //

declaración de un arreglo de 3 dimensiones de objetos de tipo Persona

listadoPersonas = new Persona[3][2][2]; En el ejemplo anterior, hemos declarado un arreglo de tipo Persona de tres dimensiones. Posteriormente hemos construido dicho arreglo e indicamos que la primera dimensión contendrá tres elementos, y la segunda y tercera dimensiones contendrán dos elementos cada una.

Inicialización de un arreglo Hasta el momento, hemos podido declarar y crear un arreglo, pero no hemos indicado el almacenamiento de algún elemento en el mismo. Los elementos que se pueden almacenar pueden ser valores primitivos u objetos mediante variables de referencia. Los elementos de un arreglo pueden ser accedidos mediante un índice que indica una posición exacta en el arreglo. Este índice es un número que comienza en cero. Si por ejemplo, tenemos un arreglo de seis elementos, los índices del arreglo comenzarán en cero y llegarán hasta el valor cinco.

Programación Orientada a Objetos – De las Heras, Sebastián | 6

Supongamos que tenemos definida la clase Persona, y declaramos un arreglo que contiene elementos de tipo Persona: Persona[] empleados = new Persona[3]; El objeto “empleados” puede almacenar elementos que representan referencias a objetos de tipo Persona, pero hasta el momento solamente tenemos tres referencias de tipo Persona pero nulas, es decir, no hemos inicializado cada uno de los elementos de tipo Persona del arreglo. La siguiente figura es una representación del arreglo “empleados” luego de haber sido declarado y creado:

Si observamos cada uno de los elementos del arreglo, todos ellos pueden almacenar objetos de tipo Persona, pero por el momento tienen referencias nulas. El próximo paso entonces, es crear objetos de tipo Persona y asignar estos objetos a las posiciones del arreglo “empleados”. Esto lo podemos realizar de la siguiente manera: empleados[0] = new Persona(“Juan”); empleados[1] = new Persona(“Lucas”); empleados[2] = new Persona(“Florencia”); De esta forma, para cada posición del arreglo “empleados”, hemos inicializado un objeto de tipo Persona.

Programación Orientada a Objetos – De las Heras, Sebastián | 7

Persona Juan

Persona Lucas

Persona Florencia

Hay que tener en cuenta que si intentamos acceder a una posición del arreglo inexistente entonces obtendremos un error en tiempo de ejecución (ArrayIndexOutOfBoundsException). Por ejemplo, si en el caso anterior intentamos inicializar la posición del índice 3 del arreglo, obtendremos un error en tiempo de ejecución. empleados[3] = new Persona(“Pedro”); El índice 3 se encuentra fuera de rango, no existe, ya que el tamaño del arreglo es tres y por consiguiente los posibles valores de los índices son 0, 1 y 2. Para inicializar un arreglo de más de una dimensión hay que aplicar la misma lógica; se debe referenciar a alguna posición específica del arreglo y asignar un objeto o valor en dicha posición. El siguiente código es un ejemplo de inicialización de un arreglo bidimensional que almacena valores boolean. boolean[][] a = new boolean[2][2]; a[0][0] = true; a[0][1] = false; a[1][0] = false; a[1][1] = true; Algo importante a tener en cuenta, es que si declaramos y construimos un arreglo de tipo primitivo, entonces sus elementos quedan inicializados con los valores por defecto correspondientes al tipo de dato del arreglo. int[] a = new int[4]; boolean[][] b = new boolean[2][3]; En el ejemplo anterior, los elementos del arreglo “a” están inicializados con el valor cero ya que este es el valor por defecto o predeterminado para el

Programación Orientada a Objetos – De las Heras, Sebastián | 8

tipo de dato int. Los elementos del arreglo “b” están inicializados con el valor “false” ya que este es el valor por defecto del tipo de dato boolean. Un arreglo también puede ser inicializado utilizando sentencias iterativas, otorgando de esta forma una alternativa más sencilla para inicializar un arreglo cuando su tamaño es grande. Supongamos que tenemos un arreglo de String de cien elementos y deseamos inicializar cada uno de ellos con una cadena de caracteres vacía “”. De acuerdo a lo que acabamos de analizar anteriormente, una de las formas de hacerlo es la siguiente: String[] s = new String[100]; s[0] = new String(“”); s[1] = new String(“”); s[2] = new String(“”); . . . s[98] = new String(“”); s[99] = new String(“”); Pero como podemos ver, esta forma de inicializar un arreglo resulta bastante tediosa si el número de elementos que contiene el arreglo es alto. Para facilitar esta tarea podemos hacer uso de las sentencias iterativas. Los arreglos tienen un atributo denominado “length” que representa el número de elementos que puede almacenar un arreglo, es decir, su tamaño. Entonces por ejemplo, en el arreglo anterior, el valor de “s.length” es igual a 100. Si hacemos uso de este atributo y de las sentencias iterativas entonces podemos inicializar el arreglo. Una de las formas más utilizadas es mediante la sentencia for: String[] s = new String[100]; for (int i=0; i
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF