Obrigatoriedade de implementar construtor Default na classe pai quando herda

Porque quando herdo de uma classe sem construtor default, ocorre erro
Implicit super constructor Plant() is undefined for default constructor.
Must define an explicit constructor Tree.java quando herdo desta classe.

public class Plant {
	private String name;

	public Plant(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}
	 
}

public class Tree extends Plant {
	public void growFruit() {
	}

	public void dropLeaves() {
	}
	
	 
}

Na sua classe Tree, mesmo você não definindo um construtor, é fornecido em tempo de compilação, um construtor padrão:

public Tree(){}

e todo construtor tem, mesmo não definido em código, na primeira linha uma chamada ao construtor pai através de:

super();

O erro acontece que na classe Plant, você informa um construtor com parâmetro, então não é fornecido um construtor padrão. Logo na chamada do filho, ele não encontra o construtor do pai, dando erro de compilação.

Abraços!

1 curtida

Como foi implementado um construtor na classe pai, na classe filha sou obrigado a invocar este construtor certo?
Se nao existisse um construtor default na classe pai estaria usando o construtor default sem argumentos, desta forma nao precisaria invocar na classe filha.
Concluindo toda Tree é uma Planta e toda Planta tem um nome, então toda vez que crio uma Tree sou obrigado a informar o nome ja que ela é uma planta.

Obrigado ajfilho

1 curtida

[quote=ajfilho]Na sua classe Tree, mesmo você não definindo um construtor, é fornecido em tempo de execução, um construtor padrão:

public Tree(){}

[/quote]
Nop! , não é em tempo de execução… é em tempo de compilação… sempre que vc não escreve nenhum construtor, na hora de compilar, o proprio compilador, implicitamente faz um … public Tree() {super();} … portanto se sua super classe não tiver um construtor default, ele não consegue chamar o constutor default…

Ah e muito importante… se vc escreve um Construtor, o compilador, simplismente não adciona o default, sem argumentos, se kizer o seu novo, mais o default, tera que escrever os 2 … e é o que ocorre nesse seu caso… o seu construtor é Plant(String) … então o construtor Plant() não existira, a não ser q vc escreva 1

[quote=ajfilho]e todo construtor tem, mesmo não definido em código, na primeira linha uma chamada ao construtor pai através de:

super();

O erro acontece que na classe Plant, você informa um construtor com parâmetro, então não é fornecido um construtor padrão. Logo na chamada do filho, ele não encontra o construtor do pai, dando erro de compilação.

Abraços![/quote]

Na verdade sempre existira uma chamada a super, seja ela a vazia super() ou uma sobrecarregada super(…parametro…) … se vc não escrever nenhum, o compilador escreve uma pra vc, escrito super(); portanto volta ao problema anterior, se sua superclasse não tiver um construtor vazio visivel, esse codigo não compilará, a não ser que vc escreve explicitamente o construtor…

Ps.: sempre deve exister ou uma chamada a this(…argumentos_opicionais…) ou a super(…argumentos_opicionais…) em um construtor, e esta chamada é sempre a primeira instrução do construtor… vc pode ter this, que invoca outros this… e eles vão estar se referindo a construtores ainda da mesma classe… porem inevitavelmente uma hora vc terá que chamar super, para subir na hieraquia de classes… (a maioria dos compiladores ja detectam overflow de this, em construtores, impedindo a compilação)

Toda classe antes de ser criada, invoca o construtor de sua classe pai, e so apos a classe pai ser totalmente iniciada, ela executa o escopo de seu construtor… isso sobe na cadeia ate Object…

portanto quando vc cria uma instancia de qualquer objeto… primeiro é executado o escopo do construtor de object, depois o da subclasse, e depois o da subsub… ate chegar na classe q vc instaciou…

1 curtida

Obrigado Lavieri…

Corrigi lá em cima a mensagem!

Abraços!

[quote=labbati]
Porque quando herdo de uma classe sem construtor default, ocorre erro
Implicit super constructor Plant() is undefined for default constructor.
Must define an explicit constructor Tree.java quando herdo desta classe.

[code]
public class Plant {
private String name;

public Plant(String name) {
	this.name = name;
}

public String getName() {
	return name;
}

}

public class Tree extends Plant {
public void growFruit() {
}

public void dropLeaves() {
}

}

[/code][/quote]