Sobrecarga

Considerando dois métodos com o mesmo nome e tipo de retorno, apenas a mudança na ordem dos argumentos já configura sobrecarga?
Exemplo:

void teste(String a, int b);
void teste(int b, String a);

Obrigado

Sim, pois:

Os métodos sobrecarregados DEVEM alterar a lista de argumentos;
Os métodos sobrecarregados PODEM alterar o tipo de retorno;
Os métodos sobrecarregados PODEM alterar o modificador de acesso;
Os métodos sobrecarregados PODEM declarar exceções verificadas ou mais abrangentes;
Um método pode ser sobrecarregado na mesma classe ou em uma subclasse;

Fonte: http://marcosvidolin.wordpress.com/2010/03/09/regras-para-a-sobrescresita-e-sobrecarga-de-

Sim.

A sobrecarga é exatamente isso. Ter métodos com o mesmo nome mas com parâmetros diferentes, e a ordem já é uma mudança.

Vi diversas caracterizações como estas que vocês citaram, mas nenhuma delas
fala explicitamente sobre a ordem dos argumentos.

Mais uma vez Valeu.

[quote=wsch]Vi diversas caracterizações como estas que vocês citaram, mas nenhuma delas
fala explicitamente sobre a ordem dos argumentos.

Mais uma vez Valeu.[/quote]

Os métodos sobrecarregados DEVEM alterar a lista de argumentos;

Isso não ta explicito ?

É exatamente o que vc tá fazendo no seu exemplo:

void teste(String a, int b); void teste(int b, String a);

Ou seja, o código citado acima é uma sobrecarga válida.

A alteração na ordem dos argumentos, se eles tiverem tipos diferentes, é uma sobrecarga.
Se apenas os nomes forem alterados, não é uma sobrecarga.

Por exemplo,

int x (int y, int z)

e

int x (int z, int y)

não é uma sobrecarga (você só renomeou os parâmetros mas não mudou os tipos). Entretanto, tome cuidado com esse tipo de coisas, porque o Java não irá “desembaralhar” os parâmetros para você.

Uma forma de você entender por que as coisas são assim é pensar como é que o Java faz para chamar um método.

Ao chamar um método, o código que chama o método empilha os parâmetros em uma determinada ordem, para que o método os desempilhe nessa mesma ordem.
Quando se empilham os parâmetros, não se passa o nome dos parâmetros, mas é necessário especificar o tipo de cada um para que o código seja adequado para o empilhamento dos parâmetros. O método que foi chamado, por sua vez, desempilha os parâmetros adequadamente, na ordem em que foram declarados.

Em linguagens onde você pode embaralhar e omitir alguns parâmetros, desde que você especifique os tipos adequados, o compilador se vira para desembaralhar os parâmetros e passar valores padrões para indicar que você omitiu um determinado parâmetro. Uma linguagem dessas é o PL/SQL (Oracle).

[quote=wellington.nogueira]Importante lembrar que, apesar de estar escrito ali em cima que:

Isso não quer dizer que dois ou mais métodos com mesmo nome e parâmetros mas retornos diferentes sejam sobrecarga:

//Não são sobrecargas válidas public void meuMetodo() {} public String meuMetodo() {return "teste";}

//São sobrecargas válidas public void meuMetodo(int i) {} public String meuMetodo(String dado) {return dado + "teste";}

A sobrecarga NÃO verifica o tipo de retorno.
[/quote]
Mesmo por que, se você tentar compilar um código com os métodos que usou como exemplo, o compilador irá acusar erro na sintaxe, pois o mesmo nome e argumentos são utilizados para mais de um método.

Importante lembrar que, apesar de estar escrito ali em cima que:

Isso não quer dizer que dois ou mais métodos com mesmo nome e parâmetros mas retornos diferentes sejam sobrecarga:

//Não são sobrecargas válidas public void meuMetodo() {} public String meuMetodo() {return "teste";}

//São sobrecargas válidas public void meuMetodo(int i) {} public String meuMetodo(String dado) {return dado + "teste";}

A sobrecarga NÃO verifica o tipo de retorno.