Como eu poderia começar a fazer isso?
Defina a classe ProdutoPerecivel (subclasse de Produto), que deve possuir um atributo extra dataValidade. A classe ainda deve sobrepor os seguintes métodos:
retirar(), que deve ter mais um parâmetro: dataRetirada. Caso o produto já esteja armazenado a mais de dois meses, o estoque deve ser zerado, pois produtos vencidos são jogados fora. Exiba uma mensagem correspondente.
adicionar(), que somente deve adicionar produtos se o estoque estiver zerado,para não misturar produtos com diferentes datas de validade.
desde já, agradeço a ajuda!!!
Começa-se pelo começo. Qual é a sua dúvida especificamente? Como está implementada a classe Produto? Quais os outros parâmetros do método retirar()?
package atividade02;
public class Produto {
private String nome;
private int quantidade;
private double valorUnitario;
public Produto(String n, int q, double v) {
this.nome = n;
this.quantidade = q;
this.valorUnitario = v;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public int getQuantidade() {
return quantidade;
}
public void setQuantidade(int quantidade) {
this.quantidade = quantidade;
}
public double getValorUnitario() {
return valorUnitario;
}
public void setValorUnitario(double valorUnitario) {
this.valorUnitario = valorUnitario;
}
public void retirar(int quant) {
if (quant <= quantidade) {
quantidade -= quant;
System.out.println("Quantidade retirada: " + quant);
System.out.println("Nova quantidade:" + quantidade);
System.out.println("");
} else {
System.err.println("Quantidade insuficiente");
}
}
public void adicionar(int quant) {
quantidade += quant;
System.out.println("Quantidade adicionada: " + quant);
System.out.println("Nova quantidade:" + quantidade);
System.out.println("");
}
public void imprimirProduto() {
System.out.println("Nome: " + nome);
System.out.println("Quantidade: " + quantidade);
System.out.println("Valor unitario: " + valorUnitario);
}
}
package atividade02;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ProdutoPerecivel extends Produto {
private Date dataValidade;
public ProdutoPerecivel(String n, int q, double v, String data) throws ParseException {
super(n, q, v);
this.dataValidade = new SimpleDateFormat("dd/MM/yyyy").parse(data);
}
public Date getDataValidade() {
return dataValidade;
}
public void setDataValidade(Date dataValidade) {
this.dataValidade = dataValidade;
}
public void imprimir(){
imprimirProduto();
System.out.println("Data de validade: " + this.dataValidade);
}
}
Estou travado aqui!
Uma dentre várias formas de resolver…
1 - Produto
import java.math.BigDecimal;
public class Produto {
private long codigoProduto;
private String marca;
private String nomeProduto;
private int quantidade;
private BigDecimal valorUnitario;
public Produto(){
quantidade = 0;
}
/*
* Métodos do produto
*/
public void retirar(int quantidade){
if(quantidade <= getQuantidade()){
setQuantidade(getQuantidade() - quantidade);
System.out.println("\nEstoque atualizado para " + getQuantidade() + " unidades.");
}else{
System.out.println("A quantidade em estoque abaixo do valor de retirada"
+ "Quantidade atual: " + getQuantidade());
}
}
public void adicionar(int quantidade){
setQuantidade(getQuantidade() + quantidade);
System.out.println("Estoque atualizado para " + getQuantidade() + " unidades.");
}
/*
* Métodos acessores e modificadores
*/
public void setCodigoProduto(long codigoProduto){
this.codigoProduto = codigoProduto;
}
public long getCodigoProduto(){
return codigoProduto;
}
public void setMarca(String marca){
this.marca = marca;
}
public String getMarca(){
return marca;
}
public void setNomeProduto(String nomeProduto){
this.nomeProduto = nomeProduto;
}
public String getNomeProduto(){
return nomeProduto;
}
protected void setQuantidade(int quantidade){
this.quantidade = quantidade;
}
public int getQuantidade(){
return quantidade;
}
public void setValorUnitario(BigDecimal valorUnitario){
this.valorUnitario = valorUnitario;
}
public BigDecimal getValorUnitario(){
return valorUnitario;
}
}
2 - Produto Perecível
import java.util.Date;
import java.math.BigDecimal;
public class ProdutoPerecivel extends Produto{
private Date dataValidade;
/*
* Métodos do produto
*/
public void retirar(int quantidade, String dataRetirada){
int DOIS_MESES_VENCIDO = 2;
/*
* 1000 * 60 * 60 * 24 * 30 = 2592000000
* seg min h dia mês
*/
long milissegundoMes = 2592000000L;
//Date dataAtual = new Date();
Date dataAtual = configurarData(dataRetirada);
BigDecimal intervaloEmMilissegundos = new BigDecimal(
dataAtual.getTime() - getDataValidade().getTime()
);
BigDecimal meses = intervaloEmMilissegundos.divide(
new BigDecimal(milissegundoMes),
new java.math.MathContext(10)
);
if(quantidade <= getQuantidade()){
if(meses.intValue() >= DOIS_MESES_VENCIDO){
setQuantidade(0);
System.out.println("Fora do prazo de vencimento. Os produtos foram descartados!");
}else{
setQuantidade(getQuantidade() - quantidade);
System.out.println("Estoque atualizado para " + getQuantidade() + " unidades.");
}
}else{
System.out.println("A quantidade em estoque abaixo do valor de retirada"
+ "Quantidade atual: " + getQuantidade());
}
}
private Date configurarData(String dataInformada){
Date data = null;
try{
java.text.DateFormat df = new java.text.SimpleDateFormat("dd/MM/yyyy");
data = df.parse(dataInformada);
}catch(java.text.ParseException pex){
System.out.println("ERRO: conversão impossível!");
}
return data;
}
/*
* Métodos acessores e modificadores
*/
public void setDataValidade(String dataValidade){
this.dataValidade = configurarData(dataValidade);
}
public Date getDataValidade(){
return dataValidade;
}
}
3 - Controle de Estoque
import java.math.BigDecimal;
public class ControleEstoque {
public void listarProduto(Produto[] listaDeProdutos){
System.out.println("\n");
for(int produto = 0; produto < listaDeProdutos.length; produto++){
System.out.println("Código: " + listaDeProdutos[produto].getCodigoProduto());
System.out.println("Descrição: " + listaDeProdutos[produto].getMarca()
+ " " + listaDeProdutos[produto].getNomeProduto());
System.out.println("Quantidade: " + listaDeProdutos[produto].getQuantidade());
System.out.println("Valor unitário: " + listaDeProdutos[produto].getValorUnitario());
System.out.println("\n");
}
}
public static void main(String[] args){
ControleEstoque controleEstoque = new ControleEstoque();
Produto[] produtos = new Produto[3];
Produto produto1 = new Produto();
produto1.setCodigoProduto(12L);
produto1.setMarca("San Remo");
produto1.setNomeProduto("Bacia Softpack 22 litros");
produto1.adicionar(80);
produto1.setValorUnitario(new BigDecimal("14.56"));
ProdutoPerecivel produtoPerecivel1 = new ProdutoPerecivel();
produtoPerecivel1.setCodigoProduto(190L);
produtoPerecivel1.setMarca("Nestlé");
produtoPerecivel1.setNomeProduto("Iogurte sabor morango");
produtoPerecivel1.adicionar(262);
produtoPerecivel1.setValorUnitario(new BigDecimal("3.54"));
produtoPerecivel1.setDataValidade("26/05/2019");
ProdutoPerecivel produtoPerecivel2 = new ProdutoPerecivel();
produtoPerecivel2.setCodigoProduto(3145L);
produtoPerecivel2.setMarca("Zaeli");
produtoPerecivel2.setNomeProduto("Achocolatado em pó");
produtoPerecivel2.adicionar(573);
produtoPerecivel2.setValorUnitario(new BigDecimal("8.19"));
produtoPerecivel2.setDataValidade("19/04/2019");
produtos[0] = produto1;
produtos[1] = produtoPerecivel1;
produtos[2] = produtoPerecivel2;
produtoPerecivel1.retirar(10, "05/10/2019");
produtoPerecivel2.retirar(10, "15/10/2019");
controleEstoque.listarProduto(produtos);
}
}
Rodando…

Muito obrigado, valeu mesmo!!!
eu precisava manter esse método construtor
private Date dataValidade;
public ProdutoPerecivel(String n, int q, double v, String data) throws ParseException {
super(n, q, v);
this.dataValidade = new SimpleDateFormat("dd/MM/yyyy").parse(data);
}
existe outra forma de manter a data aqui, mais simplicada, sem precisar de get(), apenas para teste via método construtor?
Classes e métodos pequenos e de responsabilidade bem definida, isso é sinônimo de um código que observa a Orientação à Objetos. Apesar do construtor não ser um método, isso também vale para construtores. Se você quer ‘entupir’ o construtor de coisas para ele tomar conta (encher ele de responsabilidade), fique a vontade. A lógica está posta (mas não esgotei o conteúdo, que fique bem claro). Basta adequar às suas necessidades, ou seja, agora é contigo.