2013-07-01 13 views
8

Ist es möglich, ein Objekt für eine Schnittstelle zu erstellen, wenn ja, wie können wir? nach meiner Ansicht sagt der folgende Code, können wir:Kann ich ein Objekt für die Schnittstelle erstellen?

Runnable r= new Runnable(){ // some implementation }

+0

Nein, du kannst nicht. Auch alle Klassen erben von Object, während Schnittstelle nicht – Ankit

+0

Haben Sie es versucht? In Ihrem Beispiel erstellen Sie eine Instanz einer anonymen Klasse, die die Schnittstelle implementiert. – Axel

+0

Ähnliche Konzept: https://stackoverflow.com/questions/33994009/can-we-create-object-of-abstract-class –

Antwort

11

Sie nicht über eine Schnittstelle direkt instanziiert, aber Sie können eine Klasse instanziiert, die diese Schnittstelle implementiert:

public class RunClass implements Runnable { 
    // Class implementation 
} 

Runnable r = new RunClass(); 

Diese ist im Grunde das Gleiche wie das, was Sie inline tun. Die Klammern nach dem neuen Runnable() enthalten Ihre Implementierung inline.

+5

Dies ist ein bisschen irreführend. Die Frage des OP verwendet anonyme Klassensyntax, was wahrscheinlich der Punkt ist. –

14

Dies erstellt nicht die Instanz von Interface, es erstellt eine Klasse, die eine Schnittstelle implementiert. Wenn Sie also schreiben

Runnable runnable = new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 

     } 
    }; 

Sie sind eigentlich eine Klasse erstellen, die die Runnable-Schnittstelle implementiert. Sie müssen alle Regeln folgen hier, hier, wir sind das Überschreiben der run-Methode für Runnable

There is similar thing for abstract class also. We can test using an example 

public abstract class AbstractClass { 

    public void someMethod(){ 
     System.out.println("abstract class"); 
    } 

} 

und eine andere Klasse dh TestClass

public class TestClass { 

    public static void main(String[] args) { 

     AbstractClass abstractClass = new AbstractClass() { 
      public void someMethod() { 
       System.out.println("concrete class method"); 
      } 
     }; 
     abstractClass.someMethod(); 
    } 
} 

Dies wird die Instanz einer Unterklasse schaffen, in der wir sind überschreiben someMethod(); Dieses Programm druckt

concrete class method 

Dies beweist, dass wir die Instanz der Unterklasse erstellen.

+0

danke es ist nett antarar –

6

Ist es möglich, ein Objekt für eine Schnittstelle zu erstellen?

Nein, der Code, den Sie erstellt ein Objekt aus einer anonymen Klasse gezeigt haben, die die Schnittstelle implementiert. Im Hintergrund erstellt die JVM tatsächlich eine Klasse, die die Schnittstelle implementiert, und erstellt dann eine Instanz dieser Klasse.


Die „anonymous“ Klasse erzeugt wird tatsächlich einen Namen, basierend auf dem Namen der Klasse, in der dieser Code, zum Beispiel YourClass$1 oder ähnlich erscheint. ZB:

public class AnonymousName { 
    public static final void main(String[] args) { 
     Runnable r = new Runnable() { 
      public void run() { 
      } 
     }; 

     System.out.println(r.getClass().getName()); 
    } 
} 

... Ausgänge

AnonymousName$1

;

(zumindest auf Oracle JVM Ich weiß nicht, ob die Namenskonvention in der JLS ist oder wenn es JVM-spezifisches Verhalten.)
0

wir können die Schnittstelle nicht instatieren (da keinen Konstruktor haben).

+0

Ich glaube nicht, dass Rais. Vielleicht könntest du sein Problem lösen. Es sieht vollständige Antwort auf mich aus. –

+1

Ihre Antwort ist richtig. Ich denke, passender Platz ist Kommentar und antwortet nicht. –

8

Sie können eine anonyme innere Klasse erstellen:

Runnable r = new Runnable() { 
    @Override 
    public void run() { 
    } 
}; 

Deshalb erstellen Sie eine neue class, die die gegebene interface implementiert.

0

Was Sie sehen, ist ein anonymous inner class.

es erstellt eine Instanz eines neuen, anonymen Implementierers der Runnable-Klasse.

Da eine anonyme Klassendefinition ein Ausdruck ist, muss er Teil einer Anweisung sein.

Verwandte Themen