Java-重载和覆盖概念

Posted

技术标签:

【中文标题】Java-重载和覆盖概念【英文标题】:Java- Overloading and Overriding Concept 【发布时间】:2016-02-08 13:30:38 【问题描述】:
class Base 

    int value = 0;

    Base() 
        add();
    

    void add() 
        value += 10;
    

    int get() 
        return value;
    


class Derived extends Base 
    Derived() 
        add();
    

    void add() 
        value += 20;
    

调用派生类构造函数,然后add(),值变成40,为什么?

【问题讨论】:

【参考方案1】:

当您的 Derived 类等子类被初始化时。它调用其超类的构造函数,在本例中为 Base。所以在这种情况下 add() 被调用了两次,在 Base 的构造函数和 Derived 的构造函数中。 因为 add() 在 Derive 中被覆盖,所以对 Derive 对象的 add() 调用将产生 20。即使调用是从 Add() 方法返回 10 的 Base 内部进行的。

【讨论】:

【参考方案2】:

要亲自了解到底发生了什么,您可以在调试器中运行您的代码并单步执行以查看逐步发生的情况。

会发生这样的事情:

    创建新的Derived 对象时,Base 部分中的字段value 首先初始化为0。 然后调用超类Base的构造函数。这会调用add() 方法。 add()方法被重写,所以调用Derived类中的版本,将20添加到value;所以value 现在是20。 然后调用Derived的构造函数。这将再次调用add() 方法。 再次调用Derived 类中的add(),将20 添加到value。 结果是value 包含值40

Java 语言规范的Paragraph 12.4 解释了如何初始化新对象的规则,以及事情发生的顺序。

【讨论】:

从基类构造函数如何调用派生类的方法,为什么不基类方法... @Yogendra123 - 因为这就是覆盖的工作原理!所有对类>>及其超类super.<methodName>(例如super.add)或具有相同签名且从不被覆盖的私有方法。【参考方案3】:

调用构造函数时,调用add() 方法时,value 字段会增加 20。然后你再次调用add() 方法,它再次添​​加20,因此value 是20。

【讨论】:

以上是关于Java-重载和覆盖概念的主要内容,如果未能解决你的问题,请参考以下文章

比较Java方法的重载与覆盖

多态性、重载和覆盖是相似的概念吗? [关闭]

8.继承覆盖重载与多态

请问重载overload,覆盖override,重写overwrite,这三者之间有啥区别呢?

Java中的方法覆盖(Overriding)和方法重载(Overloading)是啥意思?

Java:方法重载和方法覆盖的异同