DANCE WITH JAVA

开发出高质量的系统

常用链接

统计

积分与排名

好友之家

最新评论

对(重载overloading和覆写overriding哪个更早执行-- visitor帮助篇)这篇文章的说明

有兴趣的话可以看看这篇文章,下边gg_shily朋友和我的一些讨论,在gg_shily的激发下,我决定仔细研究一下这个问题,在我的很多文章中都用过的字节码,我想在这里也能帮助我 。下边是分析的结果,为了方便观看,我把里边的两个类稍微变动一下
 1package ov;
 2
 3public class Child extends Parent {
 4
 5    public void run(Object o) {
 6        System.out.println(" in Child +param:Object ");
 7    }

 8
 9    public void run(String str) {
10        System.out.println(" in Child + param:String ");
11    }

12
13    public static void main(String[] args) {
14        
15        String str = new String();
16        Parent p = new Child();
17        test(p,str);
18    }

19    public static void test(Parent p,String str){
20        p.run(str);
21    }

22}
然后编译,反编译得到字节码如下:(得到字节码的方法见这里
public class ov.Child extends ov.Parent{
public ov.Child();
  Code:
   
0:   aload_0
   
1:   invokespecial   #8//Method ov/Parent."<init>":()V
   4:   return

public void run(java.lang.Object);
  Code:
   
0:   getstatic       #16//Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc     #22//String  in Child +param:Object
   5:   invokevirtual   #24//Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
   
8:   return

public void run(java.lang.String);
  Code:
   
0:   getstatic       #16//Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc     #32//String  in Child + param:String
   5:   invokevirtual   #24//Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
   
8:   return

public static void main(java.lang.String[]);
  Code:
   
0:   new     #38//class java/lang/String
   3:   dup
   
4:   invokespecial   #40//Method java/lang/String."<init>":()V
   7:   astore_1
   
8:   new     #1//class ov/Child
   11:  dup
   
12:  invokespecial   #41//Method "<init>":()V
   15:  astore_2
   
16:  aload_2
   
17:  aload_1
   
18:  invokestatic    #42//Method test:(Lov/Parent;Ljava/lang/String;)V
   21:  return

public static void test(ov.Parent, java.lang.String);
  Code:
   
0:   aload_0
   
1:   aload_1
   
2:   invokevirtual   #50//Method ov/Parent.run:(Ljava/lang/String;)V
   5:   return

}
可以看到调用的是Parent.run(String)这样说明在编译期间,因为重载就决定了Parent.run(String)
然后到运行期,会向下转型到Child.run(String)

posted on 2006-12-20 00:32 dreamstone 阅读(2587) 评论(3)  编辑  收藏 所属分类: jdk相关

评论

# re: 对(重载overloading和覆写overriding哪个更早执行-- visitor帮助篇)这篇文章的说明 2006-12-20 20:43 gg_shily

不好意思,我白天用不了msn,周末的时候才能用,我的msn是GG_sHiLy@hotmail.com,加你了,你这么说我觉得就很明白了,呵呵  回复  更多评论   

# re: 对(重载overloading和覆写overriding哪个更早执行-- visitor帮助篇)这篇文章的说明 2007-02-18 01:39 喜来了

对Java中, 怎样从一个方法调用instance.foo(args) ,找到实际调用的函数, 在Core Java里有很详细的描述, 简单讲, 每个Class会保存一个方法调用表, 根据instance的具体值和方法的signature寻找。 顺带的, Core Java里还详细讲述了Java Compiler和Java解释器是怎样从一个类名找到一个具体的类文件位置。

其实所谓的Polymorphy也好, Overloading也好都是对Java Compiler和解释器内部算法的抽象。如果有人需要Core Java的电子书,我这有,发封信给我。也可以从这个站上下http://www.blogjava.net/xilaile/archive/2007/02/16/100022.aspx
很多关于计算机的书  回复  更多评论   

# re: 对(重载overloading和覆写overriding哪个更早执行-- visitor帮助篇)这篇文章的说明 2007-06-21 13:18 s

我要Core Java的电子书谢谢 shangcom2006@163.com  回复  更多评论   


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


网站导航: