3. Il linguaggio Java


3.3 Istruzioni (parole chiave) del linguaggio Java

Di seguito sono elencate e descritte le istruzioni (parole chiave) del linguaggio Java.

abstract

Questa istruzione permette di costruire modelli "astratti" di classi e metodi, ovvero modelli che non possono essere usati direttamente ma a cui si può fare riferimento per costruire altre classi e altri metodi. Perciò, non si possono costruire oggetti con le classi dichiarate abstract, né queste ultime possono essere istanziate. Parimenti, i metodi dichiarati abstract non possono essere chiamati direttamente. Questi ultimi sono privi di corpo (body), ovvero è presente solo la loro dichiarazione e nient'altro.
Il modo per usare le classi astratte (abstract) è quello di creare sottoclassi di esse. Le sottoclassi ereditano i metodi e la struttura della loro classe superiore (superclass) astratta, ma al contarario di quest'ultima possono generare oggetti e possono essere istanziate.
Il modo per usare i metodi astratti è quello di riscriverli (override) fornendo ad essi un corpo nelle sottoclassi della classe a cui essi appartengono. Anche in questo caso, i metodi astratti impongono solo un modello di metodo, che prenderà corpo solo in una sottoclasse.
L'uso dell'istruzione abstract è subordinata alle seguenti regole:

Esempio:


import java.io.*;  // importazione delle classi di libreria per le funzioni di I/O

public abstract class Generale {

       abstract void scrivi();     /* metodo solo dichiarato, senza corpo  */
}

class Particolare extends Generale {      /* Particolare eredita tutti i metodi di Generale */

         void scrivi() { //  sovrascrittura (override) del metodo astratto: si dota il metodo scrivi() di
                         // un corpo (body)

           // uso del metodo println dalle librerie di classi di base
           System.out.println("Questo metodo ha il suo modello astratto in una superclass");
         }
}

boolean

Definisce una variabile booleana. E' anche il tipo che ritorna dall'esecuzione di un operatore relazionale (per esempio "<" o "=="). Le variabili booleane non sono numeri e non possono essere convertite in numeri con qualche forma di cast. Esempio di dichiarazione di variabili booleane con assegnamento di valore iniziale:
boolean a = true;
boolean b = false;

break

L'uso dell'istruzione è del tutto analogo a quello del C e C++. Si può però indicare una label alla quale saltare per uscire da un ciclo annidato (le label sono permesse solo nei cicli).
	esterno:  // label 
                 for(i=0; i < 100; i++) {
                      for(j = 0; j < 10; j++) {
                      ...
                      if(...) break esterno;
                      }
                 }

byte

Definisce una variabile di 8 bit con segno. E' equivalente all'istruzione "signed char" in C e C++.

case

Insieme a case e switch, l'uso dell'istruzione è del tutto analogo al C e C++.

catch

In abbinamento con l'istruzione try, catch serve per costruire individuatori (handler) di errori (exceptions) che si verificano durante l'esecuzione di un programma Java. Si vedano le istruzioni throw , try e finally.

char

Definisce un carattere UNICODE a 16 bit (numero intero a 16 bit senza segno). In effetti, Java usa il set di caratteri UNICODE. Tutti i caratteri UNICODE al di sopra del valore esadecimale 00C0 possono essere usati anche per comporre identificatori (per esempio, nome di variabili, di classi, etc.).

class

L'istruzione serve per dichiarare una classe. La classe è l'elemento fondamentale del linguaggio Java. Dichiarazione e scrittura dei metodi, dichiarazione e assegnazione di variabili, cicli, chiamata ad altri metodi, creazione e manipolazione di oggetti e quant'altro può essere fatto in Java avviene all'interno delle classi. Le istruzioni che risiedono al di fuori delle classi riguardano solo le classi stesse o le interfacce (interface), che sono collezioni di metodi astratti ereditabili dalle classi. Oltre alle istruzioni che definiscono il tipo di classe (public, private, protected, abstract), le istruzioni che si incontrano al di fuori delle classi sono import (importazione di altre classi), package (definisce a quale insieme di classi appartiene la classe), extends (definisce la classe superiore, superclass, a cui appartiene la classe), final (impedisce che la classe abbia sottoclassi), implements (definisce l'interfaccia da cui importare metodi astratti nella classe dove essi vengono implementati, ovvero vengono dotati di corpo).
I metodi delle classi sono analoghi a ciò che in C e C++ viene chiamato funzione. Ogni classe possiede un certo numero di metodi. "public static void main(String args[])" è il metodo che viene eseguito per primo quando si manda in esecuzione un programma. Esso perciò corrisponde al main del C e del C++. Se però il programma Java viene eseguito come applet (per esempio sotto Netscape), allora il primo metodo che viene eseguito non è main (che, se dichiarato, viene ignorato), ma init(). Quest'ultimo metodo appartiene alla classe Applet e dunque anche alle sottoclassi di essa. Perciò un programma applet deve contenere una sottoclasse della classe Applet ove vi sia init() che, opportunamente sovrascritto (override), dia inizio al programma applet. Segue esempio di dichiarazione di classe.

package java.awt;  /* la classe che viene definita appartiene all'insieme di classi awt */

/* in questo modulo sorgente si importano le classi seguenti; ovvero è come se esse fossero presenti in
questo stesso modulo sorgente */

import  java.applet.AudioClip;
import  java.io.*;      // si importano tutte le classi (e interfacce) del gruppo "io";

public class LeggiFile extends InputStream implements FilenameFilter {  /* la  classe LeggiFile è una
                                                                           sottoclasse di InputStream;
                                                                           inoltre eredita i metodi
                                                                           astratti del'interfaccia
                                                                           FilenameFilte

<contenuto della classe: p.e. implementazione dei metodi astratti dichiarati in FilenameFilter>

}

Un modulo sorgente Java può contenere più classi (e interfacce). Il codice compilato in bytecodes di ogni classe (o interfaccia) deve però essere contenuto in un modulo distinto su file. Perciò, una volta compilato (tramite javac), un modulo sorgente si spezza in tanti moduli di codice macchina Java quanti sono le classi e le interfacce che lo stesso modulo sorgente contiene. In un modulo sorgente non possono essere dichiarate più di una classe (o interfaccia) di tipo public. Infatti, una classe di tipo public deve essere dichiarata in un modulo (file) sorgente che abbia lo stesso identico nome della classe. Parimenti, il modulo compilato in bytecodes di una classe di tipo public prenderà il nome della stessa classe.

Tutte le classi sono derivate da una unica classe radice che è Object. Tutte le classi, eccetto Object, possiedono perciò una classe superiore (superclass). Se una classe è dichiarata senza specificare esplicitamente una classe superiore (tramite l'istruzione extends), essa sarà sottoclasse diretta di Object.

continue

L'istruzione permette di uscire da un ciclo. Il linguaggio Java, limitatamente ai cicli, consente di usare label. Per cui l'istruzione continue, seguita dalla label che specifica il ciclo esterno, consente di uscire da cicli annidati. Per esempio:

  ciclo: for(i = 0; i <100; i++) {
            for(j = 1; j < 1000; i++) {
               if (a[i] [j] ==0) continue ciclo;    // se a[i] [j] = 0, si esce dai due cicli
            }
         }

default

Insieme a switch e case, l'istruzione default è usata con le stesse modalità e funzionalità dell'omonima istruzione del C e del C++.

do

Insieme e while, l'istruzione do è usata con le stesse modalità e funzionalità dell'omonima istruzione del C e del C++.

double

Analogamente al C e al C++, specifica un float doppia precisione (64 bit).

else

Insieme a if e then, , l'istruzione else è usata con le stesse modalità e funzionalità dell'omonima istruzione del C e del C++.

extends

E' l'istruzione che permette di creare sottoclassi di una classe. Ogni sottoclasse in Java può possedere solo una classe superiore diretta (superclass). In altri termini ciò significa che nel linguaggio Java esiste solo l'ereditarietà singola. Per esempio:
class Secondaria extends Principale { ...

Nell'esempio di sopra, si dichiara la classe Secondaria imponendo che essa sia una sottoclasse della classe Principale. La classe Secondaria eredita tutti i metodi della classe superiore diretta Principale.

false

Insieme a true, è uno dei due valori che può assumere una variabile booleana.

final

L'istruzione è un modificatore (modifier) in grado di rendere una classe non sottoclassabile, un metodo non riscrivibile (override) o una variabile non più modificabile (in pratica la variabile viene resa una costante). Per esempio:
import java.lang.Math;  // importazione della classe di libreria per le funzioni matematiche

final class Termine {    // la classe Termine non può avere sottoclassi, ovvero non è possibile
			// dichiarare: "class Termine2 extends Termine"

	final double coeff = 2.45;  // il valore di coeff non puo' essere modificato

	final double funzione(double x, double y) {// il metodo funzione non puo' essere sovrascritto
			double z;
			y = Math.sin(x) * Math.cos(y);  /* le funzioni cos e sin sono istanze della
								classe di libreria java.lang.Math  */
			return z;
			}

finally

Con try e catch, serve per gestire gli exceptions (errori in fase di esecuzione). Quando viene individuato un exception, finally consente che venga eseguito comunque una certa parte di codice (si veda try). Per esempio:
try {
	...
        // codice con possibilità di errore
	...
	} catch(Exception e) {
		System.out.println("Si e' verificato un errore");
    	} finally {
		System.out.println("Questo messaggio verra' comunque scritto");
	}	

finally viene eseguita sempre, anche se il blocco try {...} contiene una istruzione di return, break, continue, o throw.

float

Definisce un float singola precisione (32 bit).

for

L'istruzione for è usata con le stesse modalità e funzionalità dell'omonima istruzione del C e del C++. L'unica differenza consiste nel fatto che i cicli possono essere dotati di label, in modo che con le istruzioni continue e break si può uscire da cicli annidati.

if

Con then ed else, l'istruzione if è usata con le stesse modalità e funzionalità dell'omonima istruzione del C e del C++.

implements

L'istruzione implements permette ad una classe di ereditare i metodi astratti di una o più interfacce (interface). Con l'uso delle interfacce, Java, che permette solo l'ereditarietà singola, può assumere parte delle caratteristiche dei linguaggi che consentono l'ereditarietà multipla. Esempio:
class Particolare extends Generale implements Interfaccia1, Interfaccia2 {

A differenza dell'istruzione extends, che consente di specificare solo una classe superiore (superclass), l'istruzione interface permette di specificare più interfacce.

import

L'istruzione permette ad una classe Java di fare riferimento ad altre classi (o interi packages) oltre quelle contenute nel package a cui essa appartiene. Se per esempio di vuole usare la classe java.net.socket da una classe A che non appartiene al package java.net, bisognerà specificare nel modulo sorgente della classe A:
import java.net.socket;

Se invece, più in generale, si specifica:

import java.net.*;

si "importa" tutto il package java.net. Si può anche usare un metodo alternativo all'istruzione import per "importare" una classe:

acme.project.FooBar obj = new acme.project.FooBar();

instanceof

E' una istruzione che opera sugli oggetti. Essa verifica se un oggetto è istanza di una determinata classe o delle sottoclassi di quest'ultima. Esempio:
if (manometro  instanceof  StrumentiMisura) {      /* verifica se manometro e' un oggetto di tipo	
							StrumentiMisura */

        StrumentiMisura dev = (StrumentiMisura)manometro;  /* cast di conversione analogo al C e al 
								      C++    */
          ...
    }

int

Definisce un intero a 32 bit con segno (l'intero a 16 bit con segno è char).

interface

E' l'istruzione che permette di dichiarare interfacce (interfaces). Le interfacce sono insiemi di metodi astratti, cioè privi di corpo (body). Una classe può ereditare i metodi di una o più interfacce attraverso l'istruzione implements. Nella classe i metodi astratti delle interfacce sono di norma implementati, ovvero si fornisce ad essi un corpo. Se nella classe tutti o alcuni metodi astratti vengono lasciati tali, ovvero non si fornisce ad essi un corpo, la classe diviene astratta (abstract). In quest'ultimo caso l'implementazione dei metodi sarà lasciata alle sottoclassi della classe in questione. Le interfaccce consentono al linguaggio Java di assumere parte delle caratteristiche proprie dei linguaggi ove è permessa l'ereditarietà multipla. Da notare che più classi possono implementare ciascuna in modo indipendente e diverso i metodi di una stessa interfaccia. Nella dichiarazione dei metodi in una interfaccia non si possono usare modificatori (esempio public, final, etc.). Esempio di dichiarazione e uso delle interfacce:
public interface Storing {	//  dichiarazione di interfaccia
	void freezeDry(Stream s);     // dichiarazione di metodo astratto
	void reconstitute(Stream s);   // dichiarazione di metodo astratto
}


public class Image implements Storing, Painting {  // classe che implementa l'interfacce Storing e 	
						        //  Painting	
        ...
	void freezeDry(Stream s) {	/* si da' corpo (si implementa) il primo metodo astratto 	
					    dell'intefaccia. */
             ...  // qui ci puo' essere p.e. un algoritmo di compressione dei dati dello stream s
	}
        
	void reconstitute (Stream s) {   /* si da' corpo al secondo metodo dell'interfaccia Storing */

        ...    //  qui ci puo' essere p.e. un algoritmo di decompressione dei dati dello stream s
	}
}

Una interfaccia può a sua volta ereditare metodi astratti di altre interfacce, sempre tramite l'istruzione implements.

Le interfacce possono essere usate anche come dichiaratori di tipo. In questo caso esse si comportano come classi. Per esempio:
class StorageManager {
	Stream stream;
        ...
	void pickle(Storing obj) { 	// Storing e' il nome dell'interfaccia, che viene usata come 	
					espressione sintattica di dichiaratore di tipo
	obj.freezeDry(stream);
	}
}

In questo caso la implementazione dei metodi astratti dell'interfaccia (nell'esempio Storing) deve essere fatta in qualche altra classe che implementa l'interfaccia stessa.

long

Defisce un intero lungo con segno (64 bit).

native

Dichiara un metodo nativo (native), ovvero un metodo che non è implementato in linguaggio Java, ma, per esempio, in linguaggio C. I metodi nativi non hanno corpo (body), ma sono semplicemente dischiarati:
native double lunghezza();

I costruttori (constructors) non possono essere dichiarati nativi. I metodi nativi si comportano come i metodi non nativi. Per esempio, è possibile sovrascriverli (override).

new

E' l'istruzione che serve per creare un oggetto mediante l'istanza di una classe. La dichiarazione di un oggetto, infatti, non comporta alcuna allocazione di memoria per quell'oggetto. Solo attraverso l'istruzione new si ottiene la creazione di un nuovo oggetto., che viene allocato nello heap. Quest'ultimo si libera automaticamente degli oggetti che non sono più in uso (automatic garbage collection). Nel linguaggio Java, dunque, esiste solo la possibilità di creare nuovi oggetti, e non esiste alcuna istruzione che permetta la disallocazione esplicita degli stessi oggetti, poiché essa è automatica. Per creare un oggetto, è necessario fare uso di un costruttore della classe. I costruttori sono metodi speciali che servono per inizializzare l'oggetto istanziato dalla classe. Essi hanno lo stesso nome della classe, non hanno alcun tipo di ritorno (nemmeno void) e non possono esser invocati come istanze di un oggetto. Per esempio:
import java.lang.Math;

class Mia {   // classe con costruttori di se stessa
	int a;
	double b; 

	Mia( ) {   // costruttore della classe Mia senza alcun parametro
	a = 2;
	b = Math.cos(2);
 	}


	Mia(int x) {  // costruttore della classe Mia con un parametro (int x)
	a = x;
	b = Math.sin(3);
	}

	Mia (int x, double y) { // costruttore della classe Mia con due  parametri (int x, double y);
	a = x;
	b = y;
	}
}


class Progetto {  /* classe che fa istanzia la classe Mia in nuovi oggetti; si usano i diversi costruttori 
		        della classe Mia */
		   
	int indice = 100;
	public void calcola {
	
	Mia oggettoMia1 = new Mia();
	Mia oggettoMia2 = new Mia(	indice);
	Mia oggettoMia3 = new Mia(100, 2.33);

            System.out.println(oggettoMia1.a);
	}
}

null

E' una costante predefinita che indica "nessuna istanza". Si può usare null ovunque sia necessaria una istanza e possa essere fatto un cast di qualsiasi genere di classe.

package

L'istruzione permette di specificare a quale "package" appartengono classi (ed interfacce) presenti in un modulo sorgente Java. L'istruzione package (se presente) deve precedere qualsiasi altra istruzione in un modulo sorgente Java. Solo righe vuote e commenti possono trovarsi prima di essa. Per esempio:
package java.awt;

import java.awt.peer.ButtonPeer; 

public class Button extends Components { ...

Un modulo sorgente privo dell'istruzione package verrà fatto appartenere ad un package di default senza nome.

Un package è un insieme di classi e interfacce. Tutte le classi ed interfacce presenti nel package a cui appartiene una classe (o interfaccia) sono disponibili alla classe (o interfaccia) stessa, come se tutte le classi ed interfacce fossero state compilate dallo stesso modulo sorgente. Avendo le classi una rappresentazione in codice macchina Java, i nomi dei packages specificano alla macchina Java ove trovare i files *.class che contengono i bytecodes. Infatti, le classi costituiscono i vari moduli del codice di un programma che la macchina Java deve leggere ed interpretare. Perciò i nomi dei packages indicano proprio il path ove si trovano le classi compilate degli stessi packages. Per convenzione, i nomi dei packages sono costituiti da parole separate da punti. Le parole indicano proprio gli stessi directory ove si trovano le classi compilate. Per esempio, le classi del package java.awt per default si trovano in:
../classes/java/awt/*.classes

Tramite apposite direttive è possibile cambiare il path superiore (../classes) ove l'interprete Java attinge durante l'esecuzione di un programma (per default l'interprete Java si trova in ../bin). Da notare che già in fase di compilazione vengono individuati gli errori derivati dalla mancata individuazione di una classe. Errori di questo genere sono comuni quando all'inizio del modulo sorgente viene omessa, per distrazione, l'istruzione di import relativa alla classe (o al package) a cui si fa riferimento. Ovviamente, non è necessario dare l'istruzione di import se si fa uso di classi ed interfacce tutte appartenenti allo stesso package.

Tutte le classi ed interfacce di un modulo sorgente senza nome (ovvero dove non è stata usata l'istruzione package) risiedono nel medesimo directory corrente.
Le librerie di classi Java sono tutte contenute in packages. Ogni packages risiede nell'apposito directory specificato dal nome stesso del package. Per esempio, i file *.class del package java.lang risiedono, per default, in ../classes/java/lang/.

private

Assieme a public e protected, l'istruzione private è un modificatore di accesso applicabile a metodi e variabili. I metodi e le variabili dichiarate private sono accessibili solo entro la classe alla quale essi appartengono. Siccome i metodi privati (private) non sono visibili fuori dalla classe, essi al contempo sono anche di tipo final. Ciò significa che i metodi non possono essere sovrascritti (override). Le variabili private si comporteranno da costanti fuori dalla classe a cui appartengono. Da notare che un metodo non privato non può essere reso privato sovrascrivendolo (override).

protected

Assieme a private e public, l'istruzione protected è un modificatore di accesso applicabile a metodi e variabili. I metodi e le variabili dichiarate protected sono accessibili solo alla classe a cui appartengono e alle sottoclassi di essa.
Le classi, i metodi e le variabili dichiarate senza specificare alcun modificatore di accesso (public, protected, private) sono accessibili solo nel package al quale essi appartengono. Le classi, i metodi e le variabili dichiarate senza specificare alcun modificatore di accesso (public, protected, private) sono accessibili solo nel package al quale essi appartengono.

public

Assieme a private e protected, l'istruzione public è un modificatore di accesso applicabile a classi, metodi e variabili. Le classi, i metodi e le variabili dichiarate public sono accessibili da qualsiasi altro metodo o classe. Non è possibile cambiare l'accesso public di metodo sovrascrivendo (override) il metodo stesso. Ciò significa che un metodo di tipo public rimane sempre di tipo public anche se in qualche altra classe viene sovrascritto.
Le classi, i metodi e le variabili dichiarate senza specificare alcun modificatore di accesso (public, protected, private) sono accessibili solo nel package al quale essi appartengono.

return

L'istruzione è del tutto analoga all'omonima istruzione del C e del C++. Essa specifica il parametro che viene "rimandato indietro" da un metodo. Per esempio:
public double funzione(double x, double y) {

	double z = Math.cos(x) * Math.tan (y);  
	return z;
}

short

Definisce un intero di 2 byte con segno.

static

L'istruzione static è applicabile a metodi e variabili di una classe. I metodi e le variabili dichiarati static possono essere usati come istanze dirette della classe piuttosto che come istanze di un oggetto istanziato dalla stessa classe. Metodi statici sono per esempio quelli della classe java.lang.Math. Ad essi ci si riferisce senza la necessità di creare un oggetto di tipo Math tramite l'istruzione new. Ad esempio, per calcolare il seno di x si scrive semplicemente Math.sin(x). Va notato che è comunque possibile istanziare la classe Math e dall'oggetto ottenuto istanziare la funzione sin( ). Una variabile dichiarata static è unica all'interno di una classe (non possono esistere altre variabili con lo stesso nome della variabile static).

super

L'istruzione super permette di fare riferimento a variabili e metodi della classe superiore (superclass). Per esempio, si supponga si aver sovrascritto (override) un metodo di una classe in una sottoclasse della classe (sovrascrivere un metodo di una classe significa dichiarare in una sottoclasse della classe un altro metodo con lo stesso nome, con gli stessi argomenti e che "rimanda indietro" [return] lo stesso tipo di variabile). Quando si istanzia la sottoclasse e si chiama il metodo, sarà invocato il nuovo metodo che ha sovrascritto quello dichiarato nella classe superiore. Per invocare il vecchio metodo sovrascritto dichiarato nella classe superiore, nella sottoclasse si può usare l'istruzione super. Se il metodo si chiama ad esempio calcola( ), allora con la scrittura super.calcola( ) si potrà invocare il metodo originale della superclasse.
L'istruzione super serve pure in una sottoclasse per chiamare un costruttore della classe superiore. Questo è utile per esempio per estendere i metodi di una classe attraverso una sottoclasse di essa. Di seguito è riportato il codice per introdurre nella classe java.awt.Dialog il metodo che gestisce l'uscita dalla finestra.
Class QDialog extends Dialog {

	public QDialog ( Frame f, String titolo, boolean modo) {    /* costruttore di QDialog */ 
        super(f, titolo, modo) /* si passano i parametri al costruttore della classe superiore, cioè
				Dialog. Nota: l'istruzione super deve essere la prima nel  costruttore
				della sottoclasse (in questo caso QDialog) */
	}     	

	public boolean handleEvent(Event e) {    /* metodo aggiunto */
		if(e.id == Event.WINDOW_DESTROY) {
		hide();
		}
	return false;
	}

In questo modo, si aggiunge alla classe Dialog un metodo che gestisce l'evento di uscita dalla finestra. La nuova classe QDialog contiene questo nuovo metodo. Perciò un oggetto Dialog costruito con QDialog gestisce l'evento uscita dalla finestra.

Dialog d = new QDialog(mia_frame, "Finestra di dialogo", true);
/* l'oggetto d di tipo Dialog  gestisce l'uscita dalla finestra */

switch

Insieme a case e default, l'istruzione switch è usata con le stesse modalità e funzionalità dell'omonima istruzione del C e del C++.

synchronized

E' un modificatore che permette di "bloccare" un metodo o una certa parte di codice. Un metodo (o una parte di codice) sincronizzato (synchronized) non accede a risorse finché esse sono impegnate da altri metodi. Ogni oggetto ha associato ad esso un "blocco" (lock). Pure le classi hanno ognuna il proprio "blocco".
Quando viene invocato, un metodo sincronizzato (sichronized) aspetta ad entrare in esecuzione finché non riceve il "blocco" dalla istanza corrente (o dalla classe a cui appartiene, se è un metodo statico e quindi non è stato istanziato). Quando il metodo riceve il "blocco", esso esegue il proprio codice e rilascia il "blocco".
Una parte di codice sincronizzata (synchronized) riceve il "blocco" dall'oggetto o dalla classe specificata nell'istruzione synchronized():
 synchronized(<oggetto o classe da cui ricevere il "blocco">) {

         <parte di codice con accesso sincronizzato>
} 

Esempio di dichiarazione di metodo con accesso sincronizzato:

class Mia {
	
	synchronized void mio(int i) {

	// codice del metodo sincronizzato

	}

Esempio di dichiarazione di una parte di codice che richiede accesso sincronizzato:

Class Mia {

	InputStream mio_input;

	synchronized(mio_ input) {
	
	// codice sincronizzato con mio_input
	
	}

this

Al contrario di super, this rappresenta l'oggetto corrente. In altre parole, this permette ad un oggetto qualsiasi di fare riferimento a sé stesso. Per esempio, ciò è necessario quando un oggetto deve passare sé stesso come argomento in un metodo di un'altra classe:
    class Mia {

        void mio (AltraClasse oggetto) {
            ...
            oggetto.metodo(this);
                ...

Ogni volta che un metodo fa riferimento alle proprie variabili e metodi istanziati, un this è implicito in fronte ad ognuna di essi:

    class Mia {
        int a, b, c;
            ...
        void stampa() {
            System.out.println(a + "\n");     // a == "this.a"
        }
            ...
    }

threadsafe

Una variabile (istanziata o statica) definita threadsafe non può essere modificate da alcun altro thread mentre è in uso da un particolare thread. Questo significa che una variabile definita threadsafe non può cambiare valore asincronamente (un solo thread alla volta può modificarla). L'uso di threadsafe permette di ottimizzare il codice generato dal compilatore in quanto permette di mascherare modifiche asincrone ai valori delle variabili. Il vantaggio principale consiste nel fatto che le variabili possono essere mantenute nei registri.

throw

Insieme a catch, try e finally , è l'istruzione che permette di gestire gli exception (errori in fase di esecuzione) in Java. Vedi try.

transient

La macchina virtuale Java tratta le variabili dichiarate transient come non facenti parte dello stato (persistent state) dell'oggetto. Allo stato attuale, comunque, transient non viene preso in considerazione dall'interprete Java. Solo future versioni di Java prenderanno realmente in considerazione transient.

true

Insieme a false, è uno dei due valori che può assumere una variabile booleana.

try

Con catch, finally e throw, è l'istruzione che permette di gestire gli exception (errori in fase di esecuzione) in Java.
Quando si verifica un errore nell'esecuzione di un programma java (per esempio, non si riesce ad aprire un file, oppure un argomento assume un valore errato) il codice che rileva l'errore può richiamare (attraverso l'istruzione throw) un exception. Generalmente, un exception, dopo aver generato un messaggio d'errore per l'utente, provoca la fine del thread in esecuzione. Comunque i programmi possono avere dei gestori (handler) di errore che intercettano lo exception e correggono l'errore che si è verificato, evitando così l'interruzione del thread. Alcuni exception sono richiamati (thrown) dal sistema Java in fase di esecuzione. Comunque, ogni classe può definire i propri exception e farli intervenire tramite l'istruzione throw. Per richiamare un exception è necessario usare l'istruzione throw seguita da un oggetto. Per convenzione, l'oggetto dove essere una istanza della classe Exception (o di una sottoclasse di essa). L'istruzione throw devia l'esecuzione del programma verso l'appropriato gestore (handler) dell'errore (exception) che si è verificato. Quando in un programma viene eseguita l'istruzione throw, tutto il codice successivo ad essa non viene più eseguito, e il metodo che racchiude tutto il codice non manda indietro (return) alcun valore.
L'esempio seguente mostra come creare una sottoclasse della classe Exception e come richiamare (throw) un exception.
class MiaException extends Exception {
    }

    class Mia {
        void metodo() {
            if ( /* non si verifica l'errore */ ) {
                ...
            } else {  /* si verica l'errore*/
            throw new MiaException();
            }
        }
    }

Come già preannunciato, in un programma è possibile creare un gestore (handler) in grado di intercettare gli errori (exception) che si possono verificare. A tal uopo, è necessario circoscrivere il codice che può generare un certo errore (exception) con l'istruzione try{<codice con possibilità di errore>}. Dopo try{...} seguono una o più istruzioni di catch, una per ogni classe di exception che il programma può gestire a quel punto. Per esempio:

try {
        p.a = 10;
    } catch (NullPointerException e) {
        println("p e' null");
    } catch (Exception e) {
        println("si e' verificato un altro errore");
    } catch (Object obj) {
        println("Oggetto richiamato a scopo di esempio");
    }

La dichiarazione di catch è analoga alla dichiarazione di un metodo con un solo parametro come argomento e nessun tipo di ritorno (return type). Il parametro può essere una classe o anche una interfaccia. Quando si verifica un errore (exception), il ciclo composto dalle istruzioni try e catch ricerca il parametro che combacia con la classe dell'errore che si è verificato. Il parametro combacia con lo exception quando:

Nel ciclo try/catch, viene eseguita la prima istruzione di catch il cui parametro combacia con l'errore (exception) che si è verificato. Una volta eseguita l'istruzione di catch, l'esecuzione del programma riprende dopo l'intero ciclo try/catch (ovvero non vengono prese in considerazione le altre istruzioni di catch).

Da notare che le istruzioni catch, try, throw, finally possono essere usate anche per compiti generici diversi dalla gestione degli errori. In altre parole, esse possono essere impiegate in alternativa alle istruzioni if, then, else per controllare il flusso di esecuzione in un programma. Comunque, dato l'uso specifico per cui sono state progettate, al fine di non generare confusione è caldamente consigliato usarle esclusivamente per la gestione degli errori.

void

L'uso di void è del tutto analogo al void del C e del C++.

while

Insieme a do, l'istruzione while è usata con le stesse modalità e funzionalità dell'omonima istruzione del C e del C++.