重载overloading和覆写overriding哪个更早执行-- visitor帮助篇
一:问题提出
虽然我们经常写程序用到重载和覆写,但是很少会考虑他们的执行顺序。下边的内容就是关于,他们同时出现时
哪个先起作用:
二:问题分析
Java是"动态单分派静态多分派语言",这个定义已经多次提起,如果你不了解这些概念,看这里"visitor模式准备"
所以就注定了重载(静态多分派)要早于覆写(动态单分派),因为静态分派是编绎期实现的,动态分派是执行期实现的。
三:验证
简单验证一下,顺变提高记忆
1
public
class
Parent
{
2
public
void
run(Object o)
{
3
System.out.println(
"
in Parent +param:object
"
);
4
}
5
public
void
run(
int
i)
{
6
System.out.println(
"
in Parent + param:int
"
);
7
}
8
}
9
10
public
class
Child
extends
Parent
{
11
12
public
void
run(Object o)
{
13
System.out.println(
"
in Child +param:Object
"
);
14
}
15
public
void
run(String str)
{
16
System.out.println(
"
in Child + param:String
"
);
17
}
18
public
static
void
main(String[] args)
{
19
Parent p
=
new
Child();
20
String str
=
new
String();
21
p.run(str);
22
}
23
}
运行结果是什么?
in Child +param:Object
inChild是确认的,但是为什么是object,而不是String,我们放入的就是String啊。
首先来分析执行过程。
定义韦类型Parent p在执行run(Str)的时候,
1,如果是先执行重载,然後是执行覆写的过程
重载时因为找不到对应的String参数的函数,所以定位到接受父类的run(Object o)函数,
覆写时因为传入时父类告诉子类的对象类型是Object,所以执行run(Object o);
正是我们看到的结果,所以在Java中执行的顺序是这样的。
2,为了对比,说一下先覆写后重载的过程
如果是先覆写,再重载
覆写时因为确定对象实际是子类,所以直接覆写到Child,然後重载,发现有对应的String为参数的函数
执行,run(String str);
应该输出的结果:in Child +param:String
但我们看到结果显然是1,所以验证了Java是先重载后覆写的。
最后的部分:
看完本文,如果你对visitor模式有更多的兴趣,想了解更多请看如下几篇文章。
1,静态分派,动态分派,多分派,单分派 -------------- visitor模式准备
2,访问差异类型的集合类 ------------------------ visitor模式入门
3,visitor模式理论及学术概念------------------- visitor模式深入
4,visitor模式和其它模式的比较和关系------------- visitor模式总结
5,重载overloading和覆写overriding哪个更早执行-- visitor帮助篇 (本文)
虽然排列顺序是1,2,3,4,5 但是我个人建议的学习方式是2,1,3,4,5因为这个顺序更方便一般人理解