来自Wiki:
静态类型检查是基于对程序源代码的分析来验证程序的类型安全性的过程。
动态类型检查是在运行时验证程序的类型安全性的过程
Java在编译时使用静态类型检查来分析程序,以证明没有类型错误。 基本的想法是永远不要让坏事发生在运行时。 通过理解下面的例子,你应该很好地理解静态类型检查在Java中是如何工作的。
代码例子
假设我们有下面的类,A和B。
class A {
A me() {
return this;
}
public void doA() {
System.out.println("Do A");
}
}
class B extends A {
public void doB() {
System.out.println("Do B");
}
}
首先,“new B().me()”返回什么? 一个A对象或一个B对象?
me()方法被声明为返回一个A,所以在编译期间,编译器只会看到它返回一个A对象。 但是,它在运行时实际上返回一个B对象,因为B继承了A的方法并返回它(自己)。
如何静态类型检查工作?
即使对象被调用是一个B对象,下面的行将是非法的。 问题是它的引用类型是A.编译器在编译期间不知道它的实际类型,所以它把对象视为类型A.
//illegal
new B().me().doB();
所以只能调用下面的方法。
//legal
new B().me().doA();
但是,我们可以将对象转换为B类型,如下所示:
((B) new B().me()).doB();
如果添加下面的C类,
class C extends A{
public void doBad() {
System.out.println("Do C");
}
}
那么下面的语句是合法的,可以通过静态类型检查:
//legal
((C) new B().me()).doBad();
编译器不知道它是实时的,但是运行时会抛出一个转换异常,因为B不能被转换成C: