Duvida orientaçao a objetos

9 respostas
G

bom pessoal, gostaria da ajuda de pessoas experientes para entender melhor sobre esse assunto, sou novo em programaçao e to "apanhando" hehe... tenho um exercicio q diz o seguinte:

Escreva uma classe em Java chamada DVD para representar filmes em DVD. A classe tem dois atributos: o título do filme e o valor do aluguel por dia. Chame esses aatributos "titulo" e "valor". Deve haver um método para que um programa "fora" da classe descubra o titulo da fita e o valor do aluguel por dia. Tambem deve haver um método público getValorAluguel(int numeroDeDiasAlugado) que retorne o valor do aluguel deste filme se for alugado um certo número de dias (este número de dias é passado como parâmetro). Crie um construtor adequado para a classe.

meu codigo ficou o seguinte:

package exercicio;
import javax.swing.*;

public class DVD
{
    private String titulo;
    private int valor;

    DVD ()
    {
        this (null,0);
    }

    DVD (String titulo, int valor)
    {
        setTitulo (titulo);
        setValor (valor);
    }

    public void setTitulo (String titulo) {this.titulo = titulo;}
    public void setValor (int valor)  {this.valor = valor;}

    public String getTitulo ()  {return titulo;}
    public int getValor ()  {return valor;}

    public String getDados ()
    {
        return ("Título do DVD: " + getTitulo () + " - Valor do DVD: " + getValor ());
    }

    public static void main(String[] args)
    {
        DVD x1 = new DVD ();
        DVD x2 = new DVD ("NOME", 20);
        
        JOptionPane.showMessageDialog (null, x2.getDados());
    }

}

ficou faltando a parte do getValorAluguel(int numeroDeDiasAlugado) .......... eu fiz uma funçaozinha pra ele mas ta dano pau
porisso decidi procurar ajuda =/ o codigo defeituoso ta assim ate agora:

public int getValorAluguel (int NumeroDeDiasAlugado)
    {
        String aluguelA;
        int aluguel1;

        aluguelA = JOptionPane.showInputDialog ("Quantos dias de aluguel?");
        aluguelA = Integer.parseInt (aluguel1);
        return (aluguel1);
    }

dai colocaria um if pra caso do aluguel ser maior q 1 dia... se alguem tiver paciencia de ler e puder ajudar eu agradeço ^^

9 Respostas

Frantic_Avenger

Olá, não li seu código com atenção mas voce colocou seu método getValorAluguel(int numeroDeDiasAlugado) dentro de uma outra classe? E também não seria melhor colocar seu método main () numa classe que não seja a classe DVD? Qq dúvida só postar.
Flw.

sergiotaborda

Várias coisas. Olhe os comentários no codigo

package exercicio;
import javax.swing.*;

public class DVD
{
    private String titulo;
    private int valor;

    DVD (String titulo, int valor) // este construtor é adquado
    {
        this.titulo = titulo;   // nada de chamar os set. Construtores não chamam métodos polimorficos.
        this.valor = valor; 
    }

    public void setTitulo (String titulo) {this.titulo = titulo;}
    public void setValor (int valor)  {this.valor = valor;}

    public String getTitulo ()  {return titulo;}
    public int getValor ()  {return valor;}

    public String toString() // toString é um método padrão para este tipo de coisa
    {
 // não precisa dos parentesis rodeando 
        return "Título do DVD: " + getTitulo () + " - Valor do DVD: " + getValor ();
    }

    public static void main(String[] args)
    {
        DVD x1 = new DVD ("Nome A", 30);
        DVD x2 = new DVD ("Nome B", 20);
        
        JOptionPane.showMessageDialog (null, x2.toString());
    }

}

A função é um desastre.
O valor do alugar já está na classe. Não precisa de perguntá-lo a ninguem.

E o numero de dias é perguntado no main e passado como parametro
public int getValorAluguel (int NumeroDeDiasAlugado)
    {
        return valor * NumeroDeDiasAlugado;
    }
public static void main(String[] args)
    {
        DVD x1 = new DVD ("Nome A", 30);
        DVD x2 = new DVD ("Nome B", 20);
        
        System.println(x2.toString());

        System.println("aluger para 30 dias é " + x2.getValorAluguel (30));   
    }

}

Não precisa de nenhum if.

M

Bem vindo ao fórum!

  1. Não use int para representar valores monetários. Use double no tipo da variável preço e corrija o getter e o setter.
  2. Tudo que você precisa fazer é retornar a multiplicação de um número pelo outro:
public double getValorAluguel (int numeroDeDiasAlugado) {
    return numeroDeDiasAlugado * valor;
}

Mas aí você pode se perguntar: “Ué, mas o números de dias não vai ser lido?”. E a resposta é “Vai, mas não pela sua classe DVD”. Você vai ler esse valor dentro do seu método main e somente vai passar o valor lido como argumento para seu método que calcula o preço para X dias.

tkx

Olá!
Não há necessidade do construtor vazio!
Deixe somente o construtor cheio (q vc passa o nome do dvd e valor).
Outra coisa: não use setters públicos, defina diretamente na variável! Com esse setter público vc vai permitir que uma classe externa mude tanto o título do dvd como o valor do aluguel, o que não é desejável!
no construtor, coloque:

this.titulo = titulo; this.valor = valor;
Dae se vc quiser criar uma entrada vazia, chame o método DVD(null,0);
a fção do valor do aluguel:

int getValorAluguel(int numDias){ return this.valor*numDias; } //pro usuario passar a qtd de dias int qtdDias(){ String aux = JOptionPane.showInputDialog("qts dias aluguel?"); try{ int a = Integer.parseInt(aux); JOptionPane.showMessageDialog(null,"Aluguel: R$ "+ aux + ",00","Valor",JOptionPane.INFORMATION_MESSAGE); return a; }catch(NumberFormatExpception e){ JOptionPane.showMessageDialog(null,"Somente numeros inteiros","Erro",JOptionPane.ERROR_MESSAGE); return qtdDias(); }catch(NullPointerException e){ JOptionPane.showMessageDialog(null,"Somente numeros inteiros","Erro",JOptionPane.ERROR_MESSAGE); return qtdDias(); } //agora basta chamar o método assim no main //getValorAluguel(qtdDias());

M

Quem disse? Então o princípio de JavaBeans (construtor padrão e getter/setters públicos) está errado?

Esses valores podem perfeitamente ser variáveis. Por exemplo, pode haver um reajuste no preço do aluguel do filme. Eu preciso criar um filme novo informando o título e o novo preço? Se houver um setter público não.

O que você disse só é válido para classes imutáveis (como String), o que não é o caso.

G

poxa valeu pessoal, sempre fiquei com receio de pergutar algo e receber aquele link do dever de casa rsrs
mas eu ja tava ficando louco com isso, esse toString eu num conhecia, vou até pesquisar agora sobre ele
muito obrigado mesmo, um dia qro conseguir programar como vocês hehe

tkx

Marco Biscaro, digo no contexto da aplicação!
E os princípios de encapsulamento e ocultação de código?

Deve-se expor o mínimo possível o código!

Veja que não está no escopo da aplicação manipular dados dos filmes! Então, porque deixar a brecha?

Deve-se observar estes detalhes! Inclusive os manuais da Caelum frisam constantemente estes conceitos de encapsulamento!

M

Agora entendi…

É que você disse: “não use setters públicos”, poderia ter especificado “no seu caso” (do jeito que você falou parecia que usar setters era uma má prática de programação).

tkx

É verdade…
me expressei mal! :oops:
Então fica retificado: no caso específico, não usar setter! Caso o escopo do problema seja ampliado e haja necessidade de se alterar título do dvd e valor de locação, ae sim, use setters!

Criado 16 de março de 2010
Ultima resposta 16 de mar. de 2010
Respostas 9
Participantes 5