Pergunta sobrecarga de metodos

O que acontece quando compila e executa esse codigo ? e explique o porque da sua resposta ?

[code]class B{
public void sobrecarga(char x){
System.out.print("char ");
}

public void sobrecarga(float x){
	System.out.print("float ");
}

public void sobrecarga(double x){
	System.out.print("double ");
}

public static void main(String[] args) {
	B classB = new B();
    	                byte  b = 1;
	char  c = 'c';
	short s = 1;
	int   i = 1;
	long  l = 1;
	float f = 1.0f;
    	                double d = 1.0;

	classB.sobrecarga( b );
	classB.sobrecarga( c );
	classB.sobrecarga( s );
	classB.sobrecarga( i );
	classB.sobrecarga( l );
	classB.sobrecarga( f );
	classB.sobrecarga( d );
}

}[/code]

a saida eh respectivamente float, char, float, float, float, float e double.

Ele usa o mais restritivo. No caso de primitivos, pergunte-se (caso nao tenha um que receba o tipo passado): “Qual é o cara mais próximo que não é menor?”

Uma coisa que é curiosa é "porque byte -> float e não byte -> char?"

Se olhar o JLS, vai ver que a conversão byte->char tem dois passos: byte->int (widening) e int->char (shortening). Ou seja, essa conversão precisa ser explícita - todas as conversões "shortening" devem ser explicitadas.

Como não há nada explícito, somente podem ser usadas as conversões implícitas (widening). Neste caso:

byte -> int -> float

Isso ae thadeurc, sua resposta está certa, mas a explicação do thingol está mais clara sobre o porque quando vc passa o byte ele chama o metodo que tem a sobrecarga float.

Valeu

Aproveitando o assunto.

Porque a chamada do metodo passando um long chama o float ao invez do double ? Já que long tem 64 bits e o float tem apenas 32 ?

A conversão implícita ("widening") não preserva a precisão, apenas o intervalo de validade. (Leia a Java Language Specification)
Por exemplo, long -> float porque tanto Long.MAX_VALUE quanto Long.MIN_VALUE cabem dentro de um float. (Se fosse preservar a precisão, não poderia nem ser convertido para um double, porque iria perder alguns bits, embora bem menos que os bits de precisão que são perdidos na conversão para float).
De fato, isso é meio "desconcertante", e ainda bem que não caiu na minha prova de SCJP - acho que ia errar mesmo. (Será que tal coisa cai? Normalmente eles estão pedindo coisas mais úteis agora)

Se cai na prova ja não sei.
Eu estava lendo sobre overloading no livro da kathie para certificação java 5, ae esta falando da ordem na qual os metodos sobrecarregados podem ser chamados:

  • Primitivos
  • Objetos
  • Var-args