Hola de nuevo momo!
El objetivo de cada ejercicio es implementar lo que se a aprendido en la unidad correspondiente a cada ejercicio, y si lo complementamos con los conocimientos previamente adquiridos en unidades y ejercicios anteriores pues mucho mejor.
El objetivo en este ejercicio es aprovechar las ventajas que tenemos cuando una clase hereda de otra clase, puesto que en esta entrega estamos trabajando con lo que es la herencia (extends).
Este ejercicio pide crear tres objetos de los de los tipos ProductoFresco, ProductoRefrigerado y ProductoCongelado, (uno de cada tipo) y mostrar la información de cada objeto, por pantalla.
Tu has decidido que el usuario elija el producto que desea y también que este indique los valores de los campos de dicho objeto, esto se considera una variación en el ejercicio, la cual es aceptable siempre y cuando se mantenga en lo que es el objetivo del ejercicio. Yo podría decir que tu variación de ejercicio es aceptable de cara a tu intención, la cual es al fin y al cabo mostrar la información del o los objetos (ya que usas un bucle para repetir si se desea) por pantalla. Ahora bien, hay unos cuantos puntos a comentar y que te comento a continuación:
Clase Productos: El nombre de la clase no es adecuado por razones que ya te he comentado en este hilo:
https://www.aprenderaprogramar.com/foros/index.php?topic=1479.0 (no usar plural)
Por otra parte no has creado el método que se encargaría de mostrar la información de un objeto tipo Productos, lo que restara eficiencia al programa y mas adelante veras porque.
Clase ProductoFresco: En el constructor con parámetros de esta clase, solo has declarado dos parámetro pertenecientes a las variables que esta clase hereda de su super clase. No es que este mal, pero seria mas recomendable que cuente con los parámetros necesarios para inicializar los valores de las variables que esta hereda de su super clase + los parámetros que inicializarian el valor de sus variables propias (4 parámetros) Idem para las clases "ProductoRefrigerado" y "ProductoCongelado"
Aquí ya nos comienza a hacer falta el método que mostraría la información de un objeto tipo Productos, supongamos que en tu clase Productos disponemos de un método "verDatosProductos()" que muestra los datos de un objeto tipo Productos. Esto nos seria util para diseñar de manera mas eficiente el método que muestra los datos en esta clase, (ProductoFresco) así sustituiríamos la fracción de código:
public void mostrarProductoFresco()
{
System.out.println("Fecha de Envasado :"+getFechaEnvasado()+"\n"+"Fecha Caducidad :"+getFechaCaducidad()+"\n"+"Numero de Lote :"+
getNumeroLote()+"\n"+"Pais Origen :"+getPaisOrigen());
}
por:
public void mostrarProductoFresco()
{
super.verDatosProductos();
System.out.println("Fecha de Envasado :"+getFechaEnvasado()+"\n"+"Pais Origen :"+getPaisOrigen());
}
Idem para las clases "ProductoRefrigerado" y "ProductoCongelado".
Clase ProductoRefrigerado: Lo mismo que la clase "ProductoFresco".
Clase ProductoCongelado: Lo mismo que la clase "ProductoFresco".
Clase ProductosAgroAlimentario Una sentencia como: "import java.util.*;" mayor mente es buena usarla si vamos a utilizar la gran mayoría de las clases que contenga este package, en tu caso solo usas la clase Scanner del package util y estas cargando todas las demás clases de este package (y te puedo decir que son muchas) sin necesidad y mal gastando recursos como memoria.
En una clase con el método main, pueden coexistir otros métodos a parte del metodo main, cuyo objetivo serian servir al método main, en tu clase se puede observar un método main muy cargado al cual se les pueden hacer muchas mejoras. Por ejemplo en tu clase con main yo he creado un metodo "entradaTeclado()" el cual es utilizado por el método main, fíjate en todas las lineas de codigo que nos hemos ahorrado solo con crear y usar ese metodo.
Hay algunos conceptos que debemos tener presentes siempre a la hora de diseñar un codigo, uno de estos es el concepto de reutilizar codigo, con esto lo que se busca es hacer algo utilizando un mismo recurso varias veces siempre y cuando se pueda, antes de crear mas recursos, por ejemplo lo que aquí haces con 4 lineas:
System.out.println("Menu Productos de Empresa Agropecuaria ");
System.out.println("1. Producto Frescos");
System.out.println("2. Productos Refrigerados");
System.out.println("3. Productos Congelados");
Aqui lo hacemos con una:
System.out.println("Menu Productos de Empresa Agropecuaria\n1. Producto Frescos\n2. Productos Refrigerados\n3. Productos Congelados");
Tu codigo da la opción al usuario de continuar o salir del bucle, "s/n" pero igual sale si le pasamos una "s" mayúscula, para solucionar esto usamos el método "equalsIgnoreCase()":
if(entrada.equalsIgnoreCase("s"))
{
volver=true;
}else{volver=false;}
Para concluir, tu codigo tiene muchas cosas mas que comentar y mejorar, yo he hecho unas ligeras mejoras en dos de las clases para que las analices:
/*Se plantea desarrollar un programa Java que permita la gestión de una empresa agroalimentaria
* que trabaja con tres tipos de productos: productos frescos, productos refrigerados y productos
* congelados. Todos los productos llevan esta información común: fecha de caducidad y número de lote.
* A su vez, cada tipo de producto lleva alguna información específica. Los productos frescos deben
* llevar la fecha de envasado y el país de origen. Los productos refrigerados deben llevar el código
* del organismo de supervisión alimentaria. Los productos congelados deben llevar la temperatura de
* congelación recomendada. Crear el código de las clases Java implementando una relación de herencia
* desde la superclase Producto hasta las subclases ProductoFresco, ProductoRefrigerado y
* ProductoCongelado. Cada clase debe disponer de constructor y permitir establecer (set)
* y recuperar (get) el valor de sus atributos y tener un método que permita mostrar la información
* del objeto. Crear una clase testHerencia2 con el método main donde se cree un objeto de cada tipo
* y se muestren los datos de cada uno de los objetos creados.
Puedes comprobar si tu respuesta es correcta consultando en los foros aprenderaprogramar.com.
*/
public class Producto
{
private String fechaCaducidad;
private int numeroLote;
public Producto(String valorFechaCaducidad,int valorNumeroLote)
{
fechaCaducidad=valorFechaCaducidad;
numeroLote=valorNumeroLote;
}
public Productos()
{
fechaCaducidad="";
numeroLote=0;
}
public void setFechaCaducidad(String valorFechaCaducidad)
{
fechaCaducidad=valorFechaCaducidad;
}
public void setNumeroLote(int valorNumeroLote)
{
numeroLote=valorNumeroLote;
}
public void verDatosProductos()
{
System.out.println("Fecha de caducidad: " + fechaCaducidad + "\nNumero de lote: " + numeroLote);
}
public String getFechaCaducidad(){return fechaCaducidad;}
public int getNumeroLote(){return numeroLote;}
}
import java.util.Scanner;
public class ProductosAgroAlimentario
{
public static void main(String []args)
{
boolean volver=true;
do{
ProductoFresco productoFresco=new ProductoFresco();
ProductoRefrigerado productoRefrigerado=new ProductoRefrigerado();
ProductoCongelado productoCongelado=new ProductoCongelado();
System.out.println("Menu Productos de Empresa Agropecuaria\n1. Producto Frescos\n2. Productos Refrigerados\n3. Productos Congelados");
String entrada=entradaTeclado();
Integer menu=Integer.valueOf(entrada);
if(menu==1)
{
System.out.println("---------");
System.out.println("| Datos |");
System.out.println("---------");
System.out.println("Fecha de Caducidad :");
productoFresco.setFechaCaducidad(entradaTeclado());
System.out.println("Numero Lote :");
productoFresco.setNumeroLote(Integer.valueOf(entradaTeclado()));
System.out.println("Fecha Envasado :");
productoFresco.setFechaEnvasado(entradaTeclado());
System.out.println("Pais Origen :");
productoFresco.setPaisOrigen(entradaTeclado());
System.out.println("-------------------");
System.out.println("| Datos a Mostrar|");
System.out.println("-------------------");
productoFresco.mostrarProductoFresco();
}else if(menu==2)
{
System.out.println("---------");
System.out.println("| Datos |");
System.out.println("---------");
System.out.println("Fecha de Caducidad :");
productoRefrigerado.setFechaCaducidad(entradaTeclado());
System.out.println("Numero Lote :");
productoRefrigerado.setNumeroLote(Integer.valueOf(entradaTeclado()));
System.out.println("Codigo Organismo :");
productoRefrigerado.setCodigoOrganismo(entradaTeclado());
System.out.println("Supervision Alimentaria :");
productoRefrigerado.setSupervisionAlimentaria(entradaTeclado());
System.out.println("-------------------");
System.out.println("| Datos a Mostrar|");
System.out.println("-------------------");
productoRefrigerado.mostrarProductoRefrigerado();
}else if(menu==3)
{
System.out.println("---------");
System.out.println("| Datos |");
System.out.println("---------");
System.out.println("Fecha de Caducidad :");
productoCongelado.setFechaCaducidad(entradaTeclado());
System.out.println("Numero Lote :");
productoCongelado.setNumeroLote(Integer.valueOf(entradaTeclado()));
System.out.println("Temperatura Recomendada para Congelar :");
entrada=entradaTeclado();
productoCongelado.setTemperaturaCongelacion(entradaTeclado());
System.out.println("-------------------");
System.out.println("| Datos a Mostrar|");
System.out.println("-------------------");
productoCongelado.mostrarProductoCongelado();
}else {System.out.println("Introdusiste un Numero Fuera del Rango del Menu Vuelta a Intentar");}
System.out.println("Volver al Menu Principal s/n");
entrada=entradaTeclado();
if(entrada.equalsIgnoreCase("s"))
{
volver=true;
}else{volver=false;}
}while(volver);
System.out.println("El Sistema se ha Cerrado...");
}
public static String entradaTeclado()
{
Scanner sc = new Scanner(System.in);
return sc.nextLine();
}
}
Te recomiendo que estudies este ejercicio
https://www.aprenderaprogramar.com/foros/index.php?topic=1179.0 donde tal vez puedas encontrar algo util.
Saludos!