`

重载overloading和覆写overriding哪个更早执行

    博客分类:
  • Java
阅读更多
重载overloading和覆写overriding哪个更早执行-- visitor帮助篇
2006年12月19日 星期二 上午 09:14

重载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是先重载后覆写的。

分享到:
评论

相关推荐

    重载与覆写/重写的区别

     重载Overloading是一个类中多态性的一种表现。 (2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。  调用方法时通过传递给它们的不同参数个数和参数...

    详解java重载与覆写的区别

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

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

    综上所述,面向对象中的继承是一个非常强大的概念,通过深入了解子类对象的实例化过程、方法覆写的概念以及`super`关键字的使用,我们可以更好地利用面向对象编程的优势,提高代码的可维护性和可扩展性。

    Visual C程序员面试问题及答案.pdf,这是一份不错的文件

    9. **重载与覆写**:重载(Overloading)是指在同一类中有多个同名但参数列表不同的方法。覆写(Overriding)是指子类中定义与父类方法签名完全相同的方法,以改变父类的行为。覆写时需使用`override`关键字。 10. ...

    精品(2021-2022年)资料软件开发c#.doc

    7. **方法的重载和覆写(Overloading and Overriding)**: - **重载**:通过不同的参数列表来实现多态性,即具有相同方法名但参数列表不同的方法。 - **覆写**:子类可以改变父类中虚方法的行为,通过`override`...

    精品(2021-2022年)资料软件开发c.doc

    5. **重载和覆写**: - 重载(Overloading)允许在同一类中定义具有不同参数列表的同名方法。 - 覆写(Overriding)是指子类中重新实现父类的虚方法(使用`virtual`修饰),以改变其行为。覆写的方法必须与被覆写...

    C#面试题,C#面试题

    7. **重载与覆写**:重载(Overloading)发生在同一类中,通过不同参数列表实现方法的不同实现。覆写(Overriding)发生在继承关系中,子类改变父类的虚方法行为。 8. **常量与只读字段**:`const`是编译时常量,值...

    ,NET概念问题总结.doc

    2. 重载和覆写的区别: 重载(Overloading)发生在同一个作用域内,指的是一个类中存在多个同名方法,但它们的参数列表不同(参数数量、类型或顺序不同)。重载不涉及继承关系,仅是提供多种调用方式。 覆写...

    NET面试大全,标题写的详细更容易被他人下载

    - 覆写(Overriding)是子类重新定义父类虚方法的行为,要求子类方法签名与父类完全一致,并使用`override`关键字。 9. **虚拟与非虚拟方法**:使用`virtual`关键字标记的方法可以被子类覆写。覆写方法不能是静态...

    Java学习资料Java学习资料

    在Java中,多态性主要体现在方法的重载(overloading)和方法的重写(overriding)。方法的重载是指在同一个类中可以有多个同名但参数列表不同的方法;而方法的重写则是在子类中重新定义父类已有的方法,以便提供...

    C++面试基础问题

    - **重载(Overloading)**:在同一类中,通过提供具有相同名称但不同参数列表的方法来实现。 - **覆写(Overriding)**:在派生类中重新定义基类中的虚拟方法,以便改变其行为。 #### 九、`virtual`关键字的意义 在...

    DotNet面试题130道

    - 重载(overloading)指的是在一个类中可以有多个同名的方法,只要它们的参数列表不同即可。覆写(overriding)则是子类对基类中虚拟方法的重新实现,以提供特定的行为。 10. **Virtual关键字的意义**: - 在...

    C#面试综合试题

    - **覆写(Overriding)**: 发生在继承关系中,子类可以覆写(或重写)父类的方法,以提供新的实现。这允许子类修改或增强父类的行为。 #### 6. B/S结构系统中变量值的传递 除了Session、Cookie和Application之外...

    .NET面试题

    **重载**(overloading)指的是在同一个类中定义多个同名但参数列表不同的方法,编译器会根据调用时的参数类型和数量来决定具体调用哪个方法。而**覆写**(overriding)发生在继承关系中,子类可以通过使用override...

    C#绝对经典面试题及解答

    - **重载(Overloading)**是指在同一个类中定义多个同名方法,但它们的参数列表不同(包括参数的数量、类型或顺序)。重载方法的选择由编译器根据调用时传入的参数类型自动决定。 - **覆写(Overriding)**是指子类...

    面向对象编程实验ssd3

    在Java或C++中,这可以通过方法的重载(Overloading)和覆盖(Overriding)来实现。实验可能要求学生设计具有多态性的类结构,并编写相应的代码。 5. **接口与抽象类**:接口定义了对象必须实现的一系列方法,而...

    吉林大学2002级C++面向对象程序设计试题(B卷)

    9. **行为多态是指不同类的对象可以实现同一行为,但实现方法不同,利用函数和运算的重载(overloading)及继承中的覆写(overriding)可以实现行为多态。** - 正确。多态可以通过重载和覆写来实现。 10. **设有函数...

    C_程序员面试考题集锦.doc

    - **覆写(Overriding):** 子类重新定义父类的虚方法。使用 `virtual` 和 `override` 关键字实现,允许子类修改或扩展父类的行为。 **6. B/S 结构中变量值的传递** 除了 Session、Cookie、Application 外,还可以...

    java知识点整理(良心出品必属精品).doc

    3. **重载**(Overloading): - 同一类中。 - 方法名相同。 - 参数列表不同。 4. **重写**(Overriding): - 子类中覆写父类方法。 - 方法名、返回类型和参数列表必须完全相同。 以上是对Java基础语法和面向...

Global site tag (gtag.js) - Google Analytics