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

1.定义

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

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

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

2.重写和重载

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

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

3.重写的例子

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

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. class Dog{  
  2.     public void bark(){  
  3.         System.out.println("woof ");  
  4.     }  
  5. }  
  6. class Hound extends Dog{  
  7.     public void sniff(){  
  8.         System.out.println("sniff ");  
  9.     }  
  10.    
  11.     public void bark(){  
  12.         System.out.println("bowl");  
  13.     }  
  14. }  
  15.    
  16. public class Main{  
  17.     public static void main(String [] args){  
  18.         new Hound().bark();  
  19.         ((Dog) new Hound()).bark();  
  20.         //((Dog) new Hound()).sniff();  
  21.     }  
  22. }  
  23. Output?  
  24.   
  25. bowl  
  26. bowl  
一个更好的例子
[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. class Animal {  
  2.     void stinky() {  
  3.         System.out.println("stinky animal !");  
  4.     }  
  5. }  
  6.    
  7. class Dog extends Animal {  
  8.     public void stinky() {  
  9.         System.out.println("stinky dog !");  
  10.     }  
  11.    
  12.     public void bark() {  
  13.         System.out.println("wow wow");  
  14.     }  
  15. }  
  16.    
  17. class Cow extends Animal {  
  18.     public void stinky() {  
  19.         System.out.println("stinky cow !");  
  20.     }  
  21. }  
  22.    
  23. public class TestOverriding {  
  24.     public static void main(String[] args) {  
  25.         Animal obj = new Dog();  
  26.         obj.stinky();  
  27.     }  
  28. }  
当您创建一个对象(与上边一样)并调用方法:
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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值