È possibile definire classi anonime che implementano un’interfaccia o estendono una classe. Sono utilizzate esclusivamente per creare un’unica istanza.

Ad esempio sono utili per creare iteratori al volo.

TipoDaEstendereNonAnonimo unicoRiferimentoAOggetto = new TipoDaEstendereNonAnonimo()
{
	// codice della classe anonima
}

Esempio:

public interface Formula
{
	double calculate(int a);
	default double sqrt(int a) { return Math.sqrt(a); }
}
 
 

Da Java 8 è disponibile l’annotazione @FunctionalInterface, che garantisce che l’interfaccia sia dotata esattamente di un solo metodo astratto.

@FunctionalInterface
public interface Runnable
{
	void run();
}

Sono necessarie per definire espressione lambda.