ATTENZIONE: il nuovo sito di riferimento per questa guida e altre cose più o meno interessanti è il mio BLOG

Indice
Prossimo capitolo - La programmazione OO

Capitolo 2 - Differenze (e affinità) con il C

Tipi primitivi

I tipi primitivi in Java sono:

Tipo		Spazio occupato

Numerici:
byte		8 bit
short		16 bit
int		32 bit - sempre, a differenza del C
long		64 bit

float		32 bit
double		64 bit

Caratteri Unicode:
char		16 bit

Logici - true o false:
boolean		dipende dall'implementazione
I tipi numerici sono tutti con segno.

Tutti questi tipi primitivi possono essere "incapsulati" in degli oggetti (vedi il prossimo capitolo), ad esempio un int può essere incapsulato in un oggetto della classe Integer.

Esistono inoltre due classi, BigInteger e BigDecimal, che consentono di operare su numeri interi e decimali di precisione arbitraria - ovviamente con prestazioni di molto inferiori alle operazioni su tipi primitivi.

Dichiarazione di variabili

Una variabile in java può essere dichiarata in (quasi) qualsiasi punto, all'occorrenza:

	for(int i = 0; i < 10; i++)
		...
Inoltre java, essendo più "intelligente" di altri linguaggi, non permette di nascondere variabili:
	{
		int i;
		...
		
		{
			int i;	// ERRORE - variabile gia' definita
			...
		}
	}

Nuovo ciclo for

Java 1.5 ha introdotto un nuovo ciclo for, simile al "foreach" di altri linguaggi. Ad esempio, se prima per stampare un array di 100 int si doveva scrivere:

	for(int i = 0; i < 100; i++)
		System.out.println(array[i]);
ora basta scrivere (":" si legge "in"):
	for(int numero : array)
		System.out.println(numero);
Nel capitolo sulle collezioni vedremo l'altro uso del nuovo for.

Stringhe

In java le stringhe sono oggetti di classe String, e sono trattate in modo speciale rispetto agli altri.

Ad esempio è possibile concatenare stringhe mediante gli operatori + e +=:

	String s = "";
	s += "ciao";
Altro esempio:
	String a = "Tizio",
		b = "Caio",
		c = "Sempronio";
	System.out.println( a + ", " + b + " e " + c );

Inoltre tutte le classi sono dotate del metodo toString(), derivato da Object (vedi capitolo sull'ereditarietà), che fornisce una rappresentazione in forma di stringa dell'oggetto in questione.

Tale metodo viene chiamato (quasi) ogni volta ci sia bisogno di una stringa; ad esempio il codice:

	Integer n = 5;
	System.out.println("n vale " + n);
stampa "n vale 5" (notare uso autoboxing).

Da ciò si può vedere che il metodo printf, presente anche in java nella classe java.io.PrintStream, può essere sostituito dalla semplice concatenazione di stringhe, a meno che non si desideri una formattazione particolare.

Array

Un'altro tipo di oggetto molto particolare è l'array; ecco un esempio, la creazione di un array di 5 int, inizializzati a 0:

	int[] numeri = new int[5];
Si possono anche specificare gli elementi di un'array all'atto dell'allocazione; lo statement:
	numeri = new int[] {1,55,36};
crea un'array di tre elementi, 1, 55 e 36. Anche in java l'indice del primo elemento è 0, quindi nell'ultimo esempio numeri[0] è 1.

Una differenza fondamentale con gli array del C è il controllo in esecuzione dell'indice, quindi - sempre in riferimento all'ultimo esempio - il codice che segue lancia una ArrayIndexOutOfBoundsException:

	numeri[3] = 6;
Questo controllo può avere effetti negativi sulle prestazioni, ma il fatto di non rischiare più un buffer overflow - causa di molti problemi di sicurezza e stabilità - dovrebbe convincere tutti della bontà della sua adozione.

Allocazione della memoria

Quando in java si dichiara un oggetto, ad esempio con:

	Long l;
non si fa altro che dichiarare un riferimento - in pratica un puntatore, da usare però direttamente, "al posto" dell'oggetto. La creazione (allocazione) attuale dell'oggetto avviene con l'operatore new:
	l = new Long(7);
I tipi primitivi e le "reference" a oggetti vengono allocate sullo stack - come le variabili locali in C - mentre con new si creano oggetti e array sullo heap - come per le aree di memoria allocate con malloc in C.

Liberare la memoria

E quando gli oggetti non servono più? Vengono abbandonati, riassegnando la/le reference a qualche altro oggetto o a null:

	l = new Long(7*7); // il Long di valore 7 creato prima viene "abbandonato"
Quando un oggetto non è più raggiungibile, ovvero quando nessuna reference "punta" ad esso, diventa inutile, spazzatura, e all'occorrenza può essere cancellato dalla garbage collection (gc), un meccanismo che si attiva ogni qualvolta la situazione della memoria lo richieda. La gc può anche essere avviata esplicitamente dal programma, con System.gc().

Commenti

I commenti possono essere scritti su una o più linee, come in C/C++:

	i++; // commento inutile

	/* la seguente
		funzione
		bla, bla... */
	public void do()
	{
		...
La novità sta nei commenti javadoc:
	/** Rappresenta una persona. */
	class Persona
	{
		...

		/** Variabile importante. */
		public double bigVar;
		...

		/** Calcola il minimo tra due numeri.
		* @param n1,n2 i numeri da confrontare.
		* @return il minimo tra n1 e n2.
		*/
		public int min(int n1, int n2)
		{
			...
Questi commenti, che iniziano con /**, possono essere estratti dal sorgente mediante il tool javadoc, incluso nel JDK di Sun, per produrre una documentazione nello stesso formato di quella delle API ufficiali; è bene abituarsi a scriverli ogni volta che si ha a che fare con campi particolarmente importanti e metodi non banali, anche prima di scrivere il corpo della classe o del metodo.

All'interno di questi commenti è possibile usare tag HTML; ad esempio, per forzare un 'a capo' nel documento prodotto da javadoc si usa il tag <BR>.

Overloading

In java è possibile l'overloading dei metodi, ovvero la scrittura per una stessa classe di più metodi con lo stesso nome, ma con diversa lista di argomenti, come:

	public int max(int n1, int n2) { ... }
	public float max(float n1, float n2) { ... }
Ciò che distingue i due metodi è solo la lista di argomenti, non il tipo di ritorno.

Varargs

Da java 5 è possibile dichiarare come ultimo parametro di un metodo, liste di argomenti di lunghezza variabile; ad esempio un metodo che calcola la media di 0 (?) o più numeri di tipo float può essere dichiarato così:

	// '...' indica lunghezza variabile
	public static float media(float... dati)
	{
		float res = 0f;

		for(float num : dati)
			res += num;

		return res / dati.length;
	}
e chiamato con un numero variabile di argomenti:
	media();	// ritorna NaN, Not a Number
	media(23.2f, 45.3f, 6.9f);
	...
Dal codice del metodo si vede che dati è a tutti gli effetti un array.



Indice
Prossimo capitolo - La programmazione OO