it-swarm.com.de

Verwirrung beim Aufruf Java Schnittstellenmethode

Angenommen, ich habe eine Schnittstelle A, die wie folgt definiert ist:

public interface A {
  public void a();
}

Es enthält die Methode void a();

Ich habe eine Klasse, die diese Schnittstelle implementiert und nur eine Methode hat:

    public class AImpl implements A {
       @Override
       public void a() {
           System.out.println("Do something");
       }
    }

F: Wenn ich in der Hauptklasse die Interface-Methode aufrufe, ruft sie dann die Implementierung auf, die zu der Klasse gehört, die das Interface implementiert?

Beispielsweise:

public static void main(String[] args){
  A aa;
  aa.a();
}

Wird dieser Druck "etwas tun"?

22
Jay Zhang
A aa = new AImpl();
aa.a();

Hier ist Ihre Referenzvariable der Typ interface A, aber das tatsächliche Object ist AImpl.

Wenn Sie eine neue Schnittstelle definieren, definieren Sie einen neuen Referenzdatentyp. Sie können Schnittstellennamen überall dort verwenden, wo Sie andere Datentypnamen verwenden können. Wenn Sie eine Referenzvariable definieren, deren Typ eine Schnittstelle ist, muss jedes Objekt, das Sie dieser zuweisen, eine Instanz einer Klasse sein, die die Schnittstelle implementiert.

Lesen Sie mehr auf Dokumentation

Eine Schnittstellenreferenz kann Object of AImpl enthalten, während sie die A-Schnittstelle implementiert.

30

Dies hängt vom Laufzeittyp des Objekts ab. Sehen:

Dies ist Ihre Schnittstelle:

public interface A {
  public void a();
}

Und das ist deine Klasse:

public class AImpl implements A {
    public void a() {
       println("I am AImpl");
    }
}

Es gibt eine andere Implementierung:

public class AnotherAImpl implements A {
    public void a() {
       println("I am another AImpl");
    }
}

Schauen Sie sich also diese Hauptmethode an:

public static void main(String[] args){
  A aa;
  aa = new AImpl();
  aa.a(); // prints I am AImpl
  aa = new AnotherAImpl();
  aa.a(); // now it prints I am another AImpl
}
23
jlordo

Sie müssen die Routine für das aktuelle Objekt AImpl aufrufen

A aa = new AImpl();
aa.a();

was hier gleichbedeutend ist mit folgenden

AImpl aa = new AImpl();
aa.a();

Ihr Beispiel löst einen Fehler aus, da Sie versuchen, eine Methode für ein nicht initialisiertes Objekt aufzurufen.

2
Johan Sjöberg

Sie könnten dies wahrscheinlich herausfinden, indem Sie den Code selbst ausführen.

Derzeit erhalten Sie ein NullPointerException, da Sie der Variablen aa nichts zugewiesen haben. Wenn Sie Ihren Code wie folgt ändern, wird die Methode aufgerufen und der Text ausgegeben:

public static void main(String[] args){
    A aa = new AImpl();
    aa.a();
}
2
Vindicare

Nein, werde ich nicht.

Sie haben eine Variable deklariert. Sie sollten es zuerst mit der Instanz eines Objekts initialisieren, in diesem Fall mit Ihrer Klasse AImpl.

public static void main(String[] args){
  A aa = new AImp();
  aa.a();
}