En cuanto a mis dudas:
teclado.close();
Por lo que puedo inferir, supongo que eso hace que la entrada de datos se detenga o cierre, pero, ¿qué hace realmente?, ¿es recomendable usarlo?
Pues hace precisamente lo que dices, cerrar el inputStream, o sea la entrada de datos.
Cuando instanciamos un objeto Scanner por primera vez en el programa, se abre un flujo por el que recibir datos.
No cerrarlo, implica que el flujo queda abierto, malgastando memoria.
En programas sencillos como estos, la verdad es que da igual cerrarlo o no. Cuando nuestro programa termina ya se encarga la máquina virtual de Java de "limpiar" los restos que haya podido dejar nuestro programa.
En programas más complejos, programas que se ejecutan las 24 horas del día, donde un subprograma llama a otro subprograma..., sí puede ser un problema ir dejando recursos abiertos consumiendo memoria.
Yo siempre lo cierro, más que nada, porque si lo dejo abierto mi IDE (uso Eclipse) me lanza un warning, un aviso, de "fuga de recursos".
El programa funciona igual, pero me molesta que marque mi programa con un signo de admiración amarillo a modo de advertencia je je.
Y acerca de las arrays bidimensionales, me compliqué un poco en cuanto a esto, esto es un tanto específico, pero, ¿hay manera de remplazar valores en un solo bloque? Es decir:
intArray[0 (solo quiero rellenar este)][0] = 14;
Pienso que estaría remplazando el otro valor con el índice 0.
Mmhh, creo que aún no tienes claro en que consiste una matriz. O yo no he entendido bien tu duda.
Aunque usemos dos indices para una matriz, no significa que estemos apuntando a dos bloques o elementos distintos.
Estamos apuntando solo a uno, pero es que necesitamos los dos índices.
Podemos hacer una analogía con una calle con casas.
Un array de una dimensión, es una calle con casas unifamilares.
Para enviar una carta a una de estas casas, solo necesitamos el nombre de la calle (nombre del array) y el número del inmueble (indice que apunta al elemento)
Es decir, un nombre y un número.
Una matriz en cambio, sería una calle con edificios de varias plantas.
Para enviar una carta, también necesitamos nombre de la calle y número del inmueble.
Pero además necesitamos otro número, el número de piso ya que cada inmueble tiene varias viviendas distintas.
O sea que en este caso, un nombre y dos números.
Un array de una dimensión, también llamado vector o arreglo, ya sabes que es una estructura que contiene varios elementos.
Es como tener muchas variables diferentes, pero asociadas bajo un mismo nombre y usamos un índice, un valor numérico, para apuntar a una de estas variables asociadas en concreto.
Entonces, si un array es un conjunto de variables asociadas..., una matriz es un conjunto de arrays asociados.
Es decir, una matriz de 7x24 en realidad es un array, que contiene otros 7 arrays asociados bajo un mismo nombre. Cada uno de estos arrays asociados contiene 24 elementos .
Para acceder a un elemento de la matriz, necesitamos dos indices. El primer indice es para indicar a cuál array asociado queremos apuntar. El segundo indice concreta a que elemento, de ese array, queremos acceder.
Si yo digo:
agenda[0][2] = "Lavar Coche";
Estoy modificando el tercer elemento (posición 2), del primer array(posición 0), de los que contiene la matriz.
Así que en una matriz, para modificar un elemento concreto, siempre vamos a usar dos indices.
Sin embargo, aunque es menos habitual, en una matriz podemos usar también solo un índice. Pero en este caso estaríamos apuntando a uno de sus arrays al completo.
Si yo intento esto, siendo
agenda una matriz:
agenda[0] = "Lavar coche";
El compilador dará un error.
Porque estoy diciendo que asigne al primer array (posición 0) un único valor String. Y esto no tiene sentido, a no ser que le específique con un segundo índice en que elemento del primer array quiero ponerlo.
Pero, si hago esto:
agenda[0] = new String[] {"Lavar Coche", "Sin planes", "Cita Médico", "Bañar Perro", "Sin planes", "Sin planes", "Estudiar Algebra"};
Sí es válido.
Estoy diciendo que al primer array de los que contiene la matriz, le asignemos un nuevo array, ya con todos los valores necesarios para construir dicho array.
Quizás esto último sirva para entender mejor que una matriz, es en realidad un array que contiene otros arrays.
Por eso a las matrices también se les llama "arrays bidimensionales", porque en realidad son eso, arrays.