Interfaces-"Instanziierbarkeit"
-
Warum ist folgendes möglich?
Vorrausgesetzt ein Interface ist angelegt und wird in der Main einer Klasse implementiert.
Iface iface; iface.classvar1; // Zugriff auf Member des Interfaces
Als "Pendant" führt dies zu einem Fehler, warum?:
Iface iface = new Iface(); iface.classvar1;
Ich habe in einem Buch gelesen, im ersten Codeausschnitt handelt es sich hierbei um eine nicht initialisierte Objektreferenz. Das ist klar, weil kein Wert zugewiesen, da ja wie im ABC des Programmierens die Referenz der Inhalt ist (wie beim Array etc.). Aber wieso ist auf das Member zugreifbar des Interfaces, also classvar1?
-
in der Main einer Klasse implementiert
Interfaces können nicht in Methoden implementiert werden...
Eine Variable in einem Interface ist immer implizit public static und final, d.h. sie kann über Interface.VarName angesprochen werden.
class C { interface Test { int x = 42; // x ist implizit public static final } public static void main(String[] args) { System.out.println(Test.x); // siehe oben, daher ist der Zugriff auf x möglich } }
-
Ich habe mich falsch ausgedrückt, ich weiß dass Interfaces nicht über die Methode implementiert werden, nur "instanziiert" eine Variable ist anlegbar des Interfaces.
Zum Beispiel Interface1 i;
Interface1 i = new Interface1() führt zum Compilerfehler weil eine abstrakte Klasse auch nicht instanziierbar ist, aber wieso geht z.B.:
Interface1 i; i.memberVar1;
-
Zu allererst, dein Codebeispiel lässt sich nicht kompilieren:
variable i might not have been initialized
Folgendes funktioniert, da jede Variable in einem Interface implizit mit public static final modifiziert ist.
public class C { interface I { int x = 5; } public static void main(String[] args) { I i = null; System.out.println(i.x); } }
-
Gibt nicht außerdem der Compiler zumindest eine Warnung aus, wenn man versucht über "Instanzen" auf statische Felder zuzugreifen?
-
Ja aber Warnungen kann man ignorieren und unterdrücken