tory320

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  10 随笔 :: 0 文章 :: 1 评论 :: 0 Trackbacks

重载overloading和覆写overriding哪个更早执行-- visitor帮助篇

重载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因为这个顺序更方便一般人理解

posted on 2006-12-18 22:38 tory 阅读(231) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: