Java的静态类型检查示例代码详解

所属分类: 软件编程 / java 阅读数: 16
收藏 0 赞 0 分享

关于静态类型检查和动态类型检查的解释:

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

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

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

在各色各样的编程语言中,总共存在着两个类型检查机制:静态类型检查和动态类型检查。

静态类型检查是指通过对应用程序的源码进行分析,在编译期间就保证程序的类型安全。

动态类型检查是在程序的运行过程中,验证程序的类型安全。在Java中,编译期间使用静态类型检查机制分析Java源代码,可以提前发现Java中类型缺少的错误。这个机制的好处是,不让错误的事情在运行时才被发现。本文,将使用几个代码示例,深入讲解Java中的类型检查机制。一旦完全理解了本文的例子,就完全掌握了Java中的静态类型检查。

深入分析Java的静态类型检查

代码示例

假设我们有如下的两个类,类Super 和 类Suber,而且他们具有如下继承关系:

class Super {
Super me() {
return this;
}
public void doSuper() {
System.out.println("www.tiantianbianma.com");
}
}
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的静态类型检查示例代码详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

更多精彩内容其他人还在看

Java数据类型的规则

这篇文章主要介绍了Java数据类型的规则的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Spring整合TimerTask实现定时任务调度

这篇文章主要介绍了Spring整合TimerTask实现定时任务调度的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

详解SpringMVC使用MultipartFile实现文件的上传

本篇文章主要介绍了SpringMVC使用MultipartFile实现文件的上传,本地的文件上传到资源服务器上,比较好的办法就是通过ftp上传。这里是结合SpringMVC+ftp的形式上传的,有兴趣的可以了解一下。
收藏 0 赞 0 分享

SpringMVC上传文件的三种实现方式

本篇文章主要介绍了SpringMVC上传文件的三种实现方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

微信公众帐号开发-自定义菜单的创建及菜单事件响应的实例

本篇文章主要介绍了微信公众帐号开发-自定义菜单的创建及菜单事件响应的实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
收藏 0 赞 0 分享

浅析Java中的继承与组合

本文将介绍组合和继承的概念及区别,并从多方面分析在写代码时如何进行选择。文中通过示例代码介绍的很详细,有需要的朋友可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享

利用反射获取Java类中的静态变量名及变量值的简单实例

下面小编就为大家带来一篇利用反射获取Java类中的静态变量名及变量值的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

java启动线程的3种方式对比分析

这篇文章主要为大家对比分析了java启动线程的3种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

SpringMVC上传和解析Excel方法

这篇文章主要介绍了SpringMVC上传和解析Excel方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

JAVA中String类与StringBuffer类的区别

这篇文章主要为大家详细介绍了JAVA中String类与StringBuffer类的区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多