Relações entre classes/ Contrutores

6 respostas
Shponja

Tenho num diagrama UML uma classe abstracta Agenda e uma classe AgendaDia que é subclasse da primeira.
No diagrama UML o construtor da classe agenda apresenta: +Agenda(maxEventos: int)
e o construtor da classe AgendaDia apresenta: +AgendaDia(maxEventos: int, dia: int)

Ao implementar acontece o seguinte:

package trabalho1;

public abstract class Agenda {
	
	private Evento[] eventos;
	
	
	
	public Agenda(int maxEventos){
		
	}

e na AgendaDia:

package trabalho1;

public class AgendaDia extends Agenda{
	
	private int dia;
	
	public AgendaDia(int maxEventos, int dia){
		this.maxEventos=maxEventos;
		this.dia=dia;	
	}

Dá um erro: "Implicit super constructor Agenda() is undefined. Must explicity invoke another constructor"

Alguém me pode explicar?
Não será erro do diagrama ter o construtor da classe pai ocupado?

6 Respostas

R

Shponja,

Quando você criar um construtor na classe explicitamente, o compilador não incluirá um construtor padrão nesta, porém se você não o fizer, ele criará na compilação, pois é obrigatório que cada classe tenha pelo menos um construtor. Portanto, quando você declarou um construtor na classe Agenda, o compilador não criou o construtor padrão, portanto você tem apenas um construtor em Agenda, e este espera um int como argumento. Como a classe AgendaDia é uma subclasse de Agenda, o construtor que você criar explicitamente ou não, terá uma chamada para o construtor da classe pai desta, mesmo que você não inclua uma chamada super(), isso também será feito pelo compilador, porém o compilador sempre incluirá uma chamada dessa forma:

public AgendaDia(int maxEventos, int dia){  
         super();
         this.maxEventos=maxEventos;  
         this.dia=dia;     
     }

Ou seja, sem passagem de argumentos, mas você não tem um construtor em Agenda com essa assinatura, portanto você deverá incluir a chamada super() explicitamente, e esta deve incluir os argumentos esperados pela classe Agenda, ou seja:

public AgendaDia(int maxEventos, int dia){  
         super(maxEventos);
         this.dia=dia;     
     }
Lavieri

Apena complementando…

toda classe, precisa ter uma chamada a super, e sempre ao criar uma classe, a primeira coisa feita é uma chamada a super() da sua SuperClasse que chamará super() da SuperClasse da SuperClasse, e assim por diante, ate chegar a classe Object… depois Object executará o construtor dele, que em sequencia volta pra classe de baixo, que executará o restante do bloco do construtor, que ai retorna por exemplo no seu caso, pra classe Agenda, que executará o restante do código logo abaixo da chamada super(), e depois voltaria para AgendaDia, para executar o seu construtor…

como Agenda não tem um construtor vazio tipo

public Agenda() {}

o construtor

public AgendaDia(int maxEventos, int dia){ this.maxEventos=maxEventos; this.dia=dia; }

não especificar uma chamada, o compilador vai tentar fazer super(), o que não existe, pois só existe Agenda(int), portante vc teria que fazer algo como super(int)

Shponja

Entendi, obrigado malta =]

Tinha lido sobre o super() no livro mas não percebi bem a sua função, agora já entendi tudo.
Obrigado

Shponja

No entanto continuo com problemas =/
à qualquer coisa aqui que nao estou a perceber.

Tenho a classe pai Agenda() :
public abstract class Agenda {
	
	private Evento[] eventos = new Evento [10];
	public int maxEventos;
	
	public Agenda(int maxEventos){	
		
		
	}
A classe que herda AgendaDia():
package trabalho1;

public class AgendaDia extends Agenda{
	
	private int dia;
	
	public AgendaDia(int maxEventos, int dia){
		super(maxEventos);
		this.dia=dia;	
	}

O problema é que no método main vou criar o objecto AgendaDia d = new AgendaDia(4,12); e o inteiro maxEventos não está declarado como variavel fora dos contrutores. Ele dá um erro. Se declarar fica tudo bem mas segundo o diagrama uml devo contruir isto de forma a não declarar a variavel maxEventos. =S
alguém pode ajudar?

L

Não entendi sua ultima pergunta, que erro que da?!

De qualquer forma, ainda esta faltando setar o valor de maxEventos no construtor da classe Agenda

public Agenda(int maxEventos){	
  this.maxEventos = maxEventos;
}
Shponja

Pois eu enganei-me a implementar, agora já está correcto mas esquecime de avisar aqui.
No entanto apareceu outra dúvida que meti noutro post aqui do forum.

Criado 20 de abril de 2009
Ultima resposta 20 de abr. de 2009
Respostas 6
Participantes 4