public interface Testable { public static final int a = 1; public static int b = 2; public final int c = 3; public int d = 4; static final int e = 5; static int f = 6; final int g = 7; final static int h = 8; int i = 9; }Por extraño que parezca (o al menos a mí me sorprendió), todas las declaraciones anteriores son perfectamente válidas. En Java, las interfaces pueden ser utilizadas para declarar constantes (jamás para variables), y por defecto ellas serán public static final. Si uno de estos modificadores se omite, el compilador simplemente asumirá que está allí, así que int i = 9 es exactamente lo mismo que public static final int i = 9. Obviamente, una declaración como private static final int a = 1 no compilará ya que estaríamos cambiando el modificar public por private.
Veamos ahora la declaración de métodos, y traten de identificar cuáles de los siguientes son incorrectos:
public interface Testable { public void test1(); abstract void test2(); public abstract void test3(); abstract public void test4(); void test5(); }Al igual que en el ejemplo de las constantes, el código anterior es completamente válido. Los métodos declarados dentro de una interfaz serán siempre públicos y abstractos, así que marcarlos como public abstract es solo una redundancia perfectamente aceptada. Por el contrario, en el siguiente ejemplo todas las declaraciones son incorrectas:
public interface Testable { final void test1(); static void test2(); private void test3(); protected void test4(); }Declarar métodos final en una interface no tiene ningún sentido; final es el opuesto de abstract. Los métodos no pueden ser estáticos, ya que están allí para ser implementados por las clases que implementen la interfaz, y tampoco pueden ser privados o protegidos, ya que, por definición, todos los métodos en la interfaz son públicos.
Por último, en la propia declaración de la interfaz podemos hacer lo siguiente sin que nadie proteste:
public abstract interface Testable1 { } public interface Testable2 { }Las dos declaraciones anteriores son exactamente iguales ya que las interfaces son consideradas abstractas por defecto, así que "Testable1" al ser marcada como abstract no estaría más que añadiendo un modificador redundante pero correcto.
Cuales de los siguientes niveles de clases de declaraciones de variables (no locales) no compilaría?
ReplyDeleteA. protected int a;
B. transient int b = 3;
C. public static final int c;
D. volatile int d;
E. private synchronized int e;
El E no compilará ya que synchronized no es válido para un campo de una clase.
ReplyDeleteque se refiere cuando hacen esto
ReplyDeleteA a = new B ();
Cuales tres de los siguientes enunciados son asignaciones de métodos validos en una interfaz? (escoja tres.)
ReplyDeleteA. private int getArea ();
B. public float getVol (float x);
C. public void main (String [] args);
D. public static void main (String [] args);
E. boolean setFlag (Boolean [] test []);
hola comenta d10::
ReplyDeleteson validos B;C;D
Por que en las interfaces solo se puden declarar métodos públicos y estaticos