[英]Is interfaces just compile time dependency?
假设我有一个如下所示的界面;
public interface aitf{
public void method1();
}
和一个实现类;
public class a implements aitf{
public void method1(){
System.out.println("method 1");
}
public static void main(String... args){
new a().method1();
}
}
它按预期运行并在下面打印。
method 1
然后,如果我更改并添加一个方法并重新编译接口;
public interface aitf{
public void method1();
public void method2();
}
具体类(a)仍在工作。 实际上这种行为是有道理的,否则所有 api 更改都会导致问题。 但是如何解释这种行为,接口只是编译时依赖吗?
让我们回到Interfaces
的根源,即polymorphism
。
polymorphism
前:
polymorphism
发挥作用后:
Interfaces
应用了Dependency inversion
,这使我们实现了独立的可部署性,当任何组件中的源代码发生变化时,这一切都发生在compile time
。编译时错误一般是指与语法或
semantics
相对应的错误。 另一方面,运行时错误是指在运行时执行代码期间遇到的错误。 编译器在代码开发时检测到编译时错误
Interfaces
在Runtime
不存在,但只在compile time
存在,因为它是在OOP
中应用Dependency inversion
的直接结果
在您的情况下发生的情况是,您的class
与interface
的old compilation
紧密相连,因此当您重新编译new interface
它不会反映在class
上,直到该类也被再次recompiled
以保持contract
中的更改interface
。
引用文档:
Method and Constructor Overloading
:添加重载现有方法或构造函数的新方法或构造函数不会破坏与预先存在的二进制文件的兼容性。 用于每个调用的签名是在编译这些现有二进制文件时确定的; 因此不会使用新添加的方法或构造函数,即使它们的签名既适用又比最初选择的签名更具体。 虽然添加新的重载方法或构造函数可能会在下次编译类或接口时导致编译时错误,因为没有最具体的方法或构造函数(第 15.12.2.5 节),但当程序执行,因为在执行时没有进行重载决议。
Java在运行它们之前将.java文件编译成字节码.class文件,因此在重新编译之前更改接口不会影响class a
。 但是,如果您尝试调用a().method2()
则会因运行时错误而失败。 Java是一种编译语言而不是解释型语言,因此对.java文件的更改不会影响正在运行的代码。 运行时类型系统用于类型,而不是接口或类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.