GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Construtor Padrão


#1

Gostaria que alguem me explicasse a função e como aplicar construtores padrão. Gostaria de alguns exemplos, explicações e de como faz quando se omite um construtor padrão de como o compilador o coloca e comose chama um objeto por esse construtor... enfim tudo! :smile: obrigado[/b]


#2

Nossa JBoy ... tudo, tudinho mesmo?

Bem, construtor padrão é o famoso construtor sem parâmetros, ou seja:

class MinhaClasse {
      MinhaClasse() {
         //Esse é o famoso padrão
     }
}

Na verdade o nome certo não é padrão e sim default (que não são a mesma coisa).

Quando você não especifica NENHUM construtor pra sua classe o compilador (q seja) define um na hora da compilação para que sua classe tenha um entry Point e você possa instanciar um objeto no conhecido jeito:

MinhaClasse var = new MinhaClasse();

No exemplo o construtor que eu defini é exatamente igual ao default criado pelo compilador, sem nada!

Nao tem muito o que dizer sobre isso ... eh um construtor que é criado caso você não especifique nenhuma pra sua classe.

[]s


#3

vc vai entender melhor a finalidade do construtor qndo estudar herança.


#4

Uai, pq qdo estudar herança?
Construtor é uma forma de inicializar o estado de um objeto, assim que este é criado na memoria.
O objetivo sempre será esse, com ou sem herança.

Gerson K.


#5

<longo>

Bom Amigos,

o que acontece eh que o compilador faz mais do que foi dito:

Quando vc chama new para um Objeto, toda hierarquia de objetos precisa ser iniciada, por exemplo, se vc tem um classe gerente que eh filha da classe pessoa que eh filha de object e vc chama:

Gerente g = new Gerente ();

toda estrutura de classes precisa ser iniciada, a do gerente, a da pessoa e a da object, isso acontece automaticamente porque dentro de todo construtor o compilador poe uma chamada para o construtor da classe mae:

se vc escreveu uma classe assim:

public class Gerente extends Pessoa{
}

como vc nao definiu nenhum construtor o compilador ira completa-la assim:

public class Gerente extends Pessoa{
      public Gerente(){
            super();  // chamada para o construtor da classe mae
      }
}

O contrutor default auto gerado leva o mesmo modificador de acesso da classe (public), e internamente tem uma chamada para super;

Caso vc escreva a classe assim:

public class Gerente extends Pessoa{
      public Gerente(double salario){
      }
}

o compilador nao ira colocar o construtor default, porque vc ja escreveu um, mas ira completar seu construtor com super assim:

public class Gerente extends Pessoa{
      public Gerente(double salario){
            super();
      }
}

algumas vezes vc precisa chamar um construtor do outro, ai vc deve utilizar o this assim:

public class Gerente extends Pessoa{
      public Gerente(){
            this(0.0);
      }
      public Gerente(double salario){
      }
}

o compilador ira completa-la assim:

public class Gerente extends Pessoa{
      public Gerente(){
            this(0.0);
      }
      public Gerente(double salario){
            super();
      }
}

o this ira desviar o processamento para o outro construtor.

[Obs]
Uma particularidade do mecanismo de construtores,

Suponha o codigo:

public class Pessoa{
      Pessoa(String nome){
            super();
      }
}

Como um construtor foi escrito, o compilador nao ira autogerar o default.

Agora se vc escrever a seguinte classe:

public class Gerente extends Pessoa{
}

NAO ira compilar!!! De uma olhada no codigo autogerado pelo compilador:

public class Gerente extends Pessoa{
      Gerente(){}
            super();//Chamada ao construtor default da mae que nao existe, pois nao foi gerado!!
      }
}

Como vc definiu um construtor na classe Pessoa, o construtor default nao sera autogerado, para que a classe gerente compile vc devera chamar o super explicitamente assim:

public class Gerente extends Pessoa{
      public Gerente(){}
            super("Anonimo");//Chamada ao construtor da mae que recebe uma String
      }
}

Resumindo:

O compilador trabalha assim:

1) A classe ja tem construtor? se nao crie o default
2) Os contrutores possuem this ou super na primeira linha? se nao coloque super()

</longo>

É isso ai,

abraco,


#6