Dúvida com essa Questão

24 respostas
ricardo13

olá Pessoal,

Esta fazendo um Mock’s ontem e deparei com a seguinte Questão

public class test {
    public static void main(String[] args) {
       new test();
    }

    test() {
       test(2);
    }

    test(int z) {
       System.out.println(z);
    }
}

Eu fui seco achando q a resposta era printar o resultado 2 … pois a resposta certa é não compila
Abri o netbeans pra ver c era verdade… e realmente naum compilou…dando “cannot find symbol”

Mas como isso ???
Juro q naum entendi nada…como ele naum encontra ??? pq naum compila ???

Esclareçam essa dúvida pra mim

Obrigado

Ricardo

24 Respostas

S

putz não entendi nada. Tenta instanciar a sobrecarga depois do test() (heeeim?!)… :

public class test {   
    public static void main(String[] args) {   
       //new test();
test teste = new test();   
    }   
  
    test() {   
test testeint = new text(int num=2);
       //test(2);   
    }   
  
    test(int z) {   
       System.out.println(z);   
    }   
}
g4j

Esse trecho:

test() {  
        test(2);  
     }

tem que ser assim:

test() {  
        this(2);  //chamada para o construtor sobrecarregado com parametro int
     }
ricardo13

obrigado ao pessoal pela respostas,

Mas o nome do construtor ja naum daria certo ???

pq this(2); ??? o test(2); naum seria o mesmo resultado ??

Muito Obrigado

Ricardo

g4j

Não não…

Dentro do construtor o objeto ainda não está criado

vc poderia ter feito algo assim:

test() {
           new test(2);
        }

Algo totalmente sem sentido, mas compila. Você estaria criando um novo objeto test dentro do contrutor da propria classe test :shock:

ricardo13

olá g4j,

Mais uma vez obrigado por esclarecer minha dúvida…é…tem razão … o objeto naum foi criado ainda…o correto era usar o this

Obrigado…vou estudar isso…daki uns meses vou fazer a prova SCJP

Ricardo

michelantunes

O construtor é um método que é acessado quando instanciamos um objeto.
Para usar outro construtor dentro de qualquer outro, você deve usar a sobrecarga com o this que referencia a classe e obviamente o seu(s) respectivo(s) construtores.
Isso existe porque você não pode ter dois construtores com a mesma assinatura.
Esse é o padrão.

Abs,

Giulliano

pra vc estudar mais um pouquinho sobre os construtores…tente acertar a saída desse programa:

public class Teste{

    
    Teste(){
	super();
	System.out.println("construtor padrão");
    }

    Teste(Integer um){
	this();
	System.out.println("construtor com um argumento");
    }
    
    Teste(Integer um,Integer dois){
	this(um);
	System.out.println("construtor com dois argumentos");
    }
    
    public static void main(String[] args) {
	new Teste(1,2);
    }
}
ricardo13

olá pra galera,

Obrigado pelo monte de ajuda e até um teste…kkkkkkkkk

bom…pelo oq eu estudei até agora…e meu cerébro compilador permite executar é

Output:

construtor padrão
construtor com argumento
construtor com dois argumentos

ta certo ??

Ricardo

Giulliano

sim senhor…está correto. Construtores dá uma certa dor de cabeça se não prestar atenção…estude as possíveis maneiras de construir um objeto sem erros…

public class Teste{

    
      Teste(Integer um){
	this();
	System.out.println("construtor com um argumento");
    }
    
    Teste(Integer um,Integer dois){
	this(um);
	System.out.println("construtor com dois argumentos");
    }
    
    public static void main(String[] args) {
	new Teste(1,2);
    }
}

Se alterarmos já não funciona mais…

ricardo13

olá,

ah sim…naum tem o construtor sem argumentos dai daria erro de compilação…a se as questões da prova fosse desse nível

eu axo q me daria bem…eu axo !!!

kkkkkkkkkkkkk

um abraço e parabens à comunidade …prontificou a me ajudar em poucos minutos

Abraço e t+

Ricardo

ivandasilva

Aí pessoal, o burrico da turma aqui não entendeu :oops: , alguém poderia me explicar…
Para mim o resultado seria: construtor padrão.

Desde já, muito obrigado !

ricardo13

olá cara,

Se for assim eu tb sou, pq eu naum sabia.

Mas é o seguinte … naum pode chamar um construtor de dentro de outro construtor com o nome da classe …vc só pode através da palavra-chave this().

é isso…

Relebrando: Nunca chame um método construtor de dentro de outro construtor somente pelo nome…só referencia com a palavra this.

QQ dúvida é só postar

Ricardo

Rodrigo_de_Mello

Ola pessoal, bom dia!

Tenho uma dúvida quanto a chamada do super no código abaixo, não esta errado?, ou seja, quando utilizo o super estou invocando a construtor da minha classe pai, correto?

public class Teste{   
  
       
    Teste(){   
    super();   
    System.out.println("construtor padrão");   
    }   
  
    Teste(Integer um){   
    this();   
    System.out.println("construtor com um argumento");   
    }   
       
    Teste(Integer um,Integer dois){   
    this(um);   
    System.out.println("construtor com dois argumentos");   
    }   
       
    public static void main(String[] args) {   
    new Teste(1,2);   
    }   
}

Agradeço as explicações, obrigado!

ricardo13

olá Rodrigo,

sim…a chamada super() está relacionado a classe PAI.

Ali no código ele vai chamar o PAI da classe Teste … q é a classe OBJECT …

ali simplesmente ta explicito a chamada super() … caso ele naum colocasse o compilador insere para vc implicitamente.
Debaixo de todo método construtor, caso vc naum coloke, o compilador coloca o super() pra vc.

Lembrando que se colocar super() naum pode colocar this() ou vice-versa.

Ricardo

ivandasilva

ricardo13, esta parte eu entendi, o que eu não entendi foi a resposta da questão que o Giulliano passou…

Muito obrigado !!

ricardo13

olá,

mas qual dos exemplos … o 1º ou o 2º ???

Ricardo

ivandasilva

Segue abaixo:

public class Teste{

    
    Teste(){
	super();
	System.out.println("construtor padrão");
    }

    Teste(Integer um){
	this();
	System.out.println("construtor com um argumento");
    }
    
    Teste(Integer um,Integer dois){
	this(um);
	System.out.println("construtor com dois argumentos");
    }
    
    public static void main(String[] args) {
	new Teste(1,2);
    }
}
ricardo13

olá

A sequencia da execução do programa é dado na frente de cada linha de código:

public class Teste{

Teste(){   
super();                                                                            //4 -> como o pai de Teste é a classe Object  
System.out.println("construtor padrão");                              //5
}   

Teste(Integer um){   
this();                                                                               //3
System.out.println("construtor com um argumento");            //6
}   
   
Teste(Integer um,Integer dois){   
this(um);                                                                           //2
System.out.println("construtor com dois argumentos");         //7
}   
   
public static void main(String[] args) {   
new Teste(1,2);                                                                  //1
}

}

Entendeu ??? qq coisa é só postar

Ricardo

Rodrigo_de_Mello

Ah sim. Legal.

Vlw Ricardo!!! Obrigado pela explicação.

Abs,

ricardo13

olá,

q isso…precisar estamos ae

Ricardo

ivandasilva

Velho, agora eu entendi…

Muitíssimo obrigado !!  :lol:
peerless

Que mock eh esse, Test Killer?

rodrigo.ferreira

Exatamente… cada construtor precisa chamar o construtor da sua super classe, até chegar na classe Object (aonde a herança acaba). Se isso não acontecer (você pode testar tentando chamar um construtor e outro, recursivamente), haverá um erro em tempo de exeução (StackOverflowError), pois o restante do código do construtor filho não será executado até que todos os seus super-construtores tenham terminado sua execução.

Até.

ricardo13

olá,

Respondendo ao peerless, eu achei essa questão no Inquisition.

Quando errei essa questão eu logo fui atrás do erro.

T+

Ricardo

Criado 3 de setembro de 2008
Ultima resposta 10 de out. de 2008
Respostas 24
Participantes 9