Java中静态类型检查是如何进行的
以下内容来自维基百科,关于静态类型检查和动态类型检查的解释:
- 静态类型检查:基于程序的源代码来验证类型安全的过程;
- 动态类型检查:在程序运行期间验证类型安全的过程;
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类型;
译文链接:http://www.programcreek.com/2011/12/an-example-of-java-static-type-checking/
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· AI Agent爆火后,MCP协议为什么如此重要!
· Draw.io:你可能不知道的「白嫖级」图表绘制神器
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· Java使用多线程处理未知任务数方案