Construtores e Instanciação
Autor: Bruno Souza | Publicado: 2012-05-05T10:07:00-07:00


Não se pode criar um objeto sem que seja chamado um construtor.
Toda &nbsp;superclasse da árvore de herança de um objeto chamará um construtor.
Toda classe, mesmo as classes abstract, tem pelo menos um construtor.
Os construtores devem ter o mesmo nome da classe.
Os construtores não têm um tipo de retorno. Se houver, então será simplesmente um método com o mesmo nome da classe e não um construtor.
A execução do construtor ocorrerá da maneira a seguir:

O construtor chamará o construtor da sua superclasse, que chamará o construtor de sua superclasse, e assim por diante, até alcançar o construtor Object.
O construtor de Object será executado, retornando em seguida ao construtor chamador, que será processado até sua conclusão, e por sua vez retornará ao construtor que o chamou; dando prosseguimento a essa seqüência até a execução do construtor da instância que estiver sendo criada.

Os construtores podem usar qualquer modificador de acesso(até mesmo private!).
&nbsp;Apenas public, protected, private e default (sem modificador de acesso) são legais quando se declara construtores.
O compilador criará um construtor padrão se você não criar nenhum construtor em sua classe.
O construtor padrão é um construtor sem argumentos com uma chamada também sem argumentos a super().
a primeira instrução de todo construtor deve ser uma chamada a this() (um construtor sobrecarregado) ou a super().
O compilador adicionará uma chamada a super(), a menos que você já tenha inserido uma chamada a this() ou a super().
Os membros de instância só podem ser acessados depois de o construtor da superclasse ser executado.
As classes abstract possuem construtores que são chamados quando uma subclasse concreta é instanciada.
As interfaces não têm construtores.
Se sua superclasse não tiver construtor sem argumentos, você terá que criar um construtor e inserir uma chamada a super() com argumentos que coincidam com os do construtor da superclasse.
Os construtores nunca são herdados, portanto, não podem ser sobrescritos.
Um construtor só pode ser chamado diretamente por outro construtor (usando uma chamada super() ou this() ).
Questões relacionadas com chamada this();

Só podem aparecer com a primeira instrução de um construtor
A lista de argumentos determina que construtor sobrecarregado será chamado.
Os construtores podem chamar outros construtores que podem chamar ainda outros e assim por diante; mas, cedo ou tarde, é melhor que um deles chame super() ou a pilha excederá o limite.
Chamada a this() e super() não podem ficar no mesmo construtor. Você pode ter um ou outro, mas nunca os dois.&nbsp;


&nbsp; &nbsp; Os construtores são sempre chamados quando um objeto é construído. Eles não possuem nenhum tipo de retorno e devem ter o mesmo nome da class.

&nbsp; &nbsp; &nbsp;Regras que precisam ser conhecidas:

&nbsp; &nbsp; &nbsp;Não podem ser marcados como static, final ou abstract.
&nbsp; &nbsp; &nbsp;Podem receber um modificador de acesso como protected.
&nbsp; &nbsp; &nbsp;Analisando o código abaixo:

&nbsp; &nbsp; &nbsp;class C{
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C(String s){}
&nbsp; &nbsp; &nbsp;}

&nbsp; &nbsp; &nbsp;class D extends C{
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;public static void main(){}
&nbsp; &nbsp; &nbsp;}

&nbsp; &nbsp; &nbsp; O código acima não compila, pois o compilador chama super() implicitamente, porém ela não encontra o construtor da super sem argumentos.

&nbsp; &nbsp; &nbsp;Mais alguns exemplos:

&nbsp; &nbsp; &nbsp;class C{
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C(String s){}
&nbsp; &nbsp; &nbsp;}

&nbsp; &nbsp; &nbsp;class D extends C{
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public static void main(){
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; D(){
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; super("S");
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}
&nbsp; &nbsp; &nbsp;}

&nbsp; &nbsp; &nbsp;Não compila, pois o construtor está sendo chamado dentro do método.

&nbsp; &nbsp; &nbsp;A classe a seguir compila, já que temos um construtor válido na super classe:

&nbsp; &nbsp; &nbsp;class C{
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C(String s){}
&nbsp; &nbsp; &nbsp;}

&nbsp; &nbsp; &nbsp;class D extends C{
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;D(){
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;super("S");
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;public static void main(){
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}
&nbsp; &nbsp; &nbsp;}