Acessando atributo de superclasse

Oi pessoal, estou com essa dúvida a alguns dias, dei uma olhada em gets e sets, mas a duvida ainda permanece:
tenho uma classe e três subclasse.

na classe a pessoa digita a idade.
em uma dessas subclasses eu preciso fzer um polimorfismo, ou seja somente nessa classe eu preciso da idade para fzer um calculo diferente das outras.
A grande questão é que eu não estou conseguindo pegar esse valor e usar na subclasse =/

segue o codigo da classe e o código dessa subclasse especifica:

[code]import java.util.Scanner;

public class Cliente{

protected int idade;
private int ano;
private String mat;
private String nome;


public Cliente (int idade, int ano, String nome, String mat){
		this.idade=idade;
		this.ano=ano;
		this.mat=mat;
		this.nome=nome;

}
public Cliente(){
}
public void setIdade (int idade){
this.idade=idade;
}

	public int getIdade()
	{
		return idade;
	}
			
	public void inputDados(){
	Scanner input = new Scanner (System.in);
	System.out.println ("Digite a Matricula");
	mat = input.next();
	while (mat.length() > 5 || mat.length() < 5)
	{
	System.out.println ("Matrícula inválida.");
	System.out.println ("Digite novamente: ");
	mat = input.next();
	}
	System.out.println ("Digite o nome: ");
	nome = input.next();
	System.out.println ("Digite a idade: ");
	idade = input.nextInt();
	System.out.println ("Digite o ano de ingressão no plano");
	ano=input.nextInt();
	while (ano < 1850 || ano > 2011){
		
	System.out.println ("Digite o ano de ingressão no plano");
	ano=input.nextInt();
	}

	
}

}
[/code]

agora o da SubClasse:

import java.util.Scanner;
public class Ouro extends Cliente{
	private double preco;
	private double valor;

	
	
	public Ouro (double preco, double valor){
			this.valor=valor;
			this.preco=preco;
	}
	
	
	
	public Ouro(){
	}
			
	public double valorTotal(){
			Scanner input = new Scanner (System.in);
	
	
		System.out.println ("Digite o preço da consulta:");
			preco=input.nextDouble();
			super.getIdade();
			if (idade > 60)
			preco=0;
			else
			
			preco*=0.3;
		return valor=preco;
			}
			
					public void mostrarDados(){
		
	/*	System.out.println ("Plano ");
		System.out.println ("-----------------------------------------");
		System.out.println ("Informe eu nome e matricula: ");
		//Scanner///*/
		System.out.println ("Preço da consulta: "+preco);
		System.out.println ("Preço final: "+valorTotal());
	}
}

ele compila sem problema, mas quando eu executo, ele le até o preço e termina…ele nao faz o calculo.

Alguem pode ajudar-me por favor? grato desde ja =)

Amigão, você está usando o tipo float no preço… mas acho que o correto seria double!

Essa é a estrutura do float: 0.0f, ou 1.0f, ou 27.5f… etc e tal.
Então, se o usuário não digitar neste modelo x.xf, o programa vai travar mesmo(ou melhor, não vai funcionar corretamente xD).

Troque pelo double! :slight_smile:

na sua classe Cliente, vc deve ter o atributo idade como private e os metodos get e set como public.

PS: se sua Classe Ouro ja estende a Cliente, pq vc tem um atributo do tipo Cliente nela tbm, da uma vefiricada.

t+

Javax2011 - Obrigado pela dica, troquei pelo double, mas continua não fazendo o calculo.

Alissonvla - Fiz conforme vc comentou, coloquei idade como private e os metodos get e set como public, e tirei os atributos do tipo Cliente da classe Ouro.
Não adiantou rsrs =(

vc tem que tirar o atributo idade da classe Ouro tbm, pq vc ja vai te-la no classe Cliente.

Agora apareceu um erro ao compilar:
idade has private access in Cliente.

Eu troquei o atributo idade para protected (só pra ver c o erro permanecia), o erro sumiu, mas o problema persiste (nao faz o calculo) (eu acho q ele nao ta pegando o valor de idade)

na linha 30, vc deve colocar getIdade(), e remover a linha 29.

t+

[quote=alissonvla]na linha 30, vc deve colocar getIdade(), e remover a linha 29.

t+[/quote]

linha 30 de qualquer classe?

classe Ouro, aonde ta dando o problema

mas é na linha 30 msm?

olha minha linda 30 qual é

	return valor=preco;

no lugar de

if (idade > 60)  

deve ser

if (getIdade()> 60)  

e remova isso

super.getIdade();  

poxa, fiz isso e continua com o mesmo problema

segue

import java.util.Scanner;

public class Cliente {

	private int idade;
	private int ano;
	private String mat;
	private String nome;

	public Cliente(int idade, int ano, String nome, String mat) {
		this.idade = idade;
		this.ano = ano;
		this.mat = mat;
		this.nome = nome;
	}

	public Cliente() {
	}

	public void setIdade(int idade) {
		this.idade = idade;
	}

	public int getIdade() {
		return idade;
	}

	public void inputDados() {
		Scanner input = new Scanner(System.in);
		System.out.println("Digite a Matricula");
		mat = input.next();
		while (mat.length() > 5 || mat.length() < 5) {
			System.out.println("Matrícula inválida.");
			System.out.println("Digite novamente: ");
			mat = input.next();
		}
		System.out.println("Digite o nome: ");
		nome = input.next();
		System.out.println("Digite a idade: ");
		idade = input.nextInt();
		System.out.println("Digite o ano de ingressão no plano");
		ano = input.nextInt();

		while (ano < 1850 || ano > 2011) {

			System.out.println("Digite o ano de ingressão no plano");
			ano = input.nextInt();
		}

	}

	public int getAno() {
		return ano;
	}

	public void setAno(int ano) {
		this.ano = ano;
	}

	public String getMat() {
		return mat;
	}

	public void setMat(String mat) {
		this.mat = mat;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}
}
import java.util.Scanner;

public class Ouro extends Cliente {
	private float preco;

	public Ouro(float preco) {
		this.preco = preco;
	}

	public Ouro() {
	}

	public float valorTotal() {
		Scanner input = new Scanner(System.in);

		System.out.println("Digite o preço da consulta:");
		preco = input.nextFloat();
		if (getIdade() > 60)
			preco = 0;
		else
			preco *= 0.3;
		return preco;
	}

	public void mostrarDados() {

		/*
		 * System.out.println ("Plano "); System.out.println
		 * ("-----------------------------------------"); System.out.println
		 * ("Informe eu nome e matricula: "); //Scanner///
		 */
		System.out.println("Preço da consulta: " + preco);
		System.out.println("Preço final: " + valorTotal());
	}

	public float getPreco() {
		return preco;
	}

	public void setPreco(float preco) {
		this.preco = preco;
	}
}

t+

alissonvla muito obrigado, eu não estava colocando pra mostrar a saída por isso nunca via o resultado (e achava q ele nao fazia o calculo).
Agora o problema é que ele IGNORA meu if, e vai direto pro else…vejam.

System.out.println ("Digite o preço da consulta:");
			preco=input.nextDouble();
			if (getIdade() > 60 )
			preco=0;
			else
			preco*=0.3;
			return preco;
			}

olha sa saída do programa:

Digite a idade:
80
Digite o ano de ingressão no plano
1980
Digite o preço da consulta:
10
Preço da consulta: 3.0

Mesmo eu tenho digitado que a pessoa tem mais de 60 anos, ele pula direto pro else e faz o calculo.

cara,

não sei como vc ta fazendo, mas o mais correto seria vc separar sua regra de negocio das suas entidades, entao faça o seguinte, criei mais um classe e coloque todas as regras nela e deixe sua entidade somente com os atributos e metodos get e set.

t+

alissonvla, po cara mas isso é polimorfismo, é feito direto na classe nao? (ja que é somente nela q será feito dessa forma)

cara,

no seu codigo vc nao tem nada de polimorfismo nao, no seu codigo vc tem o conceito de herença.
da uma lida aqui nesse link

t+

alissonvla,

eu possuo 3 classes:
ouro, prata e bronze, todas elas possuem o mesmo calculo, porém exclusivamente essa eu preciso de 1 dado a mais que é a idade do cidadão…somente nessa classe esse calculo é feito de uma forma diferente, isso não é polimorfismo?

eu estava me baseando no codigo que vc postou, nesse caso que vc relatou é sim polimorfimo.
entao cara, vc vai ter idade na classe Cliente e todas outras herdam dela e depois é so instanciar suas classe filha, ouro, prata ou bronze.

posta todo seu codigo para poder te ajudar.

Então, eu só preciso usar o valor de idade na subclasse ouro. olha como o exercicio pede:
Prata - desconto de 20%
Diamente - desconto de 40%
Ouro - desconto de 30%, se idade superior ou igual a 60 anos, a consulta sai de graça.

segue a classe cliente e a subclasse ouro

CLIENTE:

import java.util.Scanner;


public class Cliente{
			
	protected int idade;
	private int ano;
	private String mat;
	private String nome;

	
	public Cliente (int idade, int ano, String nome, String mat){
			this.idade=idade;
			this.ano=ano;
			this.mat=mat;
			this.nome=nome;

}
	public Cliente(){
	}
	public void setIdade (int idade){
		this.idade=idade;
	}
	
		public int getIdade()
		{
			return idade;
		}
				
		public void inputDados(){
		Scanner input = new Scanner (System.in);
		/*System.out.println ("Digite a Matricula");
		mat = input.next();
		while (mat.length() > 5 || mat.length() < 5)
		{
		System.out.println ("Matrícula inválida.");
		System.out.println ("Digite novamente: ");
		mat = input.next();
		}
		System.out.println ("Digite o nome: ");
		nome = input.next();*/
		System.out.println ("Digite a idade: ");
		idade = input.nextInt();
		System.out.println ("Digite o ano de ingressão no plano");
		ano=input.nextInt();
		while (ano < 1850 || ano > 2011){
			
		System.out.println ("Digite o ano de ingressão no plano");
		ano=input.nextInt();
		}
	
		
	}
}

OURO:

import java.util.Scanner;
public class Ouro extends Cliente{
	private double preco;


	
	
	public Ouro (double preco){

			this.preco=preco;
	}
	
	
	
	public Ouro(){
	}
			
	public double valorTotal(){
			Scanner input = new Scanner (System.in);
	
	
		System.out.println ("Digite o preço da consulta:");
			preco=input.nextDouble();
			if (getIdade() > 60 )
			{	preco=0;
			return preco;}
			else
			{preco*=0.3;
			return preco;}
			}
			
					public void mostrarDados(){
		
	/*	System.out.println ("Plano ");
		System.out.println ("-----------------------------------------");
		System.out.println ("Informe eu nome e matricula: ");
		//Scanner///*/
		System.out.println ("Preço da consulta: "+preco);
	//	System.out.println ("Preço final: "+valor);
	}
}

Mto obrigado pela ajuda