时间:2021-05-20
关于静态类型检查和动态类型检查的解释:
静态类型检查:基于程序的源代码来验证类型安全的过程;
动态类型检查:在程序运行期间验证类型安全的过程;
Java使用静态类型检查在编译期间分析程序,确保没有类型错误。基本的思想是不要让类型错误在运行期间发生。
在各色各样的编程语言中,总共存在着两个类型检查机制:静态类型检查和动态类型检查。
静态类型检查是指通过对应用程序的源码进行分析,在编译期间就保证程序的类型安全。
动态类型检查是在程序的运行过程中,验证程序的类型安全。在Java中,编译期间使用静态类型检查机制分析Java源代码,可以提前发现Java中类型缺少的错误。这个机制的好处是,不让错误的事情在运行时才被发现。本文,将使用几个代码示例,深入讲解Java中的类型检查机制。一旦完全理解了本文的例子,就完全掌握了Java中的静态类型检查。
深入分析Java的静态类型检查
代码示例
假设我们有如下的两个类,类Super 和 类Suber,而且他们具有如下继承关系:
class Super {Super me() {return this;}public void doSuper() {System.out.println("");}}class Suber extends Super {public void doSuber() {System.out.println("天天编码");}}首先,思考这个问题:”new Suber().me()” 的返回值是什么? 是一个 Super对象 还是一个 Suber对象?
这个 me() 方法被声明为返回一个 Super对象,所以,在编译期间,编译期认为它返回的是一个 Super对象。但是,在运行期间,该语句实际返回的是一个 Suber对象,因为 Suber继承了Super的me()方法,并返回了自身对象(多态性)。
静态检查
我们来看看常见的错误示例代码:
// 错误new Suber().me().doSuber();这个语句在编译时会报错,虽然 “new Suber().me()” 返回的结果,本质上是一个 Suber对象,Suber对象确实也具有 doSuber() 方法。但是,在编译器看来,”new Suber().me()” 返回结果的引用类型是 Super,自然不能在Super类型的引用上调用该类型没有定义的 doSuber() 方法。所以,我们可以改成如下的正确形式:
// 正确new Suber().me().doSuper();另外,既然 “new Suber().me()” 返回的结果确实是一个 Suber对象,如果想调用其特有的方法,我们可以使用强制类型转换来完成功能:
// 正确((Suber) new Suber().me()).doSuber();深入扩展
现在,假设我们增加了一个如下所示的类:Brother
class Brother extends Super{public void doBad() {System.out.println("好好学习");}}那么,大家思考一下如下的语句:
// 正确((Brother) new Suber().me()).beBad();这个语句真的是正确的吗?实际上,该语句确实可以通过静态类型检查和正确编译。毕竟,编译器不知道 “new Suber().me()” 的实际类型。但是,该语句在运行时出抛出如下的错误:
java.lang.ClassCastException: Suber cannot be cast to Brother原因很简单,两个不存在任何继承关系的类(Suber和Brother)不可以做类型转换。
总结
以上所述是小编给大家介绍的Java的静态类型检查示例代码详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
以下内容来自维基百科,关于静态类型检查和动态类型检查的解释:•静态类型检查:基于程序的源代码来验证类型安全的过程;•动态类型检查:在程序
这篇文章主要介绍了Java静态static关键字原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下sta
详解Java中的嵌套类与内部类在Java中,可以在一个类内部定义另一个类,这种类称为嵌套类(nestedclass)。嵌套类有两种类型:静态嵌套类和非静态嵌套类
Java中的Staticclass详解Java中的类可以是static吗?答案是可以。在Java中我们可以有静态实例变量、静态方法、静态块。类也可以是静态的。j
java中静态导入机制用法实例详解这里主要讲解了如何使用Java中静态机制的用法,这里提供了简单实例大家可以参考下。静态常量类在java开发中,我们会经常用到一