2010-10-22 15 views
26
interface TestA { 
    String toString(); 
} 

public class Test { 
    public static void main(String[] args) { 
     System.out.println(new TestA() { 
      public String toString() { 
       return "test"; 
      } 
     }); 
    } 
} 

¿Cuál es el resultado?¿Podemos crear un objeto de una interfaz?

A. Prueba
B. nula
C. Una excepción es lanzada en tiempo de ejecución.
D. compilación falla debido a un error en la línea 1.
E. compilación falla debido a un error en la línea 4.
F. compilación falla debido a un error en la línea 5.

¿Cuál es la respuesta de esta pregunta y por qué? Tengo una consulta más con respecto a esta pregunta. En la línea 4 estamos creando un objeto de A. ¿Es posible crear un objeto de una interfaz?

+11

Parece pregunta de la prueba. Por cierto, ¿por qué no lo intentas? – Kel

+7

la respuesta que obtendrías al ejecutarlo. – Bozho

+4

@Kel: ¿Tal vez quiere una explicación de por qué esto funciona? –

Respuesta

5

test debe ser la salida. Este es un ejemplo de una clase interna anónima.

Este es un patrón muy común utilizado con la interfaz Comparator como una emulación de cierres.

76

Lo que estamos viendo aquí es un anonymous inner class:

Dada la siguiente interfaz:

interface Inter { 
    public String getString(); 
} 

Puede crear algo así como una instancia del mismo modo:

Inter instance = new Inter() { 
    @Override 
    public String getString() { 
     return "HI"; 
    } 
    }; 

Ahora, usted tiene una instancia de la interfaz que definió. Sin embargo, debe tener en cuenta que lo que realmente ha hecho se define como una clase que implementa la interfaz y crea una instancia de la clase al mismo tiempo.

+2

Lo estaba buscando. Es una respuesta realmente corta y simple. +1 a su simplicidad. – amod

+0

Me pregunto por qué esto no se acepta como una respuesta. –

+1

respuesta simple y perfecta, muchas gracias – smoothumut

1

El truco no es exactamente sobre la clase interna anónima, esta prueba de impresiones causa que anula el método toString y mientras System.out.println a Object llama implícitamente su método toString.

1

Pruebe esto también ... ¡Se genera el nombre de la clase anónima!

Inter instance = new Inter() { 
    public String getString(){ return "HI"+this.getClass(); } 
}; 
-1

No sé la importancia de esta pregunta. Si esta es una pregunta de entrevista, entonces puedo decir que está bien. Pero en tiempo real no es el enfoque correcto para implementar una herencia. En respuesta a la pregunta, aquí lo que está haciendo es clase interna anónima.

Aquí están instanciar una clase y la implementación de la herencia escribiendo,

System.out.println(new TestA() { 
    public String toString() { 
     return “test”; 
    } 
}); 

y por supuesto el resultado habría test

Cuestiones relacionadas