Java中静态类型检查是如何进行的实例思路详解

 更新时间:2016年05月18日 09:56:07   作者:风一样的码农  
这篇文章主要介绍了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类型;

以上所述是小编给大家介绍的Java中静态类型检查是如何进行的实例思路详解的相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Maven将代码及依赖打成一个Jar包的方式详解(最新推荐)

    Maven将代码及依赖打成一个Jar包的方式详解(最新推荐)

    这篇文章主要介绍了Maven将代码及依赖打成一个Jar包的方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • 详解springboot shiro jwt实现权限管理

    详解springboot shiro jwt实现权限管理

    为什么使用jwt呢,因为可以通过URL,POST参数或者在HTTP header发送,因为数据量小,传输速度也很快。本篇通过具体代码来进行详情解析,对大家的学习或工作具有一定的参考借鉴价值
    2021-09-09
  • 解决rocketmq-client日志保存路径的问题

    解决rocketmq-client日志保存路径的问题

    这篇文章主要介绍了解决rocketmq-client日志保存路径的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 关于SpringBoot Actuator漏洞补救方案

    关于SpringBoot Actuator漏洞补救方案

    SpringBoot Actuator模块提供了健康检查,审计,指标收集,HTTP 跟踪等,是帮助我们监控和管理SpringBoot应用的模块,本文将主要介绍SpringBoot Actuator漏洞的补救方案,需要的朋友可以参考下
    2023-06-06
  • Java使用JavaMail发送邮件的方法

    Java使用JavaMail发送邮件的方法

    这篇文章主要介绍了Java使用JavaMail发送邮件的方法,结合实例形式分析了Java使用JavaMail实现邮件发送的具体步骤与相关实现代码,需要的朋友可以参考下
    2016-04-04
  • 使用Properties读取配置文件的示例详解

    使用Properties读取配置文件的示例详解

    开发SpringBoot项目时,使用配置文件配置项目相关属性是必不可少的,所以下文为大家准备了使用Properties读取配置文件的示例代码,希望对大家有所帮助
    2023-06-06
  • java实现简单点赞功能

    java实现简单点赞功能

    这篇文章主要为大家详细介绍了java实现简单点赞功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 有关IntelliJ IDEA中LeetCode插件配置问题

    有关IntelliJ IDEA中LeetCode插件配置问题

    这篇文章主要介绍了关于IntelliJ IDEA中LeetCode插件配置问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 关于Java父类没有无参构造方法子类处理方法

    关于Java父类没有无参构造方法子类处理方法

    父类无参构造方法,子类不写,其实会默认调用父类的无参构造方法也就是用super(),编译运行后,会打印出"子类会调用Father的第一个构造方法,这篇文章给大家介绍关于Java父类没有无参构造方法子类处理方法,感兴趣的朋友一起看看吧
    2024-01-01
  • 详述IntelliJ IDEA 中自动生成 serialVersionUID 的方法(图文)

    详述IntelliJ IDEA 中自动生成 serialVersionUID 的方法(图文)

    本篇文章主要介绍了详述IntelliJ IDEA 中自动生成 serialVersionUID 的方法(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-11-11

最新评论