Java中静态类型检查是如何进行的实例思路详解
程序员文章站
2024-03-11 15:34:07
以下内容来自*,关于静态类型检查和动态类型检查的解释:
•静态类型检查:基于程序的源代码来验证类型安全的过程;
•动态类型检查:在...
以下内容来自*,关于静态类型检查和动态类型检查的解释:
•静态类型检查:基于程序的源代码来验证类型安全的过程;
•动态类型检查:在程序运行期间验证类型安全的过程;
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中静态类型检查是如何进行的实例思路详解的相关知识,希望对大家有所帮助