2011-01-20 14 views
5

Como sabemos que podemos declarar solamente la firma del método y también no se puede crear la instancia de una interfaz. entonces, ¿por qué necesitamos la interfaz? Innecesario es su carga en JVM. Esta es también una degradación del rendimiento. Estamos creando la interfaz y varias clases implementando esa interfaz y definiendo todos los métodos de la interfaz. En realidad, lo que logramos de esta interfaz. ¿Podría darme algún ejemplo?por eso que necesitamos interfaz en lugar de la clase y lo que estamos logrando desde la interfaz

+1

posible duplicado de [Java: interfaz/clases abstractas/método abstracto] (http://stackoverflow.com/questions/2124951/java-interface-abstract-classes-abstract-method) –

Respuesta

9

Interfaz es que está obligando a su cliente a implementar algo específico, la implementación seguirá siendo para el cliente. También Java no es compatible con herencia múltiple al extender múltiples clases, puede tener múltiples interfaces implementadas.

Por ejemplo: List declara add(..) método toda la implementación de List proporciona implementaciones.

Simpler sería.

Defina una interfaz Animal y un método speak() significa que todos los animales deberán tener que hablar con diferentes implementaciones diferentes. El hombre hablará, el perro ladrará, el león rugirá.

¿Por qué deberíamos ir para crear la clase Animal extra? Podemos declarar el speak() en cada clase. Lo que es apropiado obtendremos de la clase Animal e implementaremos speak() en todas las subclases. Todavía no he tenido este concepto

principal ventaja es la herencia y polimorfismo [conceptos fundamentales de la programación orientada a objetos]

Estás especificar el comportamiento del animal aquí también.

Puede tener

Animal obj = new Man(); 

Animal obj = getAnimalForThisCriteria(something here);//this will return some animal at runtime so you can catch instance using Animal. 

Es posible que tenga tres clases Ma diferente, perro, león con el mismo método, pero no hay forma de saber que todos ellos son animales a menos que se extiende o se implementa la clase o interfaz común, aquí viene el concepto de estructura

+0

¿Por qué deberíamos ir para crear clase Animal extra. Podemos declarar el speak() en cada clase. Lo que es apropiado obtendremos de la clase Animal e implementaremos speak() en todas las subclases. Todavía no entendí este concepto. – Nishi

+0

Comprobar la actualización ......... –

+0

@JigarJoshi buena explicación +1 – SpringLearner

4

Tener interfaces separadas de las clases permite despejar separación entre, bueno, la interfaz de un objeto y su implementación. Sin ellos, no tendrías una forma estándar de indicar que alguna clase no debería contener ningún detalle de implementación.

En segundo lugar, ya que Java no soporta herencia múltiple, las interfaces son una solución parcial, permitiendo que la herencia de las características externas de la clase.

1

interfaces son para cuando sólo se preocupan por la capacidad de un objeto, no cómo les alcanza.

Supongamos que está escribiendo el código de control de alto nivel para un robot. No le importa cómo funciona realmente el robot, solo quiere poder avanzar, retroceder, girar a la izquierda o a la derecha, etc. Sin interfaces, implementaría una clase abstracta llamada AbstractRobot que tiene todos los métodos como métodos abstractos. En este punto, básicamente has creado una interfaz, pero en forma de una clase abstracta, pero una que es 'más pesada' de lo requerido.

Por último, una clase puede ajustarse a múltiples interfaces de, pero sólo puede heredar de una clase. Esto permite algunos patrones de diseño que se basan en la herencia múltiple.

0

Trataré de explicar esto con palabras simples.

Considere su juego de computadora favorito, por ejemplo Counter Strike. En este juego, los jugadores (terroristas o antiterroristas) usan armas.

Si enseñamos al jugador cómo utilizar weapon (análoga a la interfaz), se puede utilizar cualquier arma como AK47, Maverick, Shotgun, Sniper (análogo a las clases que heredan interfaz de arma).

La ventaja de esto es considerar Bazooka (que implementa Arma) se desarrolla en versiones futuras. Entonces el jugador actual podrá usarlo sin ninguna modificación, ya que sabe cómo usar la interfaz de Arma :-)

Esto es solo un ejemplo simple. Hay muchas otras razones para usar interfaces.

+1

Este ejemplo funcionaría incluso si las interfaces no existieran. Simplemente definirías una clase madre de Arma. –

+0

Oh sí, eso es correcto. Pero es mejor usar Interface, ya que las clases podrán heredar otras clases. Si usamos la clase madre Arma, las clases derivadas no podrán heredar de ninguna otra clase debido a la inexistencia de herencia múltiple en Java. – Trivikram

0

Simple. Creo que las clases de Interfaces y Resumen son para el mismo propósito. La diferencia es: si extiende una clase abstracta, no podría extender ninguna otra clase en Java. Motivo: Java no admite Herencia Múltiple. Al mismo tiempo, puede implementar cualquier cantidad de interfaz para una clase.

2

¿Cuál debería usar, clases abstractas o interfaces?

considerar el uso de clases abstractas si alguna de estas afirmaciones se pueden aplicar a su situación:

  • desea compartir código entre varias clases estrechamente relacionadas.
  • Espera que las clases que amplían su clase abstracta tengan muchos métodos o campos comunes, o que requieran modificadores de acceso que no sean públicos (como los protegidos y los privados).
  • Quiere declarar campos no estáticos o no finales. Esto le permite definir métodos que pueden acceder y modificar el estado del objeto al que pertenecen.

considerar el uso de interfaces de si alguna de estas afirmaciones se pueden aplicar a su situación:

  • Se espera que las clases no relacionadas podrían implementar su interfaz. Por ejemplo, las interfaces Comparable y Cloneable son implementadas por muchas clases no relacionadas.
  • Desea especificar el comportamiento de un tipo de datos en particular, pero no le preocupa quién implementa su comportamiento.
  • Desea aprovechar la herencia de tipo múltiple.
0

El uso más importante de las interfaces como lo veo es pasar el código (anonymous inner class o lambda) a un método como parámetro.

Ejemplo:

Supongamos que queremos hacer un método que puede regresar el tiempo de ejecución necesario para ejecutar una pieza de código. Queremos pasar nuestro código como un parámetro para este método.

interface Code{ 
    public void run(); 
} 


long getExectutionTime(Code code){ 

    long startTime = System.nanoTime();  
    code.run();  
    return System.nanoTime() - startTime; 
} 


getExecutionTime(new Code(){ 

    public void run(){ 
      //the code to be executed 
    } 
}); 

en Java 8,

getExecutionTime(()->{ 
    //the code to be executed 
}); 
0

interfaz no es nada, pero es una línea de guía para la nueva aplicación proporciona algunas instrucciones para la nueva aplicación y categorizar la funcionalidad del objeto .En detalles como si creamos una interfaz y luego creamos una instrucción para la implementación.

0

Una analogía para una interfaz es pensar en una clase que usa una interfaz como si fuera una toma de corriente eléctrica, y pensar en la implementación como el enchufe. A la salida no le importa lo que hay detrás del enchufe, siempre que se ajuste a la toma de corriente. En términos psuedocode podría escribirse así:

public interface ElectricOutlet { 
    public void powerUp(); 
} 

y una clase que implementa ElectricOutlet podría tener este aspecto:

public class Appliance implements ElectricOutlet { 
    //member variables 
    public void powerUp() { 
     //Draw power from the wall 
    } 
    ... 
} 

Entonces, ¿cómo utilizar la interfaz? De esta manera:

//lots of other code 
ElectricOutlet out = new Appliance(); //plug the appliance into the outlet 
out.powerUp; //power it up! 

Por supuesto, esto no tiene por qué ser un aparato que se conecta a una toma de corriente. Puede ser un televisor, una computadora portátil o una cortadora de césped, pero todos se comportan de la misma manera desde el punto de vista de la toma de corriente. Entonces, ¿cómo se aplica esto a la programación? Exactamente de la misma manera:

List<String> list = new ArrayList<String>(); // create a new List of Strings 

acabo de crear un nuevo (vacío) lista de cadenas. Si resulta que ArrayList no proporciona el rendimiento correcto, y LinkedList funciona mejor, puedo volver atrás y cambiar esa línea para esto:

List<String> = new LinkedList<String>(); //should work better now 

puedo hacer esto porque tanto ArrayList y LinkedList implementan la interfaz Lista , y así proporcionan el mismo comportamiento (API), aunque las implementaciones internas pueden ser diferentes. Sin embargo, desde el punto de vista de la Lista, no importa el funcionamiento interno, siempre que la interfaz esté allí. Esto permite mucha independencia entre las clases y permite una mayor reutilización.

Cuestiones relacionadas