2010-12-29 13 views
14

Tengo una interfaz Interface1. Tengo su implementación Imple implements Interface1 (todos los métodos se han implementado :)).Si llamo a un método de interfaz, ¿obtendrá el cuerpo del método de la clase de implementación y se ejecutará?

Ahora, consideremos una tercera clase CheckCall, puedo hacer una llamada en la clase CheckCall como menciono a continuación:

Interface1 interface1; 
interface1.method(); 

Todas las importaciones necesarias se han hecho. Por favor dígame si es posible o no, si no, entonces está bien y si es así, dígame qué sucederá si tengo más de una implementación de clases para la misma interfaz y estoy haciendo la misma llamada.

Respuesta

14

Bueno, no se puede llamar al método directamente en la interfaz, pero puede hacer lo que escribió, más o menos.

Usted escribió:

Interface1 interface1; 
interface1.method(); 

Esto funcionará si usted hace esto:

Interface1 interface1 = new CheckCall(); 
interface1.method(); 

entonces dime lo que sucederá si i tener más de una clases impl para la misma interfaz y estoy haciendo el misma llamada

Bueno, eso es lo bueno de Java: el problema que usted se refiere se llama el "problema de diamante":

http://en.wikipedia.org/wiki/Diamond_problem

Y no existe realmente en Java Java porque es totalmente compatible con la herencia múltiple , pero solo a través de "herencia de interfaz múltiple (Java)" (* ver comentario).

Así, en su caso, cuando se llama a interface1.method() O estás llamando Impl 's método o CheckCall' s método y no hay confusión posible.

+0

En cuanto a la herencia múltiple, ** ** CUALQUIER OOA/OOD puede ser traducido limpiamente a la POO en Java utilizando sólo "la herencia de interfaces". Diablos, cualquier OOA/OOD podría traducirse trivialmente a un lenguaje que ni siquiera tendría el concepto de * "herencia de implementación" * (también conocido como * "reutilización de código" *, que realmente no tiene mucho que ver con OO) . Sin embargo, algunas personas no entienden que Java sea totalmente compatible con MI ... :( – SyntaxT3rr0r

+0

OK, entonces, ¿de qué manera difiere su respuesta de todas las otras respuestas que al parecer rechazó? Porque no puedo ver la diferencia, aparte de la enlace de la wiki que usted agrega. –

+0

@Sean Patrick Floyd: la gente puede rechazar las respuestas en SO? – SyntaxT3rr0r

0

No, debe realizar la llamada en el objeto que implementa la interfaz, no en la interfaz misma.

Editar: Se podría usar una variable con ese tipo pero todavía tendría que ser una clase que implemente ese tipo. No puedes crear una instancia de una interfaz.

5

Sí, pero no como lo tiene escrito. Habría que decir:

Interface1 interface1 = new Imple(); 

Puede crear una variable de tipo de interfaz y, a continuación, crear una instancia a la clase que implementa la interfaz. Usted ve esto muy a menudo con las colecciones de Java, por ejemplo:

List<String> a = new ArrayList<String>(); 
0

Como no se puede instanciar una interfaz, que tendrá que crear un objeto Imple, permite utilizarla como una Interface1 uno como este:

Interface1 interface1 = new Imple(); 

interface1.method(); 

de hecho, un interés principal interfaz de provenir de la capacidad de tener un método devuelve ningún objeto su aplicación, sin tener que preocuparse acerca de la aplicación dada. en su caso, podría aparece como

public class CheckCall { 
    public Interface1 factoryMethod() { 
     return new Imple(); 
    } 

    public void test() { 
     Interface1 used = factoryMethod(); 

     used.method(); 
    } 
} 
1

En realidad, se debe hacer referencia al método por las interfaces que los definen, pero se necesita una clase de implementación real. Así que normalmente lo haría así:

// the variable is of type Interface1 
Interface1 interface1 = new Imple(); 
// but the method will be executed on the Imple object 
interface1.method(); 
7

¡Claro, su código funciona bien! Solo tiene que inicializar su variable interface1 con una implementación real (es decir, nueva Imple()).

Salida este ejemplo, he utilizado los nombres de clase:

public class CheckCall { 

    interface Interface1 { 
     void method(); 
    } 

    static class Imple implements Interface1 { 
     @Override 
     public void method() { 
      System.out.println("Imple.method1()"); 
     } 
    } 

    public static void main(String[] args) { 
     Interface1 interface1; 
     interface1 = new Imple(); 
     interface1.method(); 
    } 

} 
Cuestiones relacionadas