重载overloading和覆写overriding哪个更早执行-- visitor帮助篇 一:问题提出虽然我们经常写程序用到重载和覆写,但是很少会考虑他们的执行顺序。下边的内容就是关于,他们同时出现时哪个先起作用:二:问题分析Java是"动态单分派静态多分派语言",这个定义已经多次提起,如果你不了解这些概念,看这里"visitor模式准备"所以就注定了重载(静态多分派)要早于覆写(动态单分派),因为静态分派是编绎期实现的,动态分派是执行期实现的。三:验证简单验证一下,顺变提高记忆
1
500)this.width=500'>
500)this.width=500'>
public
class
Parent
500)this.width=500'>
{
2
500)this.width=500'>
500)this.width=500'>
public
void
run(Object o)
500)this.width=500'>
{
3
500)this.width=500'> System.out.println(
"
in Parent +param:object
"
);
4
500)this.width=500'> }
5
500)this.width=500'>
500)this.width=500'>
public
void
run(
int
i)
500)this.width=500'>
{
6
500)this.width=500'> System.out.println(
"
in Parent + param:int
"
);
7
500)this.width=500'> }
8
500)this.width=500'>}
9
500)this.width=500'>
10
500)this.width=500'>
500)this.width=500'>
public
class
Child
extends
Parent
500)this.width=500'>
{
11
500)this.width=500'>
12
500)this.width=500'>
500)this.width=500'>
public
void
run(Object o)
500)this.width=500'>
{
13
500)this.width=500'> System.out.println(
"
in Child +param:Object
"
);
14
500)this.width=500'> }
15
500)this.width=500'>
500)this.width=500'>
public
void
run(String str)
500)this.width=500'>
{
16
500)this.width=500'> System.out.println(
"
in Child + param:String
"
);
17
500)this.width=500'> }
18
500)this.width=500'>
500)this.width=500'>
public
static
void
main(String[] args)
500)this.width=500'>
{
19
500)this.width=500'> Parent p
=
new
Child();
20
500)this.width=500'> String str
=
new
String();
21
500)this.width=500'> p.run(str);
22
500)this.width=500'> }
23
500)this.width=500'>}
运行结果是什么?in Child +param:ObjectinChild是确认的,但是为什么是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因为这个顺序更方便一般人理解 |