您的位置:首页 > 编程语言 > Java开发

Overriding vs Overloading in Java

2018-03-06 18:52 483 查看


定义

Overloading::同一个类中,方法名相同,但参数不同

Overriding:两个类中(父类与子类)方法签名相同(方法名称一样,参数完全一致),Overriding允许子类根据实际场景“重载”实现父类中同名方法。

Overriding vs Overloading

Overriding涉及的是一个运行时概念,而Overloading涉及的是编译期概念

多态是Overriding的应用场景,而非Overloading。

对象的实际类型而非对象引用类型决定了JVM运行时真正的调用方法,比如对于下面的语句, dog 就是一个对象引用,该引用指向了内存堆上的一个 Dog 对象,当JVM执行dog的相关方法时,实际调用的是 Hound 的相关方法,而非Dog中的相关方法

Overriding代码示例:

class Dog{
public void bark(){
System.out.println("woof ");
}
}
class Hound extends Dog{
public void sniff(){
System.out.println("sniff ");
}

public void bark(){
System.out.println("bowl");
}
}

public class OverridingTest{
public static void main(String [] args){
Dog dog = new Hound();
dog.bark();
}
}


代码输出如下:

bowl


简单解释如下:

在上面的示例中,dog是一个Dog类型的本地变量(或称局部变量: local variable ,对比理解对象的成员变量: member variable ),这是一个对象引用,该引用指向内存堆中某个具体的Dog对象,在编译期,Java虚拟机会检查Dog类是否包含 bark方法,一旦确定Dog类包含该方法,那么源代码就编译通过。在运行期,JVM会在内存堆上创建一个 Hound对象,并且将栈中的dog引用指向该地址,当虚拟机调用bark方法时,它调用的就是Hound的bark方法,这就是我们常说的多态(Dynamic Polymorphism

Overloading代码实例

class Dog {
public void bark() {
System.out.println("woof");
}

public void bark(int num) {
for (int i = 0; i < num; i++) {
System.out.println("woof");
}
}
}


原文链接:https://www.programcreek.com/2009/02/overriding-and-overloading-in-java-with-examples/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: