什么是多态:

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

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

例子:

public class PrivateOverride {

    private void f(){
        System.out.println("private f()");
    }

    public static void main(String[] args){
        PrivateOverride po = new Derived();
        po.f();
    }

}

class Derived extends PrivateOverride{
    public void f(){
        System.out.println("public f()");
    }
}

输出:

private f()

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

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

例子:

class Super{
    public int field = 0;
    public int getField(){
        return field;
    }

    public static String say(){
        return "Super static function.";
    }

}

class Sub extends Super{
    public int field = 1;
    public int getField(){
        return field;
    }
    public int getSuperField(){
        return super.field;
    }

    public static String say(){
      return "Sub static function.";
    }

}

public class FieldAccess{
    public static void main(String[] args){
        Super sup = new Sub();
        System.out.println("sup.field = " + sup.field + ", sup.getField() = " + sup.getField());
        System.out.println("sup.say = " + sup.say());
        Sub sub = new Sub();
        System.out.println("sub.field = " + sub.field + ", sub.getField() = " + sub.getField() + ", sub.getSuperField() = " + sub.getSuperField());
        System.out.println("sub.say = " + sub.say());
    }
}

输出:

sup.field = 0, sup.getField() = 1
sup.say = Super static function.
sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0
sub.say = Sub static function.

说明:对于域和静态方法,是不支持多态的,他们都属于前期绑定,即在编译期实现的绑定。故域和静态方法只能绑定到基类的域和方法,不支持动态绑定。

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

最新文章

  1. Uc爆破工具
  2. 更改appstore开发商名字
  3. Winform中进行MD5加密
  4. WPF与DevExpress之旅-序言
  5. 《C和指针》章节后编程练习解答参考——第9章
  6. java虚拟机--jvm client模式与server模式的区别
  7. yii gridview 时间段筛选(一个输入框,自动提交,高清大图)
  8. texlive、
  9. 记录下直接在git里读取出差异并打包的代码
  10. Android官方命令深入分析之bmgr
  11. maven转gradle ,windows错误重定向
  12. CSS中的行内元素和块级元素
  13. PHP常用工具类积累
  14. MATLAB:图形加法运算(imadd函数)
  15. oracle常用加解密函数
  16. 使用PerfView监测.NET程序性能(三):分组
  17. Android failed to start daemon
  18. 通过SSH实现Windows与linux之间传输文件
  19. Eclipse如何安装插件,查看已经安装的插件
  20. threejs的学习笔记

热门文章

  1. js eval函数写一个简单的计算器
  2. [SHOI2008]堵塞的交通
  3. [SDOI2011]计算器
  4. [LSGDOJ1822]书架 Splay
  5. 决战 状压dp
  6. 【Codeforces Round 438 A B C D 四个题】
  7. poj 3693 后缀数组 重复次数最多的连续重复子串
  8. NOIP2016 玩脱记
  9. 使用C# (.NET Core) 实现状态设计模式 (State Pattern)
  10. 记录一次widora sdk编译ipk 实战编译redis