Erro Maluco ! Herança

10 respostas
ecarmo

Galera, é o seguinte.

Eu tenho uma classe que extends uma outra.

A classe “mãe” é essa

public class CfgConfig{ public static CfgComum comum = null; /** * Metodo que Busca as Informacoes no Arquivo XML */ public static void Inicializar() { try{ CarregaConfComum(); BuscaConfiguracao(); }catch (Exception e){ System.out.println("Erro ao Carregar Configuracao : " + e.getMessage()); } } protected CfgConfig(){ } /** * Metodo que deve Ser Sobrescrito para Carregar as Configuracoes * extras as Comuns */ protected static void BuscaConfiguracao() throws ParserConfigurationException, SAXException, IOException{ System.out.println("Classe Mae"); } }

Agora essa é a classe filha

public class Configuracao extends CfgConfig{ public static CfgReceptor receptor = null; /** * Metodo Sobrescrito */ protected static void BuscaConfiguracao() throws ParserConfigurationException, SAXException, IOException{ System.out.println("Classe Filha"); } }
Só que quando eu Chamo a Classe Configuracao.Inicializar ele imprime o “Classe Mae” e não “Classe Filha”.

O que estou fazendo de Errado ???

Isso esta Acontecendo pq é STATIC ???

Valeu Galera

10 Respostas

C

se eu naum me engano, todo metodo static tem um tipo de instancia permanente na memória. se isso for verdade, então é possivel que o metodo static da superclasse esteja na memória e não o metodo da subclasse. e SE isso TBM for verdade (hehehe) provavelmente não rola sobrescrição de método static.

falei muita asneira?

[]s

Paulo_Silveira

nao existe invocacao de metodo virtual em metodos estaticos, porque metodos estaticos nao se sobreescrevem, nem faria sentido, ja que voce chama ele pelo nome da classe, nao com uma instancia na mao (eu sei q vc pode chamar com uma instnacia na mao, mas eh feio)

N

Pelo que você mostrou a classe Configuracao não tem um método Configuracao.Inicializar.

Então Configuracao herdou Inicializar da classe pai, pois o Inicializar é “public” no pai.

Então, isso é herança, qual o problema ? O fato de ser static não tem nada a ver.

:roll:

Paulo_Silveira

“net_sandro”:

Então, isso é herança, qual o problema ? O fato de ser static não tem nada a ver.

:roll:

pelo fato de ser static, a chamada eh resolvida em tempo de compilacao,d ecidindo-se qual metodo realemtne vai ser chamado
se nao fosse estatico, chamaria o da classe de baixo, que seria um override (e tambme teria de dar os news e etc)

louds

métodos estáticos em java possuem early bind em vez de late bind. Ou seja, a função a ser invocada é decidida pelo tipo estático e não durante a execução.

ecarmo

Entendi caras, value pela ajuda.

Eu fiz uma mudanças no codigo é funcionou, achei ate que "ficou legal", so que ainda tenho uma duvida, e por favor se o negocio ficou FEIO, me falem o que eu posso fazer pra ficar BONITO :lol:

Esse é o "novo" Codigo :

Classe Mãe :

public class CfgConfig{
	
	public CfgComum comum = null;

	/**
	 * Contrutor que Chama o CarregaConfComum 
	 */
	public CfgConfig() throws ParserConfigurationException, SAXException, IOException{
		this.CarregaConfComum();
	}
	/**
	 * Metodo que Carrega a Configuracao "Comum" aos Sistemas
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 * @throws IOException
	 */
	private void CarregaConfComum() throws ParserConfigurationException, SAXException, IOException{
                      .
                      .
                      .
	}
}

Essa é a Classe Filha :

public class Configuracao extends CfgConfig{
	
	private static boolean jaIniciado = false;
	private static Configuracao configuracao = null;
	
	public CfgXXX cfgX = null;
	
	
	public static Configuracao Inicializar() throws ParserConfigurationException, SAXException, IOException{
		if(!jaIniciado){
			jaIniciado = true;
			configuracao = new Configuracao();
		}
		return configuracao;
	}
	
	
	
	/**
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 * @throws IOException
	 */
	protected Configuracao() throws ParserConfigurationException, SAXException, IOException {
		this.BuscaConfiguracao();
	}
	/**
	 * Metodo que Carrega as Configuraçoes do XXXX
	 */	
	protected void BuscaConfiguracao() throws ParserConfigurationException, SAXException, IOException{ 	
                           .
                           .
                           .
                           .
	}
}

Legal agora herdou tudo certinho, consegui acessar as informacoes da mae e da filha

E usando o Singleton eu fiz permitir que só seja instanciado uma vez a Classe Configuracao, e se for instanciada novamente retorna a mesma "instancia". Fiz isso pq vai ser chamado em varios Lugares e num queria ficar executando as tarefas novamente.

Agora vai a pergunta :

Como eu posso fazer com que a Classe CfgConfig não seja possivel Instanciar. Tipo queria não permitir a intancia dela a não ser dentro do Configuracao.

N

“Paulo Silveira”:

… chamaria o da classe de baixo, que seria um override …

Desculpe, eu não vi método fazendo override na classe “de baixo” (filha!?).

:roll:

Paulo_Silveira

“net_sandro”:
Desculpe, eu não vi método fazendo override na classe “de baixo” (filha!?).

:roll:

ta aqui:

protected static void BuscaConfiguracao()

tem nas duas classes, na mae e na filha. mas metodo estico nao faz override, isso que eu quis dizer, na verdade nao ha o override mesmo :slight_smile: mas nas duas tem o mesmo nome de metodo estatico.

Ironlynx

Se não queria permitir instanciá-la em qquer lugar,pq da Herança então???Não era melhor ter feito uma soh(com seus respectivos métodos)fazendo uma superclasse genérica???Melhor definir uma interface com os métodos q deseja implementar nas classes q vc quizer…

ecarmo

Acho que me expressei mal, eu quero poder instanciar ela, só que somente na classe Configuração, pois essa classe CfgConfig é uma classe Base para todos os sistemas que eu estou fazendo e como cada modulo do sistema tem configurações especificas eu vou criar uma classe herdando a CfgConfig e implementando as novas configurações, por isso a Herança. Então a idéia é só permitir que a CfgConfig seja acessada na classe que herda.

Tive uma idéia meio toska, acho que ficou meio feia, mas eu fiz o construtor da classe CfgConfig ser protected, assim posso acessar na classe herdada mas não instanciar a classe, será que foi uma boa opção ???

Criado 18 de fevereiro de 2004
Ultima resposta 19 de fev. de 2004
Respostas 10
Participantes 6