I tipi raw (grezzi)
- Per retrocompatibilità è possibile istanziare una classe generica senza specificare il tipo parametrico
Pila <Integer> p1 = new Pila <Integer> (10);
Pila p2 = new Pila (10);
- E’ possibile assegnare un’istanza con tipo parametrico a una con tipo raw
p2 = p1;
p1 = p2;
Ricorsione in Java

Pensare ricorsivamente
- Dato un problema, bisogna identificare
- I casi base
- Il passo ricorsivo
Ex. Fattoriale
public int fattorialeRicorsivo(int n)
{
if (n == 0) return 1;
return n*fattorialeRicorsivo(n-1);
}
public int fattorialeIterativo(int n)
{
int v = 1;
for (int k = 1; k <= n; k++) v *= k;
return v;
}
L’idea della ricorsione
- Sequenza di chiamate ricorsive:

- Valori restituiti da ciascuna chiamata

Come funziona?
- Ogni volta che viene effettuata una chiamata a un metodo viene creato un nuovo ambiente, detto record di attivazione
- Un record di attivazione contiene la zona di memoria per le variabili locali del metodo e l’indirizzo di ritorno al metodo chiamante
- A ogni chiamata, il record corrispondente viene aggiunto sullo stack
- Lo stack è la pila dei record di attivazione delle chiamate annidate effettuate
Mutua induzione
- A volte può verificarsi i caso in cui il metodo a richiami b e b, a sua volta, richiami a
- Questo meccanismo di reciproca chiamata è detto mutua ricorsione
- Ovviamente è sempre necessario stabilire uno o più casi base, onde evitare un ciclo infinito di chiamate tra a e b
- Usando la classe
System.out
(oggetto dello standard output)
- E’ un campo statico, pubblico, final di System di tipo
java.io.PrintStream
(estende java.io.OutputStream
)
java.io.PrintStream

- Usando la classe
java.util.Scnner
costruita con la standard input stream_
System.in
è un campo statico, pubblico, final, di System di tipo java.io.InputStream
Scanner s = new Scanner (System.in);
int k = s.nextIn();
System.out.println ("Hai disgitato: " + k);
String string = s.next();
System.out.println ("Hai digitato: " + string);
Stream
- E’ un’astrazione derivata da dispositivi di input o di output
- Uno stream di input riceve uno stream di caratteri “Uno alla volta”
- Uno stream di output produce uno stream di caratteri
- Non si applicano solo ai file, ma anche a dispostivi i/o, internet, ecc…
- Un file può essere trattato come uno stream di input o output
- In realtĂ i file sono bufferizzati per questioni di efficienza
Quattro gerarchie di classi in java
- Per leggere o scrivere caratteri (16 alla volta):
- Per leggere o scrivere byte (da file binari, 8 bit alla volta)
java.io.InputStream/OutputStream
- L’accesso ai file di testo è stato semplificato in Java 5 mediante l’aggiunta di una classe
java.util.Scanner
- Che tuttavia è più lenta proprio perché più potente

FileReader
e BufferedReader