2016-05-04 8 views
-5

Wie viele Klassen können beim Erstellen und der Schnittstelle die Schnittstelle implementieren?
Wenn die Antwort mehr als eins ist, wie weiß Java dann, welche Implementierungen verwendet werden sollen, wenn Sie den Aufruf an die Schnittstelle tätigen (die Implementierung nicht direkt aufrufen)?Java Interface-Konzept

+3

Sie sagen Java, welche Implementierung es verwenden soll! – user2004685

+0

Wenn Sie 'import' verwenden, teilen Sie Java mit, welche Implementierung verwendet werden soll. – MaxG

+0

Eine unbegrenzte Anzahl kann die Schnittstelle implementieren und beim Festlegen einer Referenz einen konkreten Typ angeben. –

Antwort

0

Wie viele Klassen können die Schnittstelle implementieren?

So viele, wie Sie brauchen.

Wenn die Antwort mehr als eins ist, wie weiß Java dann, welche Implementierungen zu verwenden sind, wenn Sie den Aufruf an die Schnittstelle tätigen (die Implementierung nicht direkt aufrufen)?

Hier hilft Wissen über late binding (auch bekannt als dynamische Bindung).

Lassen Sie uns sagen, dass Sie Schnittstelle und Klassen, die sie implementieren wie

interface Animal{ 
    void makeSound(); 
} 

class Cat implements Animal{ 
    public void makeSound(){ 
     System.out.println("mew"); 
    } 
} 

class Dog implements Animal{ 
    public void makeSound(){ 
     System.out.println("woof"); 
    } 
} 

Sie haben auch Code wie

Animal a1 = new Cat(); 
Animal a2 = new Dog(); 

a1.makeSound(); 
a2.makeSound(); 

Ergebnis, das Sie sehen, ist

mew 
woof 

kommt es vor, weil body/code der Methode .makeSound() wird gesucht (und aufgerufen) zur Laufzeit (nicht Kompilierungszeit). Dies ist möglich, da jedes Objekt sich an seine Klasse erinnert, so dass das Objekt a1 als Referenz weiß, dass es eine Instanz von Cat ist und das Objekt von a2 als Instanz von Dog gehalten wird.

Also kurz gesagt, wenn Sie tun:

a1.makeSound(); 
  • JVM Objekt nimmt die a1 hält,
  • dann das Objekt um seine Klasse fragt (in diesem Fall wird es erfahren, dass es Instanz von Cat ist Klasse)
  • Dann greift es auf diese Klasse (Cat.class Datei) und sucht nach Code makeSound() (wenn eine solche Methode nicht gefunden wird, dann wird davon ausgegangen, dass es vererbt werden muss, wird es versuchen, s Suchen Sie in der Oberklasse nach
  • und wenn es diese Methode finden wird, ruft es Code von ihm auf.
+0

Sehr gut gesagt. Vielen Dank. – MarkoRocko

+0

@MarkoRocko Gern geschehen. Ich habe vergessen, hinzuzufügen, dass dank dieses Mechanismus wir Polymorphismus in Java haben. Außerdem gibt es 3 Ausnahmen von der dynamischen Bindung, wenn Sie '.someMethod()' aufrufen.Die erste Ausnahme, wenn Code zur Kompilierungszeit gesetzt wird und nicht dynamisch zur Laufzeit durchsucht wird, ist, wenn die Methode "final" ist (da sie nicht überschrieben werden kann, ist es sinnlos, sie zur Laufzeit zu suchen). Der zweite Fall ist, wenn die Methode "privat" ist (da auf private Methoden nur innerhalb der Klasse zugegriffen wird, die den Zugriff auf private Methoden aus anderen Klassen unmöglich macht). – Pshemo

+0

@MarkoRocko Der dritte Fall ist, wenn die Methode "statisch" ist, weil 'reference.staticMethod()' zur Kompilierzeit in 'ReferenceType.staticMethod()' geändert wird. – Pshemo