Ti passo il link ad una vecchia risposta.
In breve, tramite un array puoi aggirare il "limite" imposta da Java. O anche tramite un tipo definito da te.
E qui la definizione è ancora più completa.
praticamente (se ricordo bene) i tipi di dati di base (Int, Float, Double eccetera) vengono passati per valore, mentre i tipi complessi (Array, List, Map eccetera) vengono passati per riferimento.