Bem, vamos lá. Siga o código abaixo e os comentários, bem como as imagens que estou postando.
[code]
// 1
int[][] teste = { { 1234 }, { 1234 } };
// 2
Object[] x = teste;
// 3
Object[] y = { teste };
System.out.println( teste );
System.out.println( x );
System.out.println( y );
System.out.println( x.length );
System.out.println( y.length );
System.out.println( ( ( int[] ) x[0] )[0] );
System.out.println( ( ( int[][] ) y[0] )[0][0] );[/code]
1 - São criados dois arrays de inteiros de uma posição, sendo que nessa posição - em ambos arrays - está contido o valor 1234 (primitivo). Esses dois arrays são usados para preencher um outro array, agora de duas posições, que consegue armazenar arrays de inteiros. Por fim, a variável teste, do tipo “array que armazena array de inteiros” recebe o valor da referência à esse array criado por último. Veja a imagem 1.
2 - Atribui-se à variável x (do tipo array de Object), o endereço que a variável teste armazena. Mas ai você pergunta. teste é um array “multimensional”, enquanto x é um array unidimensional, pq não dá problema? Na verdade, não existem arrays multidimensionais. Um array que parece multidimensional, na verdade é um array normal, que armazena em suas posições outros arrays. Então, não há problema algum em atribuir t[][] à z[], pois o que z[] vai receber é o endereço de t[]. Analise a saída do código que passei e veja a imagem 2.
3 - Cria-se um array do tipo Object, de uma posição, onde o valor dessa posição pode ser um object. Como arrays são objetos (mesmo se forem arrays de primitivos), a posição 0 do array criado aponta para o valor de teste. O endereço desse array criado é atribuido à variável y. Veja a imagem 3 abaixo.
Sabendo disso, analise o seguinte. O que “Object[][] z” pode armazenar? “Object[][] z” pode armazenar uma referência para um array de arrays de Object. teste é do tipo array de arrays de inteiros certo? O problema é que int é um primitivo, enquanto Object não é. Por isso a incompatibilidade de tipos. Se você tentar algo igual ao código abaixo, você vai ver que vai funcionar, pois String é um Object.
[code]int[][] teste = { { 1234 }, { 1234 } };
String[][] teste2 = { { “b” }, { “c” } };
Object[] x = teste;
Object[] y = { teste };
Object[][] z = teste2;
System.out.println( teste );
System.out.println( teste2 );
System.out.println( x );
System.out.println( y );
System.out.println( z );
System.out.println( x.length );
System.out.println( y.length );
System.out.println( z.length );
System.out.println( ( ( int[] ) x[0] )[0] );
System.out.println( ( ( int[][] ) y[0] )[0][0] );
System.out.println( z[0][0] );[/code]
Note que coloquei tantos os objetos quanto as referências no mesmo “local” nos diagramas e que tratei os inteiros como objetos, mas na verdade não é assim. Fiz dessa forma visando a simplicidade. Se alguém quiser contribuir com mais detalhes, fiquem à vontade. 
[]´s


