[RESOLVIDO] OO - Método @Override acessando atributo na Filha

2 respostas
raci0nal

Olá pessoal, esta me pegou!
Montei um exemplo para ficar mais facil de explicar.

Tenho duas classes Pai e Filha, na classe Pai eu tenho alguns métodos abstratos. Esses métodos são chamados da Pai, mas devem rodar o conteúdo definido na Filha.
Na classe Filha eu tenho um atributo, e um desses métodos que está sobrescrevendo a assinatura abstract joga um valor para este atributo.
Segundo os meus testes esse valor que ele joga, não é realmente jogado neste atributo da Filha (aliás eu nem sei onde é jogado).
Se eu tento acessar esse atributo através de outro método que também esteja sobrescrevendo um abstrato, o atributo não retorna o valor esperado.
Sendo assim, gostaria de saber como acessar um atributo de uma classe Filha, através de um método que está sobrescrevendo nela um método abstract da Pai (e principalmente que todos os métodos semelhantes enxerguem o mesmo valor para o atributo).

Segue abaixo o código de duas classes de exemplo:
public abstract class Pai extends javax.swing.JFrame {
	
	public Pai() {
		iniciar();
		carregarTexto();
	}
	
	public void iniciar() {
		javax.swing.JButton btn01 = new javax.swing.JButton("Teste");
		btn01.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				gerarMensagem();
			}
		});
		
		getContentPane().add(btn01);
		pack();
		setVisible(true);
	}
	
	public abstract void carregarTexto();
	public abstract void gerarMensagem();
}
public class Filha extends Pai {

	private String texto = null;
	
	@Override
	public void gerarMensagem() {
		javax.swing.JOptionPane.showMessageDialog(null, "O texto da mensagem:" + texto);		
	}

	@Override
	public void carregarTexto() {
		texto = "por favor leia o texto";
		javax.swing.JOptionPane.showMessageDialog(null, "Carregou: " + texto);
	}	
}

Quando clico no botão ao invés de aparecer para o atributo "texto" o valor: "por favor leia o texto", aparece "null" como se ele não estivesse carregado.
Mas vocês podem ver que o método carregarTexto() rodou sim.

Desde já agradeço,

Marcos Antonio Campos Jordão''

2 Respostas

ViniGodoy

Isso acontece pq vc está chamando o método da filha no construtor do pai.
No construtor, chame métodos apenas da sua própria classe ou do pai, nunca da filha. Isso pq a classe filha ainda não foi inicializada.

O que acontece no seu código?

O método carregarTexto roda e, logo em seguida, quando o construtor do pai termina, o atributo texto da filha é inicializado com null.
Isso mesmo, é só depois do construtor da classe pai que a linha
private String texto = null;

É executada. E isso gera a inconsistência que você está relatando.

raci0nal

É isso ae cara!
Deu certo.

Obrigado,

Marcos Antonio Campos Jordão’’

Criado 20 de novembro de 2007
Ultima resposta 21 de nov. de 2007
Respostas 2
Participantes 2