Declaración del array
tipo_de_dato[ ][ ] nombre_del_array;
tipo_de_dato nombre_del_array[ ][ ];
Ejemplo declaración array de enteros (int).
1
2
int[][] numeros;   
int numeros[][];

Creación del array. Hay que indicar el tamaño de todas las dimensiones del array. Declaración y creación se puede hacer en una única línea.
1
2
3
4
5
6
numeros = new int[5][10];  
int[][] numeros = new int[5][10];
int[][] notas;
notas[0] = new int[5];
notas[1] = new int[7];
...

Al igual que con una dimensión, es posible inicializar los elementos del array a la vez que se crea, en cuyo caso no se utiliza new, ni se especifica el tamaño.
1
int[][] matriz={{1,2,3},{4,5},{6,7,8,9,10},{11}};
Como en este caso, un array bidimensional puede tener varias filas, y en cada fila no tiene por qué haber el mismo número de elementos o columnas.
La primer fila tiene tres elementos {1,2,3}
La segunda fila tiene dos elementos {4,5}
La tercera fila tiene cinco elementos {6,7,8,9,10}
La cuarta fila tiene un elemento {11}


Los arrays de 2 dimensiones guardan sus valores, por decirlo de alguna manera, en filas y columnas y por ello necesitaremos dos índices para acceder a cada una de sus posiciones.
1
numeros[0][3]

Para recorrer los elementos de un array bidimensional necesitamos dos bucles anidados.
1
2
3
4
5
for(int i=0;i<matriz.length;i++){
    for(int j=0;j<matriz[i].length;j++){
        System.out.print(matriz[i][j]);
    }
}

Podemos crear arrays de más de dos dimensiones. Ejemplo de array de 3 dimensiones
1
int[ ][ ][ ] matriz3D = new int[2][3][4];