[Resolvido]SobreCarga(Overloading)

Bom dia Pessoal,

Recentemente surgiu uma duvida sobre SobreCarga/Overloading.
Analisamos o código a seguir

/*Exemplo em código
Podemos citar como exemplo uma função f aplicada aos parâmetros reais a e b, onde, dependendo dos tipos dos parâmetros, podemos ter a execução da primeira ou da segunda função, caracterizando o polimorfismo ad-hoc de overloading.*/

public class Aritmetica{
        public static int f (int x, int y) {
                return x+y;
        }
        public static double f (double x, double y) {
                return x*x + y*y;
        }
}
 
class Testa{
        public static void main(String[] args){
                double a=1.2;
                double b=3.5;
 
                System.out.println(Aritmetica.f(a,b));
                // Resulta 13.9 que é igual a
                // 1.2 * 1.2 + 3.5 * 3.5
        }
}
//Fonte http://pt.wikipedia.org/wiki/Java_%28linguagem_de_programa%C3%A7%C3%A3o%29

Então teremos usado a função número dois ou a função no caso de minhas variaveis ser double, correto?

 public static double f (double x, double y) {
                return x*x + y*y;
        }

Na verdade o que acontecerá ser minha variavel for um float por exemplo?
Não cheguei a fazer o teste na prática por que minha duvida é a seguinte como a JVM trata a informação para retornar a função correta, isso identificando a função de sobrecarga correta.

neste caso, se vc colocar float irá funcionar pelo fato que o double é mais abrangente que o float

por exemplo

isso vai funcionar, estou passando 1 float e 2 float resultado 5.0

System.out.println(Aritmetica.f(1f, 2f));

Oi!

É essa a idéia do valueOf da String.
Você simplesmente passa um objeto, int, double e ela faz a conversão para você. A JVM se encarrega desse trabalho.

[quote=fdcarli]neste caso, se vc colocar float irá funcionar pelo fato que o double é mais abrangente que o float

por exemplo

isso vai funcionar, estou passando 1 float e 2 float resultado 5.0

System.out.println(Aritmetica.f(1f, 2f)); [/quote]

Correto, isso eu entendi.

Como:

[quote=nel]Oi!

É essa a idéia do valueOf da String.
Você simplesmente passa um objeto, int, double e ela faz a conversão para você. A JVM se encarrega desse trabalho.
[/quote]

Disse, a JVM irá fazer a conversão correto.
Mais minha duvida é a seguinte a máquina virtual interpreta essa situação como?
Em qual situação posso utilizar essa sobrecarga de metodos?

Por exemplo poderia criar 2 metodos para melhor leitura e facilidade na escolha dos programadores seguintes.

Aritmetica.double(double x, double y)
Atimetica.int(int x, int y)

Oi!

O quando você deve utilizar sobrecarga é decisão exlusiva do programador.
Vai da sua interpretação se um método precisa sofrer sobrecarga ou não.

Eu usei sobrecarga para transformação de um arquivo XML para um Document, por exemplo.
O método aceitava como entrada: byte[], InputStream, File (não me recordo se haviam outros).

Dessa forma, eu não obrigava que quem quisesse utilizar o método sempre usasse byte[], por exemplo.
A soma pode ser uma forma de se fazer isso, algo como:

public double soma(double x, double y); public double soma(String x, String y);

Entende?
Abraços.

Ah sim.

Boa definição Nel.

As vezes podemos usar para definir um tipo auto de metodo, em que o usuário pode utilizar varias entradas.
Se minha interpretação foi correta.

Oi!

Só um detalhe, não é aceito mesmo nome de método com retornos distintos:

public void soma(double x, double y);
public double soma(double x, double y);

São os tipos de argumentos que devem ser alterados e não somente o tipo de retorno, ok? :smiley:
Consulte: http://download.oracle.com/javase/tutorial/java/javaOO/methods.html

Essa frase diz tudo:

[quote=mateuscs]Ah sim.

Boa definição Nel.

As vezes podemos usar para definir um tipo auto de metodo, em que o usuário pode utilizar varias entradas.
Se minha interpretação foi correta.[/quote]

Sim.
Por isso a String disponibiliza o valueOf para n tipos de objetos e primitivos, justamente para facilitar a vida do programador.

nel,

Boa citação, importante ressaltar isso também, porque além dos compiladores indicarem esse erro, é comum fazer.

Obrigado pelas respostas.