静态类型检查是基于对程序源代码的分析来验证程序的类型安全性的过程。
动态类型检查是在运行时验证程序的类型安全性的过程。
另一种解释为
静态类型 statically: 如果在编译时拒绝ill behaved程序,则是statically typed;
动态类型dynamiclly: 如果在运行时拒绝ill behaviors, 则是dynamiclly typed。
例子:
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()返回的是什么?
是返回B。
如下代码行是非法的,即使方法doB()是被B对象调用的。问题在于它的引用类型是A,在编译器件,编译器不知道它的真实类型,所以将它当做A类型。
//illegal
new B().me().doB();
所以,只有下面的代码是可以被调用的:
//legal
new B().me().doA();
然而,我们可以将其强制类型转换成B,如下代码:
//legal
((B) new B().me()).doB();
接下来,我们添加一个C类:
class C extends A{
public void doBad() {
System.out.println(“Do C”);
}
}
那么,下面的代码语句将通过静态类型检查:
//legal
( C ) new B().me()).beBad();
编译器不知道它的真实类型,但是在运行期间将会抛出异常,因为B类型不能转换成C类型;