Premessa: per provare il funzionamento degli oggetti definiti nell'esempio, creare una classe Main che contiene il metodo main. Il metodo main inizializzera' gli oggetti, stampera' i risultati, .... Definire una classe Stack che ha un costruttore public Stack(int dim) che crea uno stack che puo' ospitare al piu' dim oggetti. Aggiungere a Stack un metodo void push(Object o) che aggiunge allo Stack un oggeto. Aggiungerre anche dei metodi pop() e top(). Aggiungere a Stack un metodo toString() che ritorna una stringa che rappresenta tutti gli oggetti contenuti nello stack. Creare delle sottoclassi IntegerStack e StringStack che rappresentano gli stack di interi e di stringhe. IntegerStack e StringStack hanno lo stesso costruttore e gli stessi metodi di Stack: l'unica differenza e' che il metodo void push(Object o) verifica che l'oggetto in ingresso sia del tipo giusto ed, eventualmente, stampa un messaggio di errore sullo standard error. Aggiungere a IntegerStack e StringStack un metodo sum() che nel caso degli interi calcola la somma di tutti i valori sullo stack e nel caso delle stringhe crea una concatenazione di tutte le stringhe. Creare una classe StackStack (sottoclasse di stack) che contiene nella sua pila altri stack. Aggiungere a StackStack un metodo numberOfObjects() che ritorna il numero degli oggetti contenuti nello stack contando anche quelli eventualmente contenuti nei sottostack. Per semplicita', si assuma che gli unici oggetti che possono essere contenuti in StackStack sono del tipo IntegerStack, StringStack o StackStack. Si faccia in modo da tenere il conto del numero degli oggetti Stack che possono essere creati. Nel caso di un tentativo di creare piu' di 5 stack si scriva un messaggio di errore. Infine, si introduca in Stack il metodo finalize(). Tale metodo viene chiamato dalla VM prima di riallocare lo spazio occupato da un oggetto. Usare finalize() per tenere il conto degli Stack che non sono piu' in uso. Si faccia in modo che si possano costruire piu' di 5 Stack purche' non ce ne siano in uso piu' di 5. (Suggerimento: puo' essere utile chiamare esplicitamente il garbage collector con System.gc() in modo da forzare la VM a riallocare lo spazio occupato dagli oggetti non piu' in uso. )