Java的静态类型检查示例代码详解
作者:mrr 发布时间:2023-08-09 10:42:13
关于静态类型检查和动态类型检查的解释:
静态类型检查:基于程序的源代码来验证类型安全的过程;
动态类型检查:在程序运行期间验证类型安全的过程;
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的静态类型检查示例代码详解网站的支持!
来源:http://www.tiantianbianma.com/java-static-type-check.html/
猜你喜欢
- 本文实例为大家分享了java生成验证码图片的具体代码,供大家参考,具体内容如下示例一:import org.apache.commons.c
- 1 前言前文已经讲述了Spring BeanFactory 与 FactoryBean 的区别详情,
- 前言前一段时间使用java来调用chatgpt的接口,然后写了一个简单小程序,java调用chatgpt接口,实现专属于自己的人工智能助手,
- Java数组的定义和使用如果希望保存一组有相同类型的数据,可以使用数组。数组的定义和内存分配Java 中定义数组的语法有两种:
- 前言图文并茂的内容往往让人看起来更加舒服,如果只是文字内容的累加,往往会使读者产生视觉疲劳。搭配精美的文章配图则会使文章内容更加丰富,增加文
- http://mp.baomidou.com/#/?id=%e7%ae%80%e4%bb%8b 这个是mybatisplus的官方文档,上面
- 概述Selenium是一款免费的分布式的自动化测试工具,支持多种开发语言,无论是C、 java、ruby、python、或是C# ,你都可以
- 外观模式: 又称门面模式: 外观Facade为子系统的一组接口提供一个一致界面,使得这组子系统易于使用(通过引入一个新的外观角色降低原系统复
- 相比于直线检测,直线拟合的最大特点是将所有数据只拟合出一条直线void fitLine( InputArray points, Output
- 前言SpringBoot引入neo4j <dependency> &nb
- 执行引擎也只有几个概念, JVM方法调用和执行的基础数据结构是 栈帧, 是内存区域中 虚拟机栈中的栈元素, 每一个方法的执行就对应着一个栈帧
- 一、实现原理 Mapper接口开发方法只需要程序员编写M
- 本文实例为大家分享了java开发利用jacob将word转pdf的具体代码,供大家参考,具体内容如下jacob 缺点:需要 window 环
- 一个中大型的 Java 项目往往包含若干 JAR 包,这些 JAR 包有着不同的版本号。如果这些 JAR 包单独发布,然后直接通过版本号引用
- 一、背景当我们在drools中编写规则时,有些时候存在重复的代码,那么我们是否可以将这些重复代码抽取出来,封装成一个function来调用呢
- 我就废话不多说了,大家还是直接看代码吧~//执行的是删除信息的操作 String a=request.getParameter("
- 一、目的针对不同地区,设置不同的语言信息。SpringBoot国际化配置文件默认放在classpath:message.properties
- 1、引言你能搜到这个教程,说明你对 Maven 感兴趣,但是又不是太理解。那么接下来这个系列的教程将会详细讲解 Maven 的用法,相信你看
- 一、Java把这些不同来源和目标的数据都统一抽象为数据流。Java语言的输入输出功能是十分强大而灵活的。在Java类库中,IO部分的内容是很
- 一、事件背景个人感觉自己做性能测试,可以说是轻车熟路了,而且工作多年一直都是这一套测试思路及体系,从未质疑过自己,也许是狮子座的迷之自信吧!