Problemas com Herança

Estou estudando Java, e com vergonha, venho pedir essa ajuda. estava tentando fz um programinha besta envolvendo carros. e n ta dando certo. vou colar os codigos.

classe carro.

public abstract class Carro {
   	 String cor;
     String marca;
     String modelo;
   	
	public abstract void acelerar();
	
	
	public void setCor(String cor) {
	   this.cor = cor;
	}
	
	public void setMarca(String marca) {
		this.marca = marca;
	}
	
	public void setModelo(String modelo) {
		this.modelo = modelo;
	}
	
	public String getCor() {
		
		return cor;
	}
	public String getModelo() {
		
		return modelo;
	}
	public String getMarca(){
		
		return marca;
	}
}

public class Nacional extends Carro{

	
	public void acelerar() {
		System.out.println("faz 100 km/h em 15 segundos");
	}
	
	public void setCor() {
		super.setCor("preto");
		}
		public void setModelo() {
			super.setModelo("gol");
		}
		public void setMarca(){
			super.setMarca("Volksvagem");
		}

		public String getCor() {
		return	super.getCor();
		
		}
		public String getModelo() {
			return super.getModelo();
			
		}
		public String getMarca(){
		 return	super.getMarca();
			
		}

	
}

public class Importado extends Carro {

	public void acelerar() {
		System.out.println("faz 100 km/h em 3 segundos");
	}
	
		
	public void setCor() {
	super.setCor("azul");
	}
	public void setModelo() {
		super.setModelo("civic");
	}
	public void setMarca(){
		super.setMarca("Honda");
	}

	public String getCor() {
		return super.getCor();
		
	}
	public String getModelo() {
		return super.getModelo();
		
	}
	public String getMarca(){
		return super.getMarca();
		
	}
}

public class Loja {
	public static void main(String args[]) {
		System.out.println("Gostaria de ver nacional, ou internacional? ");
		Nacional n1 = new Nacional();
		System.out.println(" modelo = "+n1.getModelo());
		System.out.println(" marca = "+n1.getMarca());
		System.out.println(" cor = "+n1.getCor());
		
	}
	

}

EDIT - por favor, ao usar o tag [ code ] , lembre-se de fechá-lo com [ /code ] . Obrigado pela atenção.

vc não está sobrescrevendo os métodos da superclasse?

Cara na sua Classe carro você já coloco funcionalidade para o metodos get’s e set’s… e Como sua CLasse Nacional e Importado Herda de Carro eles já tem esses metodos (eles herdam da classe Carro) neste seu caso o único metodo que voce tem que implementar é o metodo abstract sempre que um classe herdar de classe.

que eu saiba, sobrescreve apenas os metodos abstratos né não? os demais, eu apenas digito super.metodo();

no caso dos gets… ja os sets, na classe nacional, eu sobrescrevi.

Que erro que está dando? É erro de lógica? Digo isso pq quando rodei a aplicação gerou a seguinte mensagem:

Gostaria de ver nacional, ou internacional?
modelo = null
marca = null
cor = null

Se o seu problema for o fato de estar dando null , é pq vc nao pediu pra que essas variaveis fossem setadas.
Nas subclasses vc criou métodos:

public void setCor() {
		super.setCor("preto");
	}
	public void setModelo() {
		super.setModelo("gol");
	}
	public void setMarca(){
		super.setMarca("Volksvagem");
	}

mas nunca os chamou. Portanto é de se esperar que quando imprimisse, desse tudo null.

O que vc deve fazer é remover esses métodos “setters”, que não são setters de verdade, pois não tem parâmetros de entrada. Remova os getters também, pois os métodos da superclasse serão chamados automaticamente e coloque as seguintes linhas no construtor

setCor("preto");
setModelo("gol");
setMarca("Volksvagem");

Ok?

Olá Euclides,

Não está funcionando pq voce não está setando valores para os atributos, vc está apenas dando get sem antes dar nenhum set.

O que eu lhe aconselho seria criar um construtor em cada classe filha e nele voce dar um super.setXXX e aí passar os valores desejados. Aí quando vc der um get os valores irão existir. Seguindo o meu conceito, ficaria assim o recheio da classe Nacional:

public class Nacional extends Carro
{
Nacional()
{
super.setMarca(“GM”);
super.setModelo(“Astra”);
super.setCor(“Preto”);
}

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

}

Aí na sua Classe Loja na hora q voce cria o objeto Nacional ele seta os valores que estão no construtor e quando voce dá um get ele pega os métodos da classe pai Carro.

Um conselho que te dou é tomar mto cuidado ao usar Herança, pois as vezes usar demais acaba gerando mtos problemas pois qlq mudança na classe pai afetará todas as classes filhas.

[quote=EuclidesFilizola]que eu saiba, sobrescreve apenas os metodos abstratos né não? os demais, eu apenas digito super.metodo();

[/quote]

Não, o pepino é mais grosso.

Quando vc faz uma subclasse concreta, ou seja, sem o abstract, os métodos abstratos da superclasse devem ser obrigatoriamente implementados, os demais apenas se você quiser redefeni-los. No caso de o método ter a implementação igual ao da superclasse, vc simplesmente não faz NADA. Java e qualquer linguagem orientada a objetos realiza a busca de métodos em toda a hierarquia.

Quando vc faz uma subclasse abstrata, os métodos abstract podem ou não ser implementados, se não quiser implementar, significa que vc está deixando a responsabilidade para as suas futuras subclasses.

Ok?

Valeu moçada… =D … agradeço ae a todos. desculpa o incomodo … ;D … perguntas idiotas … acontecem… eu sou ini total… to começando. agradeço a todos … tenham um bom dia… obrigado mais uma vez …

eclides seja bem vindo ao guj… mais assim qual foi sua duvida mesmo?
Uma dica como vc está apredendo é interessante vc começar a fazer programas pequenos… porem funcional… que vc entenda com mais facilidade… as vezes os programas muito grande como esse para quem está apredendo pode dificultar… e acabar desviando o foco do que é apresentado por exemplo… um programa desse vc tem que ter muita atenção em q cada classe está fazendo… e cada class na minha opniao tem linha demais… se a ideia… é aprender heraça pode fazer em um programa menor, porem funcional e q entenda com mais facilidade… quando se sentir mais seguro ai vc começa a desenvolver programas mais complexos usando o recurso de herança…

class Veiculo{
void setCor(){
System.out.println("Preto");
}
class Golf extends Veiculo{
void setPlaca(){
System.out.println("14524");
}
}

observe que usei a herança… minha class filha herdou o metodo da class pai, porem nao subscrevir o metodo… apenas definir um novo metodo somente para classe filha…

espero ter ajudado é so uma dica. vc faz tb como achar que fica mais facil para vc :D. flw!!