2016-04-22 12 views
1

Sagen wir, ich habe eine Schnittstelle wie unten;Ist Schnittstellen nur kompilieren Zeitabhängigkeit?

public interface aitf{ 
    public void method1(); 
} 

und eine Implementierungsklasse;

public class a implements aitf{ 
public void method1(){ 
    System.out.println("method 1"); 
} 
public static void main(String... args){ 
    new a().method1(); 
} 
} 

und es läuft und drucken wie erwartet.

Und dann, wenn ich eine Methode ändern und hinzufügen und nur Schnittstelle neu kompilieren;

public interface aitf{ 
public void method1(); 
public void method2(); 
} 

konkrete Klasse (a) funktioniert noch. Eigentlich macht dieses Verhalten Sinn, da sonst alle API-Änderungen Probleme verursachen. Aber wie erklärt man dieses Verhalten, sind Interfaces nur Zeitabhängigkeiten kompilieren?

+3

Versuchen Sie 'new a(). Method2()' aufzurufen, ohne es erneut zu kompilieren ... Java ist zur Laufzeit verbunden. –

+1

Es klingt wie Klasse 'a' wurde nicht neu kompiliert, nur die Schnittstelle war. Wenn Sie versucht haben, beide neu zu kompilieren, erhalten Sie einen Kompilierungsfehler. –

+0

@AndyTurner Ich weiß, es wird brechen, wenn ich getan habe, was Sie fragen, aber meine Frage ist anders. – cacert

Antwort

0

Java kompiliert .java-Dateien in Bytecode .class-Dateien, bevor sie ausgeführt werden. Daher wird die Änderung der Schnittstelle erst nach der Neukompilierung wirksam, class a. Wenn Sie jedoch versuchen, a().method2() aufzurufen, werden Dinge mit einem Laufzeitfehler fehlschlagen. Java ist eher eine kompilierte als eine interpretierte Sprache. Änderungen an .java-Dateien wirken sich daher nicht auf den laufenden Code aus. Das Laufzeittypsystem ist für Typen, nicht für Schnittstellen oder Klassen.