Herança e comando super

Olá pessoal, estou tentando implementar alguns exemplos de herança, até que me deparei com a seguintesdúvida:

1 - Não posso chamar o construtor de uma classe abstrata dentro de uma classe filha?

vejam meu código


// pacote de classe relacionado a pessoas

   package PESSOA;
   
   public abstract class Pai {
   
   //atributos membro da classe
   	    
   	private String       tratamento;
   	
   	//construtor
   	public Pai(String tratamento){
   	       
   	        setTratamento(tratamento);
		}
		
		// método de configuração
		
	public void setTratamento(String tratamento){
   		  	 this.tratamento=tratamento;
   		  	 }
		       
  }

classe que herda de pai


// classe que herda de pai

package PESSOA;

import PESSOA.Pai;

       public class Filho extends Pai{
       	      private int num;
       	      
       	      	      public Filho(int num){
       	      	      	     //super(tratamento);
       	      	      	     
     	      	     		       setInt(num);
     	      	     		       }
     	      	     		       
      	     		       public void setInt(int num){
      	     		       this.num=num;
      	     		       System.out.println(num);
					  }
					  
}

vejam que na linha 11 (da classe filha) se eu tirar o comentário tenho o seguinte problema

Filho.java:11: tratamento has private access in PESSOA.Pai

ok, se trata de um atributo privado de pai, porém no construtor pai eu pedi para utilizar o método público setTratamento

se eu comentar o super (como no código) tenho o seguinte erro

pessoa\Filho.java:10: cannot find symbol symbol : constructor Pai() location: class PESSOA.Pai".

Agora minha lógica (que talvez esteja equivocada):

Eu crio as variáveis privadas na classe abstrata e crio um método construtor para ser chamado nas classes filhas utilizando os métodos de configuração (setters).

Será esse meu erro (lógica) ou é erro de sintese da linguagem que eu estou cometendo?

Grato pela atenção dispensada
Thiago

Ola,

Vc pode sim usar o construtor de uma classe que vc esteja estendendo… o problema ae é outro, olhe que a classe pai tem um atributo chamado “tratamento” que é private, e no contrutor da filha vc recebe um “num” e tenta passar um “tratamento” para o construtor, o problema é que esta variável “tratamento” não existe na filha, então o compilador entende que vc está tentando usar a “tratamento” da classe pai, dae o erro.

Espero não ter enrolado muito na explicação…

Putz cara, então era o que eu temia, pois a minha idéia era justamente essa, pegar o atributo encapsulado de pai e usar o set de pai dentro do seu construtor para chama-lo na classe filha.

Vou ter de mudar totalmente minha construção das classes desse jeito :frowning:

PÕ, é, não vai rolar, a não ser que vc mude o atributo da classe pai para “protected”, dae vai…

Mas se mal lhe pergunte, pra que vc quer fazer isto… pq o atributo da classe pai estará sempre nulo… e não irá alterar nada… ou vc pode usar o set da classe pai dentro do contrutor da classe filha, sem problemas

Eu queria fazer o seguinte, usar o super na filha, ai quando eu fosse instanciar eu faria:

Filha obj= new Filha(argumento tratamento, argumento numero)

Minha idéia é reaproveitar o código, pois isso é um exemplo, minha classe real tem uns 10 atributos então eu poderia reaproveitar todos esses set’s da pai em duas classes que eu iria criar, além de usar as arguments exceptions que eu iria implementar na classe pai entende.

Então… acho que vc está se confundindo… mas para isto que vc quer dá sim… e tô pra te dizer que para isto que tem esta parada de reaproveitar o construtor… vc só se confundiu um pouco… olha o exemplo:

[code]
public abstratc class Pai{
private String tratamento;

public Pai(String tratamento){
this.tratamento = tratemento;//vc pode setar direto, não precisa usar o set, mas se quizer usa-lo pode.
}
}

public class Filha extends Pai{
private String qqCoisa;

public Filha(String qqCoisa, String tratamento){ // olhe que aqui vc tem um parametro “tratamento”
super(tratemento);//por vc ter um parametro tratamento, o compilador vai entender
this.qqCoisa = qqCoisa;
}
}[/code]

ah entendi, então eu preciso passar no construtor da filha um parametro que será argumento da classe super

Realmente, faz sentido

Valeu Bruno!

[quote=thinet]ah entendi, então eu preciso passar no construtor da filha um parametro que será argumento da classe super

Realmente, faz sentido

Valeu Bruno![/quote]

Isto mesmo, senão o compilador acha que vc tá tentando usar o atributo da classe pai…