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:
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 
É 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:
- Object;
- MyClass();
- MyClass(boolean indicator, String location);
- MyClass(int noOfWatts, boolean indicator, String location);
- Greenhouse(int noOfWatts);
- Greenhouse(int noOfWatts, boolean indicator);
- Greenhouse(int noOfWatts, boolean indicator, String location);
- 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