`
dreamstone
  • 浏览: 289069 次
  • 来自: ...
文章分类
社区版块
存档分类

对(重载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)
分享到:
评论

相关推荐

    重载与覆写/重写的区别

     调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。 (3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。  无法以返回值...

    Overloading&Overriding

    在面向对象编程中,Overloading和Overriding是两个重要的概念,它们都是多态性的体现。下面我们将对这两个概念进行详细的解释。 1. 方法重载(Overloading) 方法重载是让类以统一的方式处理不同类型数据的一种...

    operator-overloading-js, JS简单运算符重载库.zip

    operator-overloading-js, JS简单运算符重载库 目录Operator-Overloading-JS安装工具node MODULE ( NPM )浏览器( Bower )Sneak示例重载运算符设计考虑/非常重要/必须阅读。Definig使用运算符重载的上下文

    详解java重载与覆写的区别

    Java中的重载(Overloading)和覆写(Overriding)是面向对象编程中的两个关键概念,它们都是实现多态性的方式,但有着本质的区别。 **重载(Overloading)**: 重载是指在同一个类中可以有多个同名方法,但这些方法的...

    【独家】【笔面试知识要点】17.函数重载空指针错误1

    函数重载空指针错误 函数重载是Java编程语言中一个重要的概念,它允许开发者在同一个类中定义多个同名的方法,只要这些方法的参数列表不同即可。这可以提高程序的可读性和灵活性。然而,如果不正确地使用函数重载,...

    Java 实例 - 重载(overloading)方法中使用 Varargs技术包含源代码和详细教程.zip

    此资源包包含了相关的源代码实例和详细教程,帮助你更好地理解和应用这一概念。 首先,我们来了解什么是方法重载。在Java中,当一个类中存在两个或更多个方法名相同,但参数列表不同的方法时,我们就说这些方法是...

    C++函数的重载和覆盖

    本篇文档将深入探讨这两个主题,帮助你更好地理解和运用它们。 ### 1. 函数的重载(Overloading) 函数重载允许在同一个作用域内定义多个同名函数,但这些函数的参数列表必须有所不同。这通常通过改变参数的数量、...

    27.面向对象高级-继承的进一步研究

    通过具体的案例来理解继承的概念和应用,可以帮助加深对继承机制的理解。例如,可以设计一个基类`Animal`,然后创建几个子类如`Dog`、`Cat`等来展示如何通过继承实现代码复用和扩展。 综上所述,面向对象中的继承是...

    Java中重载与重写,一篇文章快速了解

    在Java编程语言中,"重载"(Overloading)和"重写"(Overriding)是两个非常重要的概念,它们都是面向对象特性的重要体现。理解并掌握这两个概念对于编写高效、可维护的代码至关重要。 首先,我们来谈谈“重载”...

    Method-Overloading-and-OverRiding.rar_OA系统_Java_

    在Java编程语言中,"方法重载(Method Overloading)"和"方法重写(Method Overriding)"是两个核心概念,它们都是实现多态性的重要方式,而在OA(Office Automation)系统开发中,理解并熟练运用这两个概念是至关...

    oop-java-overloading-mogyorosibalin:oop-java-overloading-mogyorosibalin由GitHub Classroom创建

    标题"oop-java-overloading-mogyorosibalin"表明这是一个关于Java中的面向对象编程,特别是关于方法重载的学习资源。"mogyorosibalin"可能是一个项目或课程的名称,它由GitHub Classroom创建,通常用于教育和协作...

    Java重载和重写的区别--源码实例

    Java中的重载(Overloading)和重写(Overriding)是面向对象编程中的两种关键特性,它们涉及到方法的多态性。理解这两者的区别对于编写高效、可维护的代码至关重要。 **重载(Overloading)**是指在一个类中,可以有多个...

    Java编程中对象的创建与使用以及方法的重构与重载的区别说明

    ### Java编程中对象的创建与使用以及方法的重构与重载的区别说明 #### 对象的创建与使用 在Java编程语言中,一切皆基于对象。理解如何创建对象以及如何使用对象是学习Java的基础。 ##### 1. 对象的创建过程 创建...

    方法重载和方法重写

    在编程语言中,方法重载(Overloading)和方法重写(Overriding)是两个非常重要的概念,它们都是实现多态性(Polymorphism)的关键机制。本文将深入探讨这两个概念,以及它们在实际编程中的应用。 ### 方法重载...

    oop-java-overloading-nhenree:oop-java-overloading-nhenree由GitHub Classroom创建

    标题"oop-java-overloading-nhenree"表明这是一个关于Java中对象导向编程(OOP)和方法重载的学习项目,可能是一个练习或教程,由GitHub Classroom创建,通常用于教育目的,帮助学生理解和掌握Java中的这一关键概念...

    JAVA文章精选542个(txt) 免费分享

    阐述了Java中的方法重载(Overloading)和方法覆盖(Overriding)概念,以及运行时类型识别(多态性)在面向对象编程中的作用。 10. **SSL與數位認證.txt**: SSL(Secure Sockets Layer)和数字认证是网络安全的...

    java中的重载和重写的区别

    Java中的重载(Overloading)和重写(Overriding)是面向对象编程中两个重要的概念,它们体现了Java的多态性。多态性是面向对象编程的三大特性之一,另外两个是封装和继承。 首先,让我们详细解释一下方法的重载。重载...

    JAVA重写和重载.pdf

    JAVA重写和重载(Overriding和Overloading) JAVA中有两种不同的多态性表现形式:重写(Overriding)和重载(Overloading)。下面将对这两种形式进行详细的解释。 重载(Overloading) 重载是指在一个类中可以...

    Java中重载和重写总结

    Java 中的重载(Overloading)和重写(Overriding)是两个非常重要的概念,它们都是多态性的体现形式。 一、Java 中的重载(Overloading) Java 中的重载是指在同一个类中可以创建多个方法,它们具有相同的名字,...

Global site tag (gtag.js) - Google Analytics