zoukankan      html  css  js  c++  java
  • 从list引用调用arraylist和linkedlist对象的方法了解多态

    一、前言

    今天和朋友在写代码时突然发现List<object>  list=new ArrayList<object>()中,前面是通过List引用来调用其子类ArrayList对象的方法(why)。心中十分困惑,查阅相关资料发现这便是java的多态原理。

    二、多态

    什么是多态?

    百度上原话是:所谓多态,就是指一个引用(类型)在不同的情况下的多种状态。也可以理解为,多态是指通过指向父类的指针,来调用在不同子类中实现的方法。允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。

    结合具体案例

    ArrayList<Integer> arrlist=new ArrayList<Integer>();
    arrlist.add(1);
    List<Integer> list=new ArrayList<Integer>();
    list.add(1);

    从多态的定义来看,我们可以理解为我们对父类的引用,也可以指向其子类的对象,并调用子类的方法。如代码中,arrlist是对子类的引用,指向子类的对象,调用子类对象中的方法,没有问题。而list则是对父类的引用,其指向子类ArrayList生成的对象,并且也调用子类的方法,也是可以实现的。这就体现了多态的特性。

    为什么调用过程中list能够准确找到ArrayList类中的方法呢?

    这个问题的答案也是面对对象程序设计的最重要的妙诀:编译器不可能产生传统意义上的函数调用。一个非面对对象编程的编译器产生的函数调用会产生所谓的“前期绑定”,这个术语你可能以前从未听说过,可能从未想过函数调用的其他方式。这么做意味着编译器将产生对一个具体函数名字的调用,而链接器这个调用解析到将要被执行的代码的绝对地址。然而在面对对象编程中,程序直到运行时才能够确定代码的地址,所以当消息发送到一个泛化对象时,必须采用其他的机制。

    为了解决这个问题,面对对象程序设计语言使用了“后期绑定”的概念。当向对象发送消息时,被调用的代码直到运行时才能确定。编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查(无法提供此类保证的语言被称为是弱类型),但是并不知道将被执行的确切代码。

    为了执行后期绑定,Java使用一小段特殊的代码来替代绝对地址调用。这段代码使用在对象中存储的信息来计算方法体的地址。这样,根据这一小段代码的内容,每一个对象都可以具有不同的行为表现。当向一个对象发送消息时,该对象就能够知道对这条消息应该做些什么。

  • 相关阅读:
    关于Service所需要知道的大部分...
    GCN
    static变量(函数)和普通变量(函数)的区别
    FastGCN论文总结及实现(Tensorflow2.0)
    求相关系数矩阵
    K-means之亚洲杯
    归一化
    多指标综合评价方法汇总
    数据挖掘
    mat函数
  • 原文地址:https://www.cnblogs.com/xiaobaidashu/p/11810849.html
Copyright © 2011-2022 走看看