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().这就是所谓的动态多态性。
相关文章: