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

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

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

ab7653affab982b574eb7acc55df2e04.gif

代码示例

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

classSuper{

Superme(){

returnthis;

}

publicvoiddoSuper(){

System.out.println("www.tiantianbianma.com");

}

}

classSuberextendsSuper{

publicvoiddoSuber(){

System.out.println("天天编码");

}

}

首先,思考这个问题:”new Suber().me()” 的返回值是什么? 是一个 Super对象 还是一个 Suber对象?

这个 me() 方法被声明为返回一个 Super对象,所以,在编译期间,编译期认为它返回的是一个 Super对象。但是,在运行期间,该语句实际返回的是一个 Suber对象,因为 Suber继承了Super的me()方法,并返回了自身对象(多态性)。

静态检查

我们来看看常见的错误示例代码:

// 错误

newSuber().me().doSuber();

这个语句在编译时会报错,虽然 “new Suber().me()” 返回的结果,本质上是一个 Suber对象,Suber对象确实也具有 doSuber() 方法。但是,在编译器看来,”new Suber().me()” 返回结果的引用类型是 Super,自然不能在Super类型的引用上调用该类型没有定义的 doSuber() 方法。所以,我们可以改成如下的正确形式:

// 正确

newSuber().me().doSuper();

另外,既然 “new Suber().me()” 返回的结果确实是一个 Suber对象,如果想调用其特有的方法,我们可以使用强制类型转换来完成功能:

// 正确

((Suber)newSuber().me()).doSuber();

深入扩展

现在,假设我们增加了一个如下所示的类:Brother

classBrotherextendsSuper{

publicvoiddoBad(){

System.out.println("好好学习");

}

}

那么,大家思考一下如下的语句:

// 正确

((Brother)newSuber().me()).beBad();

这个语句真的是正确的吗?实际上,该语句确实可以通过静态类型检查和正确编译。毕竟,编译器不知道 “new Suber().me()” 的实际类型。但是,该语句在运行时出抛出如下的错误:

java.lang.ClassCastException:Subercannot be cast toBrother

原因很简单,两个不存在任何继承关系的类(Suber和Brother)不可以做类型转换。

天天编码 , 版权所有丨本文标题:深入分析Java的静态类型检查

转载请保留页面地址:http://www.tiantianbianma.com/java-static-type-check.html/

喜欢 (8)赏

[liershui1989]

ab7653affab982b574eb7acc55df2e04.gif分享 (0)

来源: http://www.tiantianbianma.com/java-static-type-check.html/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值