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-重载和覆盖概念的主要内容,如果未能解决你的问题,请参考以下文章
请问重载overload,覆盖override,重写overwrite,这三者之间有啥区别呢?