public TestConstrutor()
{
System.out.println("padrao");
}
public TestConstrutor(Object o)
{
System.out.println("padrao 3");
}
public TestConstrutor(String t)
{
System.out.println("padrao 2");
}
/**
* @param args
*/
public static void main( String[] args )
{
new TestConstrutor(null);
}
}
[/quote]
Bom… como nosso amigo falou, a JVM procura chamar o método mais apropriado a chamada…
Por exemplo…
Se vc tivesse feito:
ele chamaria:
seria
e para
viria
Agora, para essa chamda:
Ele tentaria encontrar o a melhor situação…
que pra ele eh a chamada do método que recebe uma String como padrão…
Chamar o método que não recebe parâmetros ?? Acredito que não, porque vc esta passando um parâmetro… mesmo que ele seja um null (explícito)
Bom, se formos analisar, ele não chamaria o Object, porque null não eh um objeto e sim um valor… apesar de um valor nulo…
Chamar o método que recebe uma String parece ser o mais coerente… pois podemos comparar String’s com valores nulos… o que no meu ver não eh o mesmo com objetos… pois não vemos se uma variável objeto esta valendo null… e sim se ela esta apontando para null… tem uma diferença ai…
Ou a JVM não pensaou em nada disso e foi fazendo um
if… else if… else…
e como o método om String eh o último, acabou sendo ele… :lol:
[quote=PadrE]Chamar o método que recebe uma String parece ser o mais coerente… pois podemos comparar String’s com valores nulos… o que no meu ver não eh o mesmo com objetos… pois não vemos se uma variável objeto esta valendo null… e sim se ela esta apontando para null… tem uma diferença ai…
Ou a JVM não pensaou em nada disso e foi fazendo um
if… else if… else…
[/quote]
Não é exatamente assim.
A VM invoca realmente o método que for mais específico/menos abrangente.
Seria como você declarar dois métodos:
Você pode atribuir null a um parâmetro do tipo Object ou do tipo String. Só que String é mais específico que Object, porque String é uma subclasse de Object.
Se seu exercício tivesse os tipos “Object”, “Number”, “Integer” seria mais fácil de perceber - iria bater com “Integer”, porque Integer é uma subclasse de Number, que é uma subclasse de Object.
você só não pode deixar de lembrar, que se existirem dois ou mais construtores com argumentos de classe que tem o mesmo nível de hierarquia (nem mais nem menos específico), e você chamar a classe passando “null” dará erro de compilação, como por exemplo:
Repare que a classe tem 4 construtores, um sem argumentos, outro com a classe Object e os outros dois com argumentos de classe no mesmo nível de hierarquia:
você só não pode deixar de lembrar, que se existirem dois ou mais construtores com argumentos de classe que tem o mesmo nível de hierarquia (nem mais nem menos específico), e você chamar a classe passando “null” dará erro de compilação, como por exemplo:
Repare que a classe tem 4 construtores, um sem argumentos, outro com a classe Object e os outros dois com argumentos de classe no mesmo nível de hierarquia:
Neste caso, dará erro de compilação, porque você está passando “null” e a sua classe tem dois construtores mais específicos.[/quote]
Perfeito… tanto que a opção por mim escolhida foi “erro de ocmpilação” no teste.
Mas entendi perfeitamente o porque da JVM escolher o construtor com String, no caso por eu citado…
Valeu galera… uma questão a mais para matar na prova