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().这就是所谓的动态多态性。
Related posts:
- 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()