Java中静态类型检查是如何进行的实例思路详解
作者:风一样的码农 时间:2022-01-01 16:08:30
以下内容来自 * ,关于静态类型检查和动态类型检查的解释:
•静态类型检查:基于程序的源代码来验证类型安全的过程;
•动态类型检查:在程序运行期间验证类型安全的过程;
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中静态类型检查是如何进行的实例思路详解的相关知识网站的支持!
标签:java,静态,检查
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
巧用Spring中的@Order进行排序
2023-07-13 05:53:48
java 二分法算法的实例
2023-04-25 05:04:05
java实现幸运抽奖功能
2023-11-27 07:24:16
![](https://img.aspxhome.com/file/2023/9/60479_0s.jpg)
SpringBoot中利用AOP和拦截器实现自定义注解
2022-09-14 00:26:53
![](https://img.aspxhome.com/file/2023/1/72391_0s.jpg)
C#利用缓存分块读写大文件
2022-10-20 11:18:22
springBoot系列常用注解(小结)
2023-12-17 23:26:45
![](https://img.aspxhome.com/file/2023/7/71027_0s.png)
Java如何基于ProcessBuilder类调用外部程序
2023-11-27 20:19:57
![](https://img.aspxhome.com/file/2023/0/59210_0s.png)
浅谈Synchronized和Lock的区别
2023-10-26 04:28:33
聊聊Java的switch为什么不支持long
2023-08-24 17:35:14
spring与mybatis三种整合方法
2021-11-27 22:00:46
@RequestBody,@RequestParam和@Param的区别说明
2023-07-20 06:29:03
![](https://img.aspxhome.com/file/2023/2/72302_0s.png)
ibatis学习之搭建Java项目
2021-11-02 00:35:29
Spring+SpringMVC+MyBatis深入学习及搭建(二)之MyBatis原始Dao开发和mapper代理开发
2021-07-24 06:36:00
![](https://img.aspxhome.com/file/2023/4/67124_0s.png)
Spring Boot集成MyBatis的方法
2021-11-03 23:11:05
![](https://img.aspxhome.com/file/2023/6/64486_0s.png)
System.getProperty(user.dir)定位问题解析
2023-11-20 08:50:44
![](https://img.aspxhome.com/file/2023/8/79198_0s.png)
Java 数据结构之删除链表中重复的结点
2023-11-28 15:36:22
![](https://img.aspxhome.com/file/2023/6/60346_0s.gif)
AndroidStudio接入Unity工程并实现相互跳转的示例代码
2023-08-06 23:34:51
![](https://img.aspxhome.com/file/2023/6/84736_0s.gif)
基于JWT的spring boot权限验证技术实现教程
2022-07-20 01:48:58
Swift洗牌动画效果的实现方法
2023-06-21 14:01:56
Java实战之实现一个好用的MybatisPlus代码生成器
2023-06-18 02:16:10
![](https://img.aspxhome.com/file/2023/8/57498_0s.png)