服务器之家

服务器之家 > 正文

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

时间:2020-04-30 09:47     来源/作者:风一样的码农

以下内容来自维基百科,关于静态类型检查和动态类型检查的解释:

•静态类型检查:基于程序的源代码来验证类型安全的过程;

•动态类型检查:在程序运行期间验证类型安全的过程;

Java使用静态类型检查在编译期间分析程序,确保没有类型错误。基本的思想是不要让类型错误在运行期间发生。

以下代码是一个例子,理解了他,你会更好的理解Java静态类型检查是如何工作的。

代码示例

假定我们有如下类,A和B,B继承A。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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类型。

?
1
2
//illegal
new B().me().doB();

所以,只有下面的代码是可以被调用的:

?
1
2
//legal
new B().me().doA();

然而,我们可以将其强制类型转换成B,如下代码:

?
1
2
//legal
((B) new B().me()).doB();

接下来,我们添加一个C类:

?
1
2
3
4
5
class C extends A{
public void doBad() {
System.out.println("Do C");
}
}

那么,下面的代码语句将通过静态类型检查:

?
1
2
//legal
((C) new B().me()).beBad();

编译器不知道它的真实类型,但是在运行期间将会抛出异常,因为B类型不能转换成C类型;

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

标签:

相关文章

热门资讯

沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意 2019-07-07
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
超A是什么意思 你好a表达的是什么
超A是什么意思 你好a表达的是什么 2019-06-06
和平精英超高音质怎么修改 和平精英超高音质重启设置方法
和平精英超高音质怎么修改 和平精英超高音质重启设置方法 2019-06-26
返回顶部