Java中的方法重写(Overriding)与步骤重载(Overloading)

Java中的方法重写(Overriding)与方法重载(Overloading)

1.定义

Overriding和Overloading对Java编程新手来说是两个比较容易混淆的概念。

方法重载(Overloading)是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同。

方法重写(Overriding)是两个方法具有相同的参数,但是不同的实现方式。其中一个存在于父类,另一个存在于子类。

2.重写和重载

下面是一些关于重写和重载重要的事实:

1.真正的对象类型,而不是引用变量的类型,决定了在运行时哪个重写的方法被调用是在运行时使用。
2.引用类型决定哪个重载的方法在编译时将会被调用。
3.多态性适用于重写,不适用与重载。

3.重写的例子

阅读完代码后,猜猜输出是什么?

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 Main{
    public static void main(String [] args){
        new Hound().bark();
        ((Dog) new Hound()).bark();
        //((Dog) new Hound()).sniff();
    }
}
Output?

bowl
bowl
一个更好的例子
class Animal {
	void stinky() {
		System.out.println("stinky animal !");
	}
}
 
class Dog extends Animal {
	public void stinky() {
		System.out.println("stinky dog !");
	}
 
	public void bark() {
		System.out.println("wow wow");
	}
}
 
class Cow extends Animal {
	public void stinky() {
		System.out.println("stinky cow !");
	}
}
 
public class TestOverriding {
	public static void main(String[] args) {
		Animal obj = new Dog();
		obj.stinky();
	}
}
当您创建一个对象(与上边一样)并调用方法:
Animal obj = new Dog();
obj.stinky();

编译器需要做的是去检测对象(在这里是Animal)的类型;然后检测方法stinky()在对象Animal中是否存在?永远要记住,对象是在运行时创建的。所以编译器是没有办法知道Dog类中的stinky()方法被调用。所以在编译时引用变量的类类型进行检查,来检查这样的方法存在与否。

现在,在运行时,JVM虽然知道对象的类类型是Animal,在运行时它指向的是Dog的对象。因此,它调用Dog类的stinky().这就是所谓的动态多态性。

相关文章:

  1. How Java Compiler Generate Code for Overloaded and Overridden Methods?
  2. An example problem of Generic types
  3. Type Checking for Object Oriented Features
  4. Deep Understanding of Arrays.sort()
原文:

Overriding vs. Overloading in Java