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

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

有兴趣的话可以看看 这篇文章,下边gg_shily朋友和我的一些讨论,在gg_shily的激发下,我决定仔细研究一下这个问题,在我的很多文章中都用过的字节码,我想在这里也能帮助我 。下边是分析的结果,为了方便观看,我把里边的两个类稍微变动一下
 1 package  ov;
 2
 3 public   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)

你可能感兴趣的:(对(重载overloading和覆写overriding哪个更早执行-- visitor帮助篇)这篇文章的说明)