"Olá amigo! Vou falar sobre sobrecarga de métodos ."

"Você pode sobrecarregá-los também?! Que dia!"

"Você pode fazer muito com eles, mas não vamos entrar nisso agora."

"É um acordo."

"A sobrecarga é uma operação muito simples. Na verdade, nem sequer é uma operação sobre métodos, embora às vezes seja chamada por um nome assustador: polimorfismo paramétrico ."

O que você deve lembrar é que todo método em uma classe deve ter um nome exclusivo.

"Sim, eu sei."

"Bem, isso não é inteiramente verdade. Quero dizer, não é de todo verdade. Um método não precisa ter um nome único. O que deve ser único é a combinação de um nome de método e os tipos de seus parâmetros . Essa combinação também é conhecido como uma assinatura de método."

Código Comentários
public void print();
public void print2();
Isso é permitido. Os dois métodos têm nomes exclusivos.
public void print();
public void print(int n);
E isso também é permitido. Os dois métodos têm nomes exclusivos (assinaturas).
public void print(int n, int n2);
public void print(int n);
Os nomes dos métodos ainda são únicos aqui.
public int print(int a);
public void print(int n);
Mas isso não é permitido. Os métodos não são únicos, mesmo que diferentes tipos estejam sendo passados.
public int print(int a, long b);
public long print(long b, int a);
Mas isso é permitido. Os parâmetros do método são exclusivos.

"Eu já vi isso em algum lugar."

"Sim. Quando você digita " System.out.println ", o IntelliJ IDEA sugere algumas dezenas de versões de métodos de impressão que usam parâmetros diferentes. O compilador simplesmente identifica e chama o método necessário com base nos tipos de parâmetros que você passa."

"Isso não é tão difícil. Mas não é polimorfismo."

"Ou, mais precisamente, não é substituição de método."

A propósito, gostaria de salientar que os nomes dos parâmetros são irrelevantes. Eles são perdidos durante a compilação. Depois que um método é cumprido, apenas seu nome e tipos de parâmetro são conhecidos.