Hola arcanFAC, en primer lugar felicitarte porque este es un ejercicio un poco extenso y se ve que lo has trabajado, y bien trabajado. Tanto el diseño (estructura) como el código en general podemos decir que están bien planteados. En algunos aspectos no has seguido exactamente lo que pedía el enunciado. Voy a comentarlo por partes.
Dentro de la clase Producto has incluido como atributos private String fechaEnvasado; y private String paisOrigen; Aunque el enunciado no lo dice explícitamente, si se lee con detenimiento son atributos de todos los productos, por tanto has hecho bien llevando esos atributos a un nivel superior, evitando la repetición en las diferentes subclases.
También has hecho bien creando la clase ProductoRefCong como abstracción que engloba todo lo común de ProductoRefrigerado y Productocongelado. Esto se corresponde con el apartado del enunciado donde dice
Crear superclases intermedias (aunque no se correspondan con la descripción dada de la empresa) para agrupar atributos y métodos cuando sea posible. Esto corresponde a “realizar abstracciones” en el ámbito de la programación, que pueden o no corresponderse con el mundo real.
En la clase CongeladoPorAire has definido estos atributos:
public class CongeladoPorAire extends ProductoCongelado{
private String nitrogeno;
private String oxigeno;
private String dioxidoCarbono;
private String vaporAgua;
Dado que los datos de composición son un %, es decir, un valor numérico, hubiera sido más adecuado declarar estos atributos como valores numéricos (por ejemplo double):
public class CongeladoPorAire extends ProductoCongelado{
private double nitrogeno;
private double oxigeno;
private double dioxidoCarbono;
private double vaporAgua;
Tener en cuenta que los String son para almacenar información textual. Si se trata de valores numéricos debemos usar un tipo numérico.
Lo mismo ocurre en las clases CongeladoPorAgua y CongeladoPorNitrogeno: deberías haber declarado los atributos como de tipo numérico en lugar de String.
Por lo que comentas esto ya lo conocías, pero si lo conocías lo lógico hubiera sido resolverlo usando los tipos numéricos
Has definido una clase de nombre Intermedio. No me parece mal. Lo único que te recomendaría es que pongas un nombre a la clase que describa lo que hace. Intermedio no describe lo que hace la clase. El nombre debería ser GestorProductos ó GestorListasProductos u otro descriptivo. Dentro de esta clase el método public void agregarProducto(String caracteristica) parece una muy buena idea para evitar la repetición de código, creo que es un buen ejemplo para que pueda ser consultado por personas que revisen ejercicios en los foros.
Te has saltado esta parte del enunciado:
Crear una clase testHerencia3 con el método main donde se creen: dos productos frescos, tres productos refrigerados y cinco productos congelados (2 de ellos congelados por agua, otros 2 por agua y 1 por nitrógeno). Mostrar la información de cada producto por pantalla.
Pero a cambio has incluido un menú y opciones que demuestran que dominas perfectamente lo que se pretendía con el ejercicio.
Aunque con algunos detalles que se podrían corregir, me ha parecido muy buen ejercicio. Mi enhorabuena.
Saludos.