2011-01-03 17 views
61

¿Es posible crear una instancia de una interfaz en Java?¿Podemos crear una instancia de una interfaz en Java?

alguna parte he leído que el uso de clase anónima interna que puede hacerlo como se muestra a continuación:

interface Test 
{ 
    public void wish(); 
} 
class Main 
{ 
    public static void main(String[] args) 
    { 
     Test t=new Test() 
     { 
      public void wish() 
      { 
       System.out.println("output: hello how r u"); 
      } 
     }; 
    t.wish(); 
    } 
}  

cmd> javac Main.java 
cmd> java Main 
output: hello how r u 

Es correcto aquí?

+0

¿Por qué necesitarías eso? El objetivo de las interfaces es que los métodos vacíos se amplíen con su propia funcionalidad. – Ahmed

+6

@Ahmed: ¿para poder hacer un prototipo rápido de una implementación de interfaz? ¿O tal vez implementar un controlador de eventos, sin tener que crear una clase con nombre solo para hacer eso? Y así sucesivamente ... – rsenna

+6

Esto ya se ha preguntado aquí: http://stackoverflow.com/questions/4000062/can-we-create-an-object-of-an-interface – jjnguy

Respuesta

37

Sí, su ejemplo es correcto. Las clases anónimas pueden implementar interfaces, y esa es la única vez que se me ocurre que verá una clase que implementa una interfaz sin la palabra clave "implementa". Vea otra muestra de código aquí:

interface ProgrammerInterview { 
    public void read(); 
} 

class Website { 
    ProgrammerInterview p = new ProgrammerInterview() { 
     public void read() { 
      System.out.println("interface ProgrammerInterview class implementer"); 
     } 
    }; 
} 

Esto funciona bien. Fue tomado de esta página:.

http://www.programmerinterview.com/index.php/java-questions/anonymous-class-interface/

+0

es esta compilación sin errores, según mi conocimiento las interfaces no pueden ser instanciadas, pero en su respuesta se hace a través de la línea 'ProgrammerInterview p = new Programmer Interview() {' –

+1

en el ejemplo anterior no hemos instanciado un objeto de ProgrammerInterview pero lo que hemos hecho es utilizar ProgrammerInterview para crear referencias y luego crear un objeto de clase anónima. Esta clase anónima implementó Programmer Interview y creó el objeto de la clase anónima de una vez. –

+1

¿Pero no estás llamando 'new ProgrammerInterview() {...'? Entonces, técnicamente está haciendo una instancia de la interfaz. Todavía estoy un poco confundido sobre lo que está sucediendo aquí. – CapturedTree

4

Respuesta corta ... sí. Puede usar una clase anónima cuando inicializa una variable. Eche un vistazo a this

+0

Yo diría que no ... Porque el anónimo implementa la interfaz ... Pero no tiene la palabra clave implementa –

80

Nunca puede crear una interfaz en java. Sin embargo, puede referirse a un objeto que implementa una interfaz por el tipo de interfaz. Por ejemplo,

public interface A 
{ 
} 
public class B implements A 
{ 
} 

public static void main(String[] args) 
{ 
    A test = new B(); 
    //A test = new A(); // wont compile 
} 

Lo que hizo anteriormente fue crear una clase Anónima que implementa la interfaz. Está creando un objeto anónimo, no un objeto de tipo interface Test.

+8

Las clases anónimas no tienen nombres ... anónimo – jjnguy

+1

Se le preguntó si su ejemplo era correcto, y lo es. No estoy seguro si ha reconocido que ... – rsenna

+4

El ejemplo funciona ... pero no como él cree que lo hace. Es importante entender lo que el código realmente está haciendo. No lo llamaría "correcto" si el código es algo diferente de lo que él cree que es. –

0

Sí, es correcto. puedes hacerlo con una clase interna.

+0

Esta parece ser la más correcta de las respuestas, aunque no hay ninguna explicación. Para los programadores de Android, Google proporciona un ejemplo de una clase ** instanciando ** una interfaz interna [aquí] (https://developer.android.com/guide/topics/ui/dialogs.html#PassingEvents). –

4

Normalmente, puede crear una referencia para una interfaz. Pero no puedes crear una instancia para la interfaz.

0

Sí se puede, "clases anónimas que pueda hacer que el código sea más concisa Ellos le permiten declarar y crear una instancia de una clase al mismo tiempo, son como clases locales. excepto que no tienen un nombre "- >>Java Doc

3

No, en mi opinión, puede crear una variable de referencia de una interfaz, pero no puede crear una instancia de una interfaz como una clase abstracta.

Cuestiones relacionadas