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().这就是所谓的动态多态性。
相关文章:
- How Java Compiler Generate Code for Overloaded and Overridden Methods?
- An example problem of Generic types
- Type Checking for Object Oriented Features
- Deep Understanding of Arrays.sort()
Overriding vs. Overloading in Java