Hola calderas.
Realmente lo veo muy bien. Has podido crear las 7 clases solicitadas en el ejercicio haciendo uso de las relaciones de herencia mediante la palabra clave "extends", así que muy bien por ello!. Podrías adjuntar un esquema de las relaciones de herencias, quedaría muy bien.
También ha habido una cosilla que paso a comentarte y que habría que corregir para cumplir con la consigna del ejercicio propuesto, y realmente gozar de las bondades de la herencia.
Fíjate que el enunciado del ejercicio nos dice:
...por ejemplo los productos congelados deben llevar la temperatura de congelación recomendada.
entonces, como todos los productos congelados tendrán un campo 'temperaturaCongelación', en vez de definirlo como campo de instancia de cada una de las clases hijas (CongeladoNitrogeno, CongeladoAire, y CongeladoAgua), lo definimos como campo de instancia en la clase padre Congelado. De esta manera -y gracias a la herencia- cada una de las clases hija hereda el campo 'temperaturaCongelación'. Estaremos de esta forma evitando crear un mismo campo en cada una de las clases hija (no duplicaremos código), es una de las bondades de la herencia.
¿Y cómo podría luego acceder en una clase hija (por ejemplo CongeladoAgua) a su campo 'temperaturaCongelación'? pues a través del método públicos setTemperaturaCongelacion y el método público getTemperaturaCongelacion que se debería implementar en la clase Congelado.
Incorporando esta declaración de campo, la clase Congelado debería quedar:
public class Congelado
{
private double temperaturaCongelación;
//constructor
//metodos set y get
//otros métodos
}
Y por lo tanto las clases hijas, por ejemplo la clase CongeladoAgua:
public class CongeladoAgua extends Congelado
{
//constructor
//metodos
}
Y como último, hacerte una sugerencia en cuanto a los nombres que elegimos en la declaración de los campos. En la clase Envio defines dos campos, uno que corresponde al nombre de la lista de envío (tipo String), y otro campo que corresponde a una lista ArrayList donde se cargarán los productos.
Al campo tipo String sería mejor renombrarlo por 'nombreListaEnvio', que con solo leerlo ya nos sugiere que es el nombre de la lista. El nombre que elegiste 'listaEnvios" leído sin ser uno el que realizó el código podría sugerir que hace referencia al ArrayList, y generar confusión.
Es bueno ir acostumbrándonos a nombrar los campos de tal manera que nos dé una información certera de qué se trata.