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).
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 =(
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)
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;
}
}
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.
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.
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.
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);
}
}