what usage the purpose multiple java interface

usage - java interface vs abstract class



¿Por qué las variables de interfaz son estáticas y finales por defecto? (14)

( Esta no es una respuesta filosófica, sino más bien práctica ). El requisito para static modificador static es obvio que ha sido respondido por otros. Básicamente, dado que las interfaces no se pueden crear instancias, la única forma de acceder a sus campos es convertirlos en un campo de clase: static .

La razón detrás de los campos de la interface se convierte automáticamente en final (constante) es para evitar que diferentes implementaciones cambien accidentalmente el valor de la variable de la interfaz que puede afectar inadvertidamente el comportamiento de las otras implementaciones. Imagine el escenario a continuación en el que una propiedad de la interface no se convirtió explícitamente en final en Java:

public interface Actionable { public static boolean isActionable = false; public void performAction(); } public NuclearAction implements Actionable { public void performAction() { // Code that depends on isActionable variable if (isActionable) { // Launch nuclear weapon!!! } } }

Ahora, solo piense qué pasaría si otra clase que implementa Actionable modifique el estado de la variable de interfaz:

public CleanAction implements Actionable { public void performAction() { // Code that can alter isActionable state since it is not constant isActionable = true; } }

Si estas clases se cargan dentro de una JVM única por un cargador de clases, entonces el comportamiento de NuclearAction puede verse afectado por otra clase, CleanAction , cuando se performAction() después de que se CleanAction (en el mismo hilo o de otro modo), que En este caso puede ser desastroso (semánticamente eso es).

Dado que no sabemos cómo cada implementación de una interface va a utilizar estas variables, deben ser implícitamente final .

¿Por qué las variables de interfaz son estáticas y finales por defecto en Java?


Dado que la interfaz no tiene un objeto directo, la única forma de acceder a ellos es mediante una clase / interfaz y, por lo tanto, es por eso que, si existe una variable de interfaz, debería ser estática, de lo contrario no será accesible al mundo exterior. Ahora, dado que es estático, puede contener solo un valor y cualquier clase que lo implemente puede cambiarlo y, por lo tanto, será todo un desastre.

Por lo tanto, si hay una variable de interfaz, será implícitamente estática, final y obviamente pública.


De las preguntas más frecuentes del diseño de la interfaz Java por Philip Shaw:

Las variables de interfaz son estáticas porque las interfaces de Java no pueden ser instanciadas por derecho propio; el valor de la variable debe asignarse en un contexto estático en el que no existe ninguna instancia. El modificador final garantiza que el valor asignado a la variable de interfaz es una verdadera constante que no puede ser reasignada por código de programa.

source


En Java , la interfaz no le permite declarar ninguna variable de instancia. El uso de una variable declarada en una interfaz como variable de instancia devolverá un error de tiempo de compilación.

Puede declarar una variable constante, utilizando una static final que es diferente de una variable de instancia.


Java no permite variables abstractas y / o definiciones de constructor en interfaces. Solución: Simplemente cuelgue una clase abstracta entre su interfaz y su implementación, que solo extiende la clase abstracta de esta manera:

public interface IMyClass { void methodA(); String methodB(); Integer methodC(); } public abstract class myAbstractClass implements IMyClass { protected String varA, varB; //Constructor myAbstractClass(String varA, String varB) { this.varA = varA; this.varB = VarB; } //Implement (some) interface methods here or leave them for the concrete class protected void methodA() { //Do something } //Add additional methods here which must be implemented in the concrete class protected abstract Long methodD(); //Write some completely new methods which can be used by all subclasses protected Float methodE() { return 42.0; } } public class myConcreteClass extends myAbstractClass { //Constructor must now be implemented! myClass(String varA, String varB) { super(varA, varB); } //All non-private variables from the abstract class are available here //All methods not implemented in the abstract class must be implemented here }

También puede usar una clase abstracta sin ninguna interfaz si está SEGURO de que no desea implementarlo junto con otras interfaces más adelante. Tenga en cuenta que no puede crear una instancia de una clase abstracta, DEBE extenderla primero.

(La palabra clave "protegido" significa que solo las clases extendidas pueden acceder a estos métodos y variables).

espía


La interfaz puede ser implementada por cualquier clase y qué pasaría si ese valor fuera cambiado por uno de los implementadores de la clase, entonces se inducirá a error para otras clases implementadoras. La interfaz es básicamente una referencia para combinar dos entidades coreladas pero diferentes. Por esta razón, la variable declarante dentro de la interfaz será implícitamente final y también estática, ya que la interfaz no se puede instanciar.


Piense en una aplicación web en la que tiene una interfaz definida y otras clases la implementan. Como no puede crear una instancia de interfaz para acceder a las variables, necesita tener una palabra clave estática. Dado que es estático, cualquier cambio en el valor se reflejará en otras instancias que lo hayan implementado. Así que para evitarlo los definimos como definitivos.


Porque cualquier otra cosa es parte de la implementación, y las interfaces no pueden contener ninguna implementación.


Solo lo probé en Eclipse, la variable en la interfaz es predeterminada para ser final, por lo que no puede cambiarla. En comparación con la clase padre, las variables son definitivamente cambiantes. ¿Por qué? Desde mi punto de vista, la variable en clase es un atributo que heredarán los niños, y los niños pueden cambiarlo de acuerdo con su necesidad real. Por el contrario, la interfaz solo define el comportamiento, no el atributo. La única razón para poner variables en la interfaz es usarlas como constantes relacionadas con esa interfaz. Sin embargo, esto no es una buena práctica de acuerdo con el siguiente extracto:

"Colocar constantes en una interfaz era una técnica popular en los primeros días de Java, pero ahora muchos consideran que es un uso desagradable de las interfaces, ya que las interfaces deben tratar con los servicios proporcionados por un objeto, no con sus datos. Además, las constantes utilizadas Una clase suele ser un detalle de implementación, pero colocarlos en una interfaz los promueve a la API pública de la clase ".

También intenté poner estática o no hacer ninguna diferencia en absoluto. El código es el siguiente:

public interface Addable { static int count = 6; public int add(int i); } public class Impl implements Addable { @Override public int add(int i) { return i+count; } } public class Test { public static void main(String... args) { Impl impl = new Impl(); System.out.println(impl.add(4)); } }


Una Interfaz es un contrato entre dos partes que es invariante, tallado en la piedra, por lo tanto, definitivo. Ver Diseño por Contrato .


porque:

Static : como no podemos tener objetos de interfaces, deberíamos evitar el uso de variables miembro de nivel Objeto y deberíamos usar variables de nivel de clase, es decir, estáticas.

Final : para que no tengamos valores ambiguos para las variables (Problema Diamond - Herencia múltiple).

Y según la interfaz de documentación es un contrato y no una implementación.

referencia: la respuesta de Abhishek Jain en quora http://qr.ae/TU1dTm


static - porque la interfaz no puede tener ninguna instancia. Y final - porque no necesitamos cambiarlo.


público : para la accesibilidad en todas las clases, al igual que los métodos presentes en la interfaz

estático : como la interfaz no puede tener un objeto, se puede usar el nombre de interfaz.variable para hacer referencia a él o directamente el nombre de variable en la clase que lo implementa.

Final : hacerlas constantes. Si 2 clases implementan la misma interfaz y les da a ambas el derecho de cambiar el valor, se producirá un conflicto en el valor actual de la var, por lo que solo se permite una inicialización de tiempo.

Además, todos estos modificadores están implícitos para una interfaz, realmente no es necesario especificar ninguno de ellos.


public interface A{ int x=65; } public interface B{ int x=66; } public class D implements A,B { public static void main(String[] a){ System.out.println(x); // which x? } }

Aquí está la solución.

System.out.println(A.x); // done

Creo que es la única razón por la cual la variable de interfaz es estática.

No declarar variables dentro de la interfaz.