Java 在编译时使用静态类型检查来分析程序,以证明不存在类型错误。基本思想是永远不要让坏事在运行时发生。通过理解以下示例,您应该对 Java 中静态类型检查的工作原理有一个很好的理解。
代码示例
假设我们有以下类,A 和 B。B 扩展 A。
首先,“new B().me()”返回什么?A 对象还是 B 对象?
me() 方法被声明为返回一个 A,因此在编译期间,编译器只看到它返回一个 A 对象。然而,它实际上在运行时返回了一个 B 对象,因为 B 继承了 A 的方法并返回 this(本身)。
静态类型检查如何工作?
以下行将是非法的,即使正在调用的对象是 B 对象。问题是它的引用类型是 A。编译器在编译时不知道它的真实类型,所以它将对象视为类型 A。
所以只能调用下面的方法。
但是,我们可以将对象转换为 B 类型,如下所示:
如果添加以下 C 类,
那么下面的语句是合法的,并且可以通过静态类型检查:
编译器不知道它是实时的,但运行时会抛出一个转换异常,因为 B 不能转换为 C: