2015-04-21 31 views
5

Stavo leggendo attraverso uno dei lambda tutorial di espressione di Oracle, e mi sono imbattuto il seguente codice:È possibile implementare un'interfaccia durante l'inizializzazione?

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html

public class RunnableTest { 
    public static void main(String[] args) { 

    System.out.println("=== RunnableTest ==="); 

    // Anonymous Runnable 
    Runnable r1 = new Runnable(){ 

    @Override 
    public void run(){ 
     System.out.println("Hello world one!"); 
    } 
    }; 

    // Lambda Runnable 
    Runnable r2 =() -> System.out.println("Hello world two!"); 

    // Run em! 
    r1.run(); 
    r2.run(); 
    } 
} 

La mia domanda è perché non hanno implementare Runnable durante la creazione della classe? Dal momento che hanno sovrascritto il metodo run durante l'inizializzazione di r1, si è occupato dell'attuazione?

+1

Credo che fosse nel contesto di un tutorial che stavano facendo per dimostrare le varie opzioni disponibili. – CalebB

risposta

2

Sì, questo è chiamato una classe anonima in Java.

https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

È possibile implementare un'interfaccia o estendere una classe quando si utilizza l'operatore new, che creerà una nuova istanza della sottoclasse senza nome si definisce in quel momento. Viene utilizzato principalmente quando si scrive codice da utilizzare in un altro thread o come callback, poiché si ottiene solo l'istanza.

La nuova sintassi lambda in Java 8 sostituisce le classi anonime per le interfacce con un singolo metodo, come Runnable o le interfacce in java.util.function. Questo è quello che stanno dimostrando nell'esempio.