欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java中静态类型检查是如何进行的实例思路详解

程序员文章站 2024-03-12 08:55:56
以下内容来自*,关于静态类型检查和动态类型检查的解释: •静态类型检查:基于程序的源代码来验证类型安全的过程; •动态类型检查:在...

以下内容来自*,关于静态类型检查和动态类型检查的解释:

•静态类型检查:基于程序的源代码来验证类型安全的过程;

•动态类型检查:在程序运行期间验证类型安全的过程;

java使用静态类型检查在编译期间分析程序,确保没有类型错误。基本的思想是不要让类型错误在运行期间发生。

以下代码是一个例子,理解了他,你会更好的理解java静态类型检查是如何工作的。

代码示例

假定我们有如下类,a和b,b继承a。

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的方法返回了自己。

静态类型检查是如何工作的?

如下代码行是非法的,即使方法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类型;

以上所述是小编给大家介绍的java中静态类型检查是如何进行的实例思路详解的相关知识,希望对大家有所帮助