Construtores

Pessoal, estou estudando para a certificação SCJP 5. Na parte de construtores fiquei com algumas dúvidas. Tentarei fazer um breve resumo do que entendi, assim se eu cometer algum erro por favor me corrijam.
Construtores são sempre chamados na hora da instanciação de um objeto e possuem o mesmo nome de sua classe.

toda classe chama o construtor de sua super classe até chegar na classe Object, que é o topo da pilha.

Sem sobrecarga de construtores, temos 3 diferentes situações em uma classe, são elas:

a. A classe não possui construtor algum

Quando isso acontece, o compilador inclui implicitamente um construtor padrão em nosso código. A saber, o construtor padrão é aquele que não recebe argumento algum e chama sua superclasse. Exemplo:


Class Base1 {

//Sou uma classe sem construtor algum, o compilador será legal e definirá implicitamente  um 
//para mim. Ele ficará exatamente assim ó: Base1(){ super() };

}

b. A classe possui construtor padrão

Class Base1{
//Oi eu sou um construtor padrão, seu eu não fosse definido pelo programador, eu seria 
//colocado implicitamente aqui, até mais amiguinhos.
Base1(){
//super();    -    Olá, sou um código colocado implicitamente pelo compilador, eu chamo o papai Object

}
}

c. A classe possui um construtor que não é padrão

Nesse caso o compilador entre em cena novamente com seus códigos implícitos. Vejam o exemplo:

Class Base1{
Base1(String a, int b, int c){
//super();    -   Sou um código implícito 
a = "Oi";
b = 1;
c = 2;
}
}

Importante lembrar que quando definimos qualquer construtor, o compilador não irá mais colocar para nós o construtor padrão.

Agora vamos cobrir alguns detalhes quando há sobrecarga de construtores. Vejamos um exemplo:

class Base1{
String a;  int b, c;

Base1(){
super();   //Se eu não estivesse aqui implicitamente o compilador me colocaria aqui.
}

Base1(String a, int b, int c){
// super();    -   Sou um código implícito    -   Nessa parte tenho dúvida se é assim mesmo que //acontece, se eu estiver errado por favor me corrijam.
this.a = a;
this.b = b;
this.c = c
}

Base1(String a, int b){
	// super();    -   Sou um código implícito
	this.a = a;
	this.b = b;
}

}

Bem, com esse exemplo podemos relembrar alguns conceitos:
I) A classe que tiver qualquer construtor definido, que não seja o padrão, não permite que o compilador construa implicitamente o construtor padrão, para tê-lo é necessário construí-lo explicitamente também.
II) Toda classe ao ser instanciada deve invocar o construtor da classe pai, por esse motivo que todos os método possuem implicitamente o código super(), quando não há chamada a outro construtor através do this(), como veremos adiante.

Ainda em sobrecarga de construtores, definiremos o exemplo novamente, com alguns novos conceitos:

class Base1{
String a;  int b, c;

Base1(){
super();   //Se eu não estivesse aqui implicitamente o compilador me colocaria aqui.
}

Base1(String a, int b, int c){
this();
this.a = a;
this.b = b;
this.c = c
}

Base1(String a, int b){
	this(a, b, 0);
}
}

Não me lembro agora como é chamado esse conceito, creio que seja o encadeamento de construtores, mas não sei se podemos aplicar esse nome para esse efeito na classe, o que me pareceu no livro, o encadeamento de construtores é a chamada de construtor da classe pai até chegar na classe Object.

Bem, o que acontece aqui então é que o construtor com 2 parâmetros invoca o construtor com 3 parâmetros, passando para ele os 2 parâmetros recebido mais um valor defautl, que no nosso exemplo é 0 (zero). Então no construtor de 3 parâmetros, ao receber, na primeira linha, como notamos, irá chamar o construtor padrão, que irá chamar a classe pai, e então ativar o encadeamento de construtores. Após isso, então será atribuído as variáveis da classe os valores recebido.

Regras para construtores em classe estendida. Vejamos o código para estudá-lo:


class Base1 {
	//Base1(){ super(); }    -   constructor implícito
}

class Base2 extends Base1{
	Base2(String a){
//super();   -   Código implícito, que chamará o construtor implícito em base1, não haverão //problemas
}
}

Esse código rodaria perfeitamente, pois a classe Base2 invoca o construtor padrão de Base1, que esta definido implicitamente pelo compilador.
Agora imagine a seguinte situação:


class Base1 {
	Base1(String a){
}
}

class Base2 extends Base1{
	Base2(String a){
		//super();   -   Código implícito;
}
}

Faço a pergunta, esse código irá rodar ?? Não. Porque ?? Simples, no construtor de base2, como vemos, há o código implícito chamando o construtor padrão de Base1, sua superclasse, e como em Base1 definimos um método que recebe uma String, e como já dito, o compilador não irá colocar o construtor padrão. Resumindo em Base1 não há construtor padrão e Base2 faz chamada justamente para o construtor padrão.
Como faríamos para esse código funcionar ?? Basta adicionar uma chamada explícita para Base1(String a)(classe pai) no construtor de Base2. Para isso ficaria:

class Base2 extends Base1{
	Base2(String a){
	super(a);
}
}

A saber, as subclasses devem sempre chamar sua classe pai, mas para isso devem sempre fazer chamadas a construtores existentes em suas superclasses. Para não cometermos erro devemos sempre lembrar, que todo construtor possui ou uma chamada a um outro construtor de sua classe, com a chamada this(), ou uma chamada a sua superclasse com super(), não é permitido ter this() e super() no mesmo construtor. E devemos lembrar também que se um construtor não tem explicitamente this(), nem super(), implicitamente ele terá super().

Espero correções, dúvidas e sugestões.
Obrigado, by Felipe Nemeth.[color=red] [/color]

Nas execeções por correspondência como o construtor trabalha, já que você por definição você demonstrou o que é construtor.

Cometi algum erro na explicação de como trabalha os construtores ?

Você quer entender construtor, ou simplesmente definir construtor, se definir já não há o que entender sobre construtores ?

Objeto ou Construtor ou ao todo! ? O construtor tem diferentes angulos de sua defnição, no que diz respeito a execeções por correspondência eu não teria um construtor isso é possivel.

Mesmo que execeções trabalham com regras e essas regras diz respeito ao comportamento do objeto sendo este tendo ou não um construtor por definição.

:wink:

Bom, eu também estou estudando para a prova pelo livro da kathy, SCJP 5 mas pretendo fazer a 6, fiquei com uma duvida sobre a relação entre construtores e classes internas.
Sei que para que uma classe interna ser instanciada primeiro devemos ter um objeto da classe externa (a não ser que a classe interna seja static) ou sejá já há um objeto, um construtor da classe externa já foi chamado, e mesmo assim ainda há a chamada implicita dentro do construtor da classe interna para o construtor da classe externa?

a regra é simples: Toda classe ela tem um construtor… TODAS e se vc nao declarar nenhum ELA tem um construtor implicito que chama o da super class… mais lembre-se disso viu uma classe ela tem um construtor mesmo que vc nao declare…

1 curtida

Você quer entender construtor, ou simplesmente definir construtor, se definir já não há o que entender sobre construtores ?

Objeto ou Construtor ou ao todo! ? O construtor tem diferentes angulos de sua defnição, no que diz respeito a execeções por correspondência eu não teria um construtor isso é possivel.

Mesmo que execeções trabalham com regras e essas regras diz respeito ao comportamento do objeto sendo este tendo ou não um construtor por definição.

:wink:
[/quote]

Sim cara, eu tentei definir os construtores, sendo que aprendi na sintese desse tópico. Creio que em relação a pergunta “Objeto ou Construtor ou a todo?”, tentei me referir ao todo, não sei se consegui :).

Mas isso aí, vlw pela contribuição no tópico.

[quote=dark_creator]Bom, eu também estou estudando para a prova pelo livro da kathy, SCJP 5 mas pretendo fazer a 6, fiquei com uma duvida sobre a relação entre construtores e classes internas.
Sei que para que uma classe interna ser instanciada primeiro devemos ter um objeto da classe externa (a não ser que a classe interna seja static) ou sejá já há um objeto, um construtor da classe externa já foi chamado, e mesmo assim ainda há a chamada implicita dentro do construtor da classe interna para o construtor da classe externa?[/quote]

Hummm, certo. Estou estudando pelo SCJP 5, e também pretendo fazer a 6. Em relação a classes internas, não cheguei nessa parte ainda. Estou terminando cap 2. Estou cobrindo a parte de statics…

Mas viu kra, oque vc achou sobre tudo isso que eu falei sobre construtores, teve alguma coisa errada ??

Grande abraço, vlw.

[quote=LPJava]a regra é simples: Toda classe ela tem um construtor… TODAS e se vc nao declarar nenhum ELA tem um construtor implicito que chama o da super class… mais lembre-se disso viu uma classe ela tem um construtor mesmo que vc nao declare…

  1. [/quote]

Correto kra, falei disso no tópico. Uma parte que estou com dúvida consiste na seguinte situação, imagine:


class Base1{

Base1(){
//aqui tenho o código super();  implicitamente correto ??
}


Base1(String a){
//e aqui tbm tenho o código super(); implícito correto ??
}


Base1(String a, int b, int c){
//e aqui tbm tenho o código super(); implícito correto ??
}


Base1(String a, int b, int c, int d){
//e aqui tbm tenho o código super(); implícito correto ??
}

}

Todos esse código implícitos estão corretos ?? Essa é a dúvida, quase sanada rsrs…

Grande abraço.

Sim, voce terá um super() implicito, a não ser que declare explicitamente um super() ou this() com ou sem parametros.

faltou ai “Base2 extends Base1” na explicacao do fenemeth

acho importante também estou estudando pra prova tbm, e tem mais uma regra:

quando vou chamar um construtor sobrecarregado com

class Animal {
    static String a = "Construtores"; //senão for static não compila....

     Animal {
        this(a); //essa variável que eu estou passando na chamada this deve ser static!!!
     }

     Animal (String b) {
        System.out.println(a);  
     }

}

[quote=fenemeth]Bom, eu também estou estudando para a prova pelo livro da kathy, SCJP 5 mas pretendo fazer a 6, fiquei com uma duvida sobre a relação entre construtores e classes internas.
Sei que para que uma classe interna ser instanciada primeiro devemos ter um objeto da classe externa (a não ser que a classe interna seja static) ou sejá já há um objeto, um construtor da classe externa já foi chamado, e mesmo assim ainda há a chamada implicita dentro do construtor da classe interna para o construtor da classe externa?[/quote]

[quote]
Hummm, certo. Estou estudando pelo SCJP 5, e também pretendo fazer a 6. Em relação a classes internas, não cheguei nessa parte ainda. Estou terminando cap 2. Estou cobrindo a parte de statics…

Mas viu kra, oque vc achou sobre tudo isso que eu falei sobre construtores, teve alguma coisa errada ??

Grande abraço, vlw.[/quote]

Na sua prova de certificação Java 5, vc não vai ter que dar essa explicação, a prova é objetiva e cada questão voce tera 1 minuto e alguns segundos para responder !!! vai ter o compilador na mente, e pra isso vai ter que ler o codigo fluentemente.
O que eu quiz tentar fazer, era lhe fazer vc perceber que seja construtor ele trabalha pelo comportamento do Objeto, se este leva o nome da classe, ou se pertence a uma regra ou nao.

Humm, blz Gustavo, entendi o conceito…Vlw, grande abraço.

Olooco cara, muito bem observado, editarei a mensagem. Vlw, grande abraço.

[quote=jc.thalys]acho importante também estou estudando pra prova tbm, e tem mais uma regra:

quando vou chamar um construtor sobrecarregado com

[code]
class Animal {
static String a = “Construtores”; //senão for static não compila…

 Animal {
    this(a); //essa variável que eu estou passando na chamada this deve ser static!!!
 }

 Animal (String b) {
    System.out.println(a);  
 }

}
[/code][/quote]

Humm certamente cara. Isso é necessário pois no momento em que animal chama this(a), ainda não foi criada uma instância da classe Animal. Mas caso recebessemos a variável como argumento, exemplo: Animal(String a){ this(a) ;} não teria problema algum. Mas para usar varíavel da classe antes de criação da uma instância da mesma, somente com variável static mesmo.

Bem observado amigo, grande abraço, vlw.

[quote=Marcio Duran]
Na sua prova de certificação Java 5, vc não vai ter que dar essa explicação, a prova é objetiva e cada questão voce tera 1 minuto e alguns segundos para responder !!! vai ter o compilador na mente, e pra isso vai ter que ler o codigo fluentemente.
O que eu quiz tentar fazer, era lhe fazer vc perceber que seja construtor ele trabalha pelo comportamento do Objeto, se este leva o nome da classe, ou se pertence a uma regra ou nao.[/quote]

Ahh certamente cara. Antes da prova farei alguns simulados para treinar também a velocidade do meu pensamento em relação ao código. Grande abraço amigo, muito obrigado pelas ajudas. Faloww.

[quote=fenemeth]

Ahh certamente cara. Antes da prova farei alguns simulados para treinar também a velocidade do meu pensamento em relação ao código. Grande abraço amigo, muito obrigado pelas ajudas. Faloww.[/quote]

Prefiro que você faça simulados e simulados, a parte de Threads é bem cobrado !!! se for o caso jogue a duvida aqui em um Codigo que vc não consegui nem se quer ler. Tem que tirar um score proximo de 85%. ou mais.
Motivo isso é não cobrado nas empresas, mas é uma carta na manga para ter um diferencial, o seu boletim vai servir como um mini-curriculum.

:wink:

[quote=Marcio Duran][quote=fenemeth]

Ahh certamente cara. Antes da prova farei alguns simulados para treinar também a velocidade do meu pensamento em relação ao código. Grande abraço amigo, muito obrigado pelas ajudas. Faloww.[/quote]

Prefiro que você faça simulados e simulados, a parte de Threads é bem cobrado !!! se for o caso jogue a duvida aqui em um Codigo que vc não consegui nem se quer ler. Tem que tirar um score proximo de 85%. ou mais.
Motivo isso é não cobrado nas empresas, mas é uma carta na manga para ter um diferencial, o seu boletim vai servir como um mini-curriculum.

:wink: [/quote]

ohhh amigo, agradeço pela preocupação. Pode deixar que farei bastantes simulados quando eu achar que estou pronto para alguns…Por enquanto vou estudando e quando houver dúvidas farei tópicos parecido com o do construtores…

Grande abraço e bom feriado amigo, faloww.

[quote=fenemeth]
ohhh amigo, agradeço pela preocupação. Pode deixar que farei bastantes simulados quando eu achar que estou pronto para alguns…Por enquanto vou estudando e quando houver dúvidas farei tópicos parecido com o do construtores…

Grande abraço e bom feriado amigo, faloww.[/quote]

O problema é que todos vão pra Roma, quando chegam na arena poucos são os gladiadores que sobrevivem !!!

abraçoss !!!