Construtores

12 respostas
A

Olá a todos… é o seguinte estou estudando para a certificacao e surgiu uma duvida…
Tenho uma classe pai que tem dois construtores: um tipo default (com um corpo que dá um System.out)declarado e o outro passando um parametro

Na classe filha eu estou dando um new dela propria… e ela esta dando um System.out … ou seja teoricamente ela esta "herdando " o construtor do pai…mas pelo que sei na teoria os construtores não são herdados…

valeu…

tenho uma classe Pai:

package util;

public class Trata_XML{
 
    public Trata_XML() {
    
    	System.out.println("feito");
    
    };
    public Trata_XML(String a) {};
   
}

e a classe filha:

package util;


public class TesteConst extends Trata_XML{
	int b = 4;
	
    public static void main(String[] args) {
     
        TesteConst app = new TesteConst();
        
    }
}

EDIT - Pus o tag [ code ] para você; na próxima vez, ponha os tags [ code ] para facilitar a compreensão do seu código.

12 Respostas

T

Uma coisa é herdar o construtor (o construtor nunca é herdado), e outra é que a implementação default do construtor sem parâmetros é sempre:

public TesteConst () {
    super();
}
T

Blz… entendi… mas tenho uma duvida tb c na classe pai tiver construtores sobrecarregados eu sou obrigado a implementar o contrutor default ne?(qualquer um dos dois ). ou posso deixar d implementar um contrutor default des d q exista um construtor sem argumentos.(Seria uma implementação implicita ne rs?

em fim des d q tenha um construtor default declarado na classe pai eu nao tenho q colocar super() pq o java ja faz isso.

desculpa nao ser mais claro mas vamos ver c conseguem entende.

T

thiagofh:
Blz… entendi… mas tenho uma duvida tb c na classe pai tiver construtores sobrecarregados eu sou obrigado a implementar o contrutor default ne?(qualquer um dos dois ). des d q os argumentos sejam iguais… ou ele pode fazer isso implicitamente?

Sobrecarregar? Thiago, uma vez que vc cria uma classe filha, ele nem saberá quais são os construtores que existem na casse pai.

No entanto, se a classe filha tiver um construtor default (ou vazio), acredito que a classe pai obrigatóriamente deverá ter um construtor fazio também, já que o default chama super(); assim como o thingol citou acima!

T

Thiago Senna:
thiagofh:
Blz… entendi… mas tenho uma duvida tb c na classe pai tiver construtores sobrecarregados eu sou obrigado a implementar o contrutor default ne?(qualquer um dos dois ). des d q os argumentos sejam iguais… ou ele pode fazer isso implicitamente?

Sobrecarregar? Thiago, uma vez que vc cria uma classe filha, ele nem saberá quais são os construtores que existem na casse pai.

No entanto, se a classe filha tiver um construtor default (ou vazio), acredito que a classe pai obrigatóriamente deverá ter um construtor fazio também, já que o default chama super(); assim como o thingol citou acima!

sim sobrecarregar… nao expliquei bem… to falando q na classe pai existem contrutores sobrecarregados ou estou errado?

T

sim, pode ter… mas só na classe pai, no entanto, a classe filha não herda eles!

R

Se na classe pai você tiver construtores sobrecarregados e não tiver um default, as classes filhas deverão implementar explicitamente uma chamada a super() que coincida com algum dos contrutores.

Por exemplo, se na classe Pai você tiver:

e não tiver nenhum construtor default.

Nas classes filhas você sera obrigado a implementar uma chamada a super(int);

T

Thiago Senna:
sim, pode ter… mas só na classe pai, no entanto, a classe filha não herda eles!


sim sim isso eu sei…

T

thiagofh:
Thiago Senna:
sim, pode ter… mas só na classe pai, no entanto, a classe filha não herda eles!


sim sim isso eu sei…

entaum entedi mau sua pergunta… rsrs… desculpa ai!

T

Thiago Senna:
thiagofh:
Thiago Senna:
sim, pode ter… mas só na classe pai, no entanto, a classe filha não herda eles!


sim sim isso eu sei…

entaum entedi mau sua pergunta… rsrs… desculpa ai!

q nada cara rs… eu q nao to sabendo explicar mals ai pessoal mas d qualquer forma o que eu queria saber ja foi respondido

S

Deixa eu tentar fazer um resumo sobre construtores… :lol:

Os construtores não são herdados mas eles são chamados, normalmente através da função super().

Quando vc tem uma classe pai qq em que não há uma definição explicita de um construtor, implicitamente o java põe um contrutor default que chama a superclasse.

class Light {
    // Fields
    int     noOfWatts;       // wattage
    boolean indicator;       // on or off
    String  location;        // placement

    // No constructors
    //...
}

class Greenhouse {
    // ...
    Light oneLight = new Light();     // (1) Call of implicit default constructor.
}

Contrutor default:

Light() { super(); }

Nesse caso ele chama o contrutor da Classe Object já que todas as classes implicitamente herdam da classe Object.

Quando há sobrecarga de construtores na superclasse vc tem duas opções. 1ª é NÃO definir um construtor default (sem argumentos). 2ª é vc definir um construtor default :smiley:

É importante lembrar que quando há sobrecarga de construtores vc DEVE explicitar o construtor default. Se vc não explicitá-lo o compilador entenderá que vc não quer esse construtor, portanto não irá inserí-lo =o)

Na 1ª opção o(s) constutor(es) da(s) subclasse(s) deve(m) fazer uma chamada explícita a um contrutor da superclasse. Essa chamada deve conter os parâmetros corretos de um construtor da superclasse senão haverá um erro de compilação. Se não houver uma chamada explicita ao super(…) o java implicitamente chama super(), mas como não há um construtor default na superclasse haverá um erro de compilação. A chamada é feita através do método super(args). O super DEVE ser a primeira linha do construtor.

//arquivo: MyClass.java
public class MyClass {
		
	public int noOfWatts;
	public boolean indicator;
	public String location;
	
    // Only non-default Constructor
	MyClass(int noOfWatts, boolean indicator, String location) {          // (1)
        this.noOfWatts = noOfWatts;
        this.indicator = indicator;
        this.location  = location;
    }
	
//	Only non-default Constructor
	MyClass(boolean indicator, String location) {          // (1)
        this.noOfWatts = 100;
        this.indicator = indicator;
        this.location  = location;
        System.out.println("Construtor com dois argumentos de MyClass");
    }

}

//arquivo: Greenhouse.java
public class Greenhouse extends MyClass{
	
	Greenhouse(int noOfWatts, boolean indicator, String location) {
		super(noOfWatts, indicator, location);
		System.out.println("Construtor com 3 argumentos de Greenhouse");
	}

	Greenhouse(boolean indicator, String location) {
		super(indicator, location);
		System.out.println("Construtor com 2 argumentos de Greenhouse");
	}
		
	public static void main (String[] args ){
		Greenhouse gh = new Greenhouse(100, true, "Funciona");
		System.out.println("\nSegunda chamada de contrutores:");
		gh = new Greenhouse(true, "Funciona");
		
		//gh = new Greenhouse();     //not ok!!!
	}
}

Na 2ª opção o(s) constutor(es) da(s) subclasse(s) pode(m) escolher entre chamar explicitamente ou não o super. Se a chamada ao construtor default for desejada não é necessário explicitar o super(), mas a chamada a qq outro construtor deve ser utilizado o super(args A1, …, args An).

//arquivo: MyClass.java
public class MyClass {
		
	public int noOfWatts;
	public boolean indicator;
	public String location;
	
    // Only non-default Constructor
	MyClass(int noOfWatts, boolean indicator, String location) {          // (1)
        //...code
    }
	
//	Only non-default Constructor
	MyClass(boolean indicator, String location) {          // (1)
        //..code
    }

	//default Constructor
	MyClass() {          // (1)
	    System.out.println("Construtor default de MyClass");
	}
}

//arquivo: Greenhouse.java
public class Greenhouse extends MyClass{	
	Greenhouse(int noOfWatts, boolean indicator, String location) {
		//chamada implícita
		//super();
		System.out.println("Construtor com 3 argumentos de Greenhouse");
	}

	public static void main (String[] args ){
		Greenhouse gh = new Greenhouse(100, true, "Funciona");
			
	}
}

Em java existe um recurso chamado cadeia de construtores. O conceito é que um construtor pode chamar outro construtor da mesma classe utilizando a função this().
Assim como o super o this tem q ser a primeira linha do constructor, isso significa que não é possivel termos os dois no mesmo construtor.

A cadeia é executada hierarquicamente invertida, eita q confundio tudo hehehe… é assim… em uma classe temos sobrecargas de alguns construtores, com 4, 3, 2 e 1 argumento. Se o ultimo contrutor dessa subclasse que foi chamado fizer uma chamada a super(…) então ele chamará o devido construtor sobrecarregado da superclasse, esse contrutor pode ter outra cadeia. O último construtor da cadeia a ser chamado deve fazer uma chamada, impícita ou não ao super pq o construtor da classe Object sempre tem q ser chamado.

Então há uma lista de chamadas de contrutores e estes vão sendo executados de trás pra frente. O construtor da classe Object é executado depois o construtor que a chamou e o construtor que a chamou e assim sucessivamente até a primeira chamada…

Vamos a um exemplo né?!

//arquivo: MyClass.java
public class MyClass {
	// Only non-default Constructor
	MyClass(int noOfWatts, boolean indicator, String location) {          // (1)
        this(indicator,location );
		//...code
    }
	
//	Only non-default Constructor
	MyClass(boolean indicator, String location) {          // (1)
		this();
        //..code
    }
	//default Constructor
	MyClass() {          // (1)
//		chamada implícita
		//super();
	}
}


//arquivo: Greenhouse.java
public class Greenhouse extends MyClass{
	
	Greenhouse(int noOfWatts, boolean indicator, String location, String locatio2) {
		this(noOfWatts, indicator, location);
		//code
	}
	
	Greenhouse(int noOfWatts, boolean indicator, String location) {
		this(noOfWatts, indicator);
		//code
	}
	Greenhouse(int noOfWatts, boolean indicator) {
		this(noOfWatts);
		//code
	}
	Greenhouse(int noOfWatts) {
		super(100, true, "chamada ao contrutor de 3 argumentos da superclasse");
		//code
	}

	public static void main (String[] args ){ 
           Greenhouse gh = new Greenhouse(100, true, "casa", "estação"); }
}

Nesse exemplo temos que os construtores serão executados na seguinte ordem:

  1. Object;
  2. MyClass();
  3. MyClass(boolean indicator, String location);
  4. MyClass(int noOfWatts, boolean indicator, String location);
  5. Greenhouse(int noOfWatts);
  6. Greenhouse(int noOfWatts, boolean indicator);
  7. Greenhouse(int noOfWatts, boolean indicator, String location);
  8. Greenhouse(int noOfWatts, boolean indicator, String location, String locatio2);

Mas a chamada é feita do 8 para o 1…

Bom galera… acredito q seja isso…

espero ter ajudado e se eu tiver me enganado em algum canto por favor me corrijam e se eu tiver esquecido de algo podem postar =o)

Valeuz

A

Gostei bastante de Explicação. Clara, eficiente e completa.

Valew

F

Valeu !!!

tirou minhas duvidas :smiley:

Abraço.

Criado 22 de agosto de 2005
Ultima resposta 17 de abr. de 2009
Respostas 12
Participantes 8