Qual a diferença entre criar um (exemplo) (1º caso) int[] num; e um (2º caso) int[] num = new int[3];? no segundo caso ele está instanciando um objeto Array? por que quando vai passar um parametro do tipo array para um metodo se usa a sintaxe do primeiro caso? são só algumas duvidas que estou sobre arrays e não sei como pesquisar. Se alguem poder me ajudar, obrigado 
As variáveis tem um tipo e um identificador (nome). Logo, uma declaração de variável assume a forma:
tipo nome_var;
Com efeito: int[] num é uma variável de nome num do tipo array de inteiros.
No Java, os arrays são objetos e por isso devem ser criados usando o operador new (JCP 8, pág. 191). Logo:
tipo nome_var = new tipo_var[numero_elementos];
Portanto, em int[] num = new int[3]; se está criando um objeto de array de tamanho 3. É importante notar que não se trata de uma instanciação, já que não se utiliza de construtores, mas tão somente a reserva de memória contígua (uma seguida da outra). Nesse caso, a variável faz referência ao primeiro endereço da primeira posição na memória e as outras posições são obtidas pelo tamanho de tipo, da mesma forma como nas linguagens imperativas, como C, por exemplo. No entanto há uma diferença básica entre os arrays de uma linguagem imperativa e o Java. Os arrays Java sempre criam (automaticamente) uma variável de instância chamada length (JCP, pág. 191) que é responsável por armazenar o tamanho do array. Desta forma, quando se usa um array, como por exemplo, como um parâmetro ou um retorno de um método, basta somente indicar o endereço da primeira posição, ou seja, passar a variável que, no caso é num. A variável length é automaticamente passada junto com a variável do array.
Fonte 1: Java Como Programar 8, pág. 189 - 221.
Fonte 2: Java Tutorials - Arrays.