Acesso a menbros de classes abstract

Olá galera

Gostaria que alguém esclarece uma dúvida minha. Pois bem vamos lá. Criei um pacote e dentro duas classes. Uma com o modificador não-referente abstract e outra concreta. Sei que uma classe abstract não pode ser instanciada jamais em uma classe concreta. Eis a minha experiência.

Minha classe abstract

package java_6_Cap1;

public abstract class CarroAbstrato {

    abstract void calcularConsumo();
    abstract void calcularVelocidade();
    void imprimirMensagem() {
       System.out.println("Estamos na classe Carro");
    }

    

}

Vou estendê-la a partir de outra classe em outro pacote



import java_6_Cap1.CarroAbstrato;

public class TesteCarroAbstrato extends CarroAbstrato {
   
   void calcularVelocidade(){}
   void calcularConsumo(){}
}

class Teste {

	public static void main(String...args) {
	
	TesteCarroAbstrato tc = new TesteCarroAbstrato();
   
       	System.out.println(tc.imprimirMensagem());
   	
      
   }

}

O que acontece pessoal é que o compilador reclama que a classe TesteCarroAbstrato não é uma classe abstract e não pode sobrescrever o método calcularVelocidade(). Se coloco as duas em um mesmo pacote roda direitinho. Posso concluir então que somente é possivel rodar um programa que tenha uma classe concreta estendendo uma classe abstrata desde que as duas estejam no mesmo pacote? Ou se estiver errado, alguém poderia apontar onde está o errro e onde posso corrigir.

Estou aguardando um feedback. Obrigado por enquanto

eu acho q o problema esta na visibilidade das funções, coloque-as seus arquivos em um mesmo pacote ou declare as funções abstratas como publicas

Olá quikko

Não tem problema de visibilidade não e vc está certo dentro do mesmo pacote o programa roda direitinho. O problema é quando vc importa uma classe abstract e estende ela a partir de uma classe concreta. Ai gera a exception que eu te falei. Mas valeu cara pela ajuda. Deus te abençõe

Coloque o modificador protected nos métodos para que classes fora desse pacote que herdam essa classe também herdem os métodos

É só declarar como público os métodos da classe CarroAbstrato.

Fica assim:

[code]

public abstract class CarroAbstrato {

public abstract void calcularConsumo();
public abstract void calcularVelocidade();
public  void imprimirMensagem() {
   System.out.println("Estamos na classe Carro");
}

}

public class TestaCarroAbstrato extends CarroAbstrato {

@Override
public void calcularConsumo() {
	// TODO Auto-generated method stub
	
}

@Override
public void calcularVelocidade() {
	// TODO Auto-generated method stub
	
}

	public static void main(String[] args) {

 TestaCarroAbstrato tca = new TestaCarroAbstrato(); 
 
 tca.imprimirMensagem();
		
	   
	   	[/code]

Abraço;

Perfeito ederson, havia esquecido desse pequeno detalhe. Os métodos que eu havia declarado na classe abstract CarroAbstrato estavam com nível de acesso default, por mais que a classe estivesse com acesso public, meu métodos jamais seriam sobreescritos devido a visibilidade em outra classe de outro pacote. São esses pequenos detalhes que podem nos levar a loucura na hora da prova.

Obriagdo amigo e que Deus te abençoe na hora que tu fores fazer a prova

Problema resolvido galera, vejam o recado que mandei para ederson no último post dess tópico