Questão!

17 respostas
LN2EE

Qual construtor sera executado ? e pq ?

  1. public class PowerSupply
  2. {
  3. public PowerSupply(String voltage){
    
  4. System.out.println ("PowerSupply(String) executed");
    
  5. }
    
  6. public PowerSupply(Object voltage){
    
  7. System.out.println ("PowerSupply(Object) executed");
    
  8. }
    
  9. public PowerSupply(){
    
  10. System.out.println ("No argument constructor execute");
    
  11. }
    
  12. public static void main(String[] args) {
    
  13. PowerSupply ps = new PowerSupply(null);
    
  14. }
    
  15. }

[]´s

17 Respostas

raphael_nasci

acho q vai executar o

public PowerSupply(String voltage){

System.out.println (PowerSupply(String) executed);

}

Pois é o mais específico.

danieldestro

Isso não compila.
Você precisaria fazer algo do tipo:

new PowerSupply( (Object) null );

ou

new PowerSupply( (String) null );
raphael_nasci

Ops podes crer, tem razão Daniel.

TedLoprao

Compila sim, pois a String extends o Object, logo é a versão mais específica e roda o construtor que recebe a String…

O problema ocorreria se tivesse um construtor com Integer, por exemplo… Aí seria necessário informar qual o construtor através do cast!

Fallow

danieldestro

TedLoprao, tenta compilar ai.
E não entendí sua explicação.

String extends Object
Integer TAMBÉM extends Object.

Passando o valor null para o construtor (ou outro método), o compilador não consegue identificar qual das sobrecargas deve ser chamada corretamente e ele não pode se basear em achismos.

Agora, se o caso fosse:

new PowerSupply( “algo” );

Aí sim teria uma discussão.

ps: neste caso é chamado o construtor que recebe String.

T

danieldestro:
TedLoprao, tenta compilar ai.
E não entendí sua explicação.

String extends Object
Integer TAMBÉM extends Object.

Passando o valor null para o construtor (ou outro método), o compilador não consegue identificar qual das sobrecargas deve ser chamada corretamente e ele não pode se basear em achismos.

Agora, se o caso fosse:

new PowerSupply( “algo” );

Aí sim teria uma discussão.

ps: neste caso é chamado o construtor que recebe String.

O compilador SABE sim que sobrecarga chamar e a resposta é o construtor que recebe um string!

Como o TedLoprao falou, o tipo String extende Object, então, na passagem do null para o construtor, é chamado o construtor que recebe o tipo mais específico.

O que o TedLoprao quis dizer foi em relação a TROCAR o argumento Object do segundo construtor por um tipo, por exemplo, Integer! Aí sim…a coisa ficaria ambígua e NÃO compilaria!

[]'s Tjmm.

jordy

Aqui compilou beleza e executou o construtor que recebe String.

andre_a_s

Eu compilei aqui e rodou o de String

danieldestro

OK, errei porque me baseei numa experiência passada com métodos que recebiam tipos diferentes (i.e. um String e outro Integer).

TedLoprao

Foi isso q eu quiz dizer, se vc tivesse dois construtores, um com String e um com Integer, ele precisaria do cast!!

Fallow

Java_Vinicius_Machin

Pq se fosse um construtor que recebe um Integer como argumento e outro construtor que recebe uma String (todas variáveis de referencia claro) haveria confusão ?

java.lang.Object
java.lang.Number
java.lang.Integer

java.lang.Object
java.lang.String

TedLoprao

Pq se vc passasse o null para o construtor ele não teria como saber se vc queria executar o de Integer ou o de String, e como os dois não fazem parte, vamos dizer, da mesma “cadeia” na hierarquia, um não é mais específico q o outro…

Agora se vc tivesse por exemplo um construtor com Integer e um com Number, e passasse o null por parâmetro, o chamado seria o Integer pois ele é mais específico…

O mesmo vale para primitivos, por exemplo, se os construtores fossem de double e float e vc passasse um int ou um long, o construtor chamado seria o de float…

Ah, antes q eu me esqueça, isso é válido para métodos tbm, e não apenas para construtores!!

Espero ter ajudado (apesar da dificuldade de expressão, heheh)

Fallow

Fabricio_Cozer_Marti

compilou numa boa aqui...

agora se ....
public class Construtores  {
  public Construtores(long p) {
    System.out.println(p+"long");
  }

  public Construtores(int p) {
    System.out.println(p+"int");
  }

  public Construtores(double p) {
    System.out.println(p+"double");
  }

  public Construtores(float p) {
    System.out.println(p+"float");
  }

  public static void main(String[] args) {  
    Construtores app = new Construtores(8.9);
  }
  
}

vai imprimir o do double, se eu colocar um f no final imprimirá o float....

se eu mudar de Construtores app = new Construtores(8.9);
para Construtores app = new Construtores(89);

imprime o int ...

Então pelo que entendi , se existe algum construtor que possa causar ambiguidade nas chamadas, será executado aquele q for default dos valores para tipos primitivos ... no caso o int e double (apenas para pontos flutuantes) ... e para objetos .. aquele que for o mais especifico na sua hierarquia,

interessante isso :)

TedLoprao
Certo, Fabrício, mas o q eu quis dizer dos primitivos não foi esse exemplo q vc apresentou... O exemplo que eu quis dizer foi o seguinte:
public class Construtores  {
  public Construtores(double p) {
    System.out.println(p+"double");
  }

  public Construtores(float p) {
    System.out.println(p+"float");
  }

  public static void main(String[] args) {  
    Construtores app = new Construtores(89);
  }
  
}

Nesse caso vai utilizar o construtor do float pois é o mais específico... se no lugar do 89 fosse usado 89L tbm utilizaria o float.
Agora, se vc passar 8.9, será chamado o double, pois 8.9 é um double...

Foi isso q eu quis dizer no meu post anterior...

Fallow

A

É o primeiro!

public PowerSupply(String voltage){ 
	System.out.println ("PowerSupply(String) executed"); 
           }

Geralmente eu coloco um System.out.println () para identificar o construtor e tiro a dúvida

LN2EE

como imaginei a questão gerou uma discussão bem legal ! :smiley:
[]´s

danieldestro

Vou colocar esse tipo de pergunta na aula de hoje a noite.

Criado 15 de fevereiro de 2005
Ultima resposta 16 de fev. de 2005
Respostas 17
Participantes 10