Java的多态及注意事项

来源:互联网 发布:电信网络诈骗手段 编辑:程序博客网 时间:2024/06/07 05:41

转自:http://blog.csdn.net/rainnnbow/article/details/49332087

什么是多态:

多态不但能够改善代码的组织结构和可读性,还能够创建可扩展的程序。在Java中,所有的方法都是通过动态绑定实现多态的。将一个方法调用同一个方法主体关联起来被称作绑定。动态绑定的含义是在运行时根据对象的类型进行绑定。动态绑定也叫作后期绑定或运行时绑定。Java中除了static方法和final方法(private方法属于final方法)之外,其他所有的方法都是后期绑定。这意味着通常情况下,我们不必判定是否应该进行后期绑定——它会自动发生。也就是说,在Java中,只有普通的方法是多态的,static方法、private方法、final方法以及成员变量都不是多态的,都属于编译期绑定。

注意事项一:“覆盖”私有方法

例子:

[java] view plain copy
  1. public class PrivateOverride {  
  2.   
  3.     private void f(){  
  4.         System.out.println("private f()");  
  5.     }  
  6.       
  7.     public static void main(String[] args){  
  8.         PrivateOverride po = new Derived();  
  9.         po.f();  
  10.     }  
  11.   
  12. }  
  13.   
  14. class Derived extends PrivateOverride{  
  15.     public void f(){  
  16.         System.out.println("public f()");  
  17.     }  
  18. }  
输出:

[java] view plain copy
  1. private f()  

说明:对于private方法来说,它默认是final的,不允许被更改,导出类看不到private方法,不能被继承,也就没有“覆盖(override)”这一说。当导出类有一个同名的符合覆盖规则的方法时,其实导出类中的该方法是一个全新的方法。但是当我们试图对私有方法进行覆盖并使用多态时,虽然编译器不会报错,但私有方法不支持多态,最终调用的是基类中的方法。

注意事项二:域与静态方法不支持多态

例子:

[java] view plain copy
  1. class Super{  
  2.     public int field = 0;  
  3.     public int getField(){  
  4.         return field;  
  5.     }  
  6.       
  7.     public static String say(){  
  8.         return "Super static function.";  
  9.     }  
  10.       
  11. }  
  12.   
  13. class Sub extends Super{  
  14.     public int field = 1;  
  15.     public int getField(){  
  16.         return field;  
  17.     }  
  18.     public int getSuperField(){  
  19.         return super.field;  
  20.     }  
  21.       
  22.     public static String say(){  
  23.       return "Sub static function.";  
  24.     }  
  25.       
  26. }  
  27.   
  28. public class FieldAccess{  
  29.     public static void main(String[] args){  
  30.         Super sup = new Sub();  
  31.         System.out.println("sup.field = " + sup.field + ", sup.getField() = " + sup.getField());  
  32.         System.out.println("sup.say = " + sup.say());  
  33.         Sub sub = new Sub();  
  34.         System.out.println("sub.field = " + sub.field + ", sub.getField() = " + sub.getField() + ", sub.getSuperField() = " + sub.getSuperField());  
  35.         System.out.println("sub.say = " + sub.say());  
  36.     }  
  37. }  
输出:
[java] view plain copy
  1. sup.field = 0, sup.getField() = 1  
  2. sup.say = Super static function.  
  3. sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0  
  4. sub.say = Sub static function.  
说明:对于域和静态方法,是不支持多态的,他们都属于前期绑定,即在编译期实现的绑定。故域和静态方法只能绑定到基类的域和方法,不支持动态绑定。

(以上代码来自Java编程思想第四版,说明来自Java编程思想第四版中关于多态的章节的整理,仅用于学习和交流)


0 0
原创粉丝点击