No exemplo que passei anteriormente, não explicitei o que matriz era. Então:
int [][] matriz;
matriz = geraMatriz();
System.out.println("Imprimindo matriz: " + matriz);
Foi isso que eu entendi que vocês estão fazendo. Alguns podem até ter tentado:
System.out.println("Imprimindo matriz " + geraMatriz() );
Isso funciona perfeitamente quando a variável a ser impressa ou o retorno do método é um tipo primitivo (como int), pois o próprio valor em questão é utilizado.
Porém, quando a variável é uma referência para um objeto, o que deve ser impresso?
Vocês podem até supor que, no caso da matriz, seria razoável imprimir todos seus elementos. Mas o que deve-se imprimir quando o objeto é, por exemplo, do tipo Pessoa:
class Pessoa
{
String nome;
int RG;
int idade;
}int RG;
int idade;
Nesse caso, talvez o nome seja o que nos interessa, mas também poderia ser o RG, ou até a idade. Viram quem não tem como o Java saber qual atributo de um objeto ele deve imprimir?
Então, quando tentamos usar:
Pessoa alguem = new Pessoa();
System.out.println("pessoa: " + alguem);
o que vemos na tela é uma cadeia de caracteres estranha.
Isso acontece porque, quando o Java tenta executar o println e vê que alguem não é de tipo primitivo, uma chamada ao método toString() do objeto é feita.
Assim como o método construtor, todos os objetos tem o toString(). Sendo que vocês podem reescreve-lo ou não.
Caso esse método não seja reescrito, por padrão, ele devolve uma string que indica o ID do objeto. É isso o que vocês viram quando tentaram imprimir a matriz.
Posto isso, é possível vizualizar duas soluções para o nosso caso, uma simples e outra um pouco mais complexa, porém mais elegante:
1- A forma simples é criar um método que imprime a matriz, como vocês já aprenderam;
2- A outra maneira seria criar uma nova classe para lidar com matrizes e criar lá dentro um método
public String toString()
Assim, o println funcionaria legal.
Espero que eu tenha esclarecido as dúvidas.
Abraço,
Vinícius