多态

作者: Arya鑫 | 来源:发表于2016-10-19 12:41 被阅读38次

所谓多态,是指程序中定义的引用变量所指向的数据类型,以及该引用变量在发出方法调用时在编程阶段并不确定,而是在运行期间才确定。

即,一个引用变量指向哪个数据类型,哪个类的实例对象,该引用变量在发出方法调用时到底是哪个人类中实现的方法,只能在程序运行时期才能决定。

因为在程序运行时才能确定具体的类。却不需要修改代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态。

这里需要理解"向上转型":父类型的引用可以调用子类中父类所定义的所有属性和方法,对于只存在子类中的方法和属性之只能望尘莫及了。

面向子类的父类引用,由于向上转型了。之只能访问父类中拥有的方法和属性,而对于子类存在而父类中不存在的方法,该引用是不能引用使用的。若子类重写了父类中的某些方法,在调用这些方法时,必定是使用子类中定义的这些方法。


运行时多态和编译时多态的区别

编译时多态,是指参数列表的不同, 来区分不同的函数, 在编译后, 就自动变成两个不同的函数名. 在运行时谈不上多态

运行时多态:用到的是后期绑定的技术, 在程序运行前不知道,会调用那个方法, 而到运行时, 通过运算程序,动态的算出被调用的地址. 动态调用在继承的时候,方法名 参数列表完全相同时才出现运行时多态。运行时多态,也就是动态绑定,是指在执行期间(而非编译期间)判断所引用对象的实际类型,根据实际类型判断并调用相应的属性和方法.


Java实现多态有三个必要条件:继承,重写,向上转型。

继承:多态中必须存在有继承关系的子类和父类。

重写:子类对父类中的某些方法进行重新定义,在调用这些方法时就可以调用子类方法。

向上转型:在多态中需要将子类的引用赋值给父类对象,只有这样该引用才能够具备技能调用父类的对象,从而达到执行不同的行为。

多态实现机制的一个原则:当父类对象引用变量,子类对象时被引用对象的类型,而不是引用变量的类型决定了调用谁的成员方法,但被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。


实现形式:基于继承实现多态,基于接口实现多成态。

基于继承实现多态:主要表现在父类和继承该父类的一个或多个子类对某些方法的重写,多个子类对同一方法的重写可以表现出不同的开形为。

所以基于继承实现的多态可以总结如下:对于引用子类的父类类型,在处理该引用时,它适用于继承该父类的所有子类,子类对象的不同,对方法的实现也就不同,执行相同动作产生的行为也就不同。

基于接口实现的多态:在接口的多态中,指向接口的引用必须是指定这实现了该接口的一个类的实例程序,在运行时,根据对象引用的实际类型来执行对应的方法。

继承都是单继承,只能为一组相关的类提供一致的服务接口。但是接口可以是多继承多实现,它能够利用一组相关或者不相关的接口进行组合与扩充,能够对外提供一致的服务接口。所以它相对于继承来说有更好的灵活性。

所以多态机制遵循的原则概括为:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法,但是它仍然要根据继承链中方法调用的优先级来确认方法,该优先级为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。


问题:

Java中可以覆盖(override)一个方法嘛?

不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟跟类的任何实例都不相关。

相关文章

  • 1.9 多态基本概念

    本小节知识点: 【了解】什么是多态? 【掌握】多态的条件 【了解】多态的优点 1.什么是多态? 什么是多态:多态就...

  • C++ 的多态(Polymorphism), virtual f

    多态 c++支持两种多态,编译时多态和运行时多态但其实编译时多态根本不是真正的多态,编译时多态就是函数的重载,ov...

  • 详解Java多态

    详解Java多态 多态定义 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态...

  • 多态

    1.多态 1.多态 1.1 要点 多态是方法的多态,不是属性的多态 多态的存在有三个必要条件:继承;方法重写;父类...

  • java多态面试题

    java多态性 多态分两种: (1) 编译时多态(设计时多态):方法重载。 (2) 运行时多态:JAVA运...

  • Java_basic_10: 多态polymorphism

    多态polymorphism 多态是指对象的多种形态 主要可以分为引用多态和方法多态 继承是多态的实现基础 引用多...

  • 六、多态与虚函数

    多态的基本概念 多态 多态分为编译时多态和运行时多态。 编译时多态主要是指函数的重载(包括运算符的重载)。对重载函...

  • Java基础之面向对象

    1.多态,继承,封装 Java实现多态有哪些必要条件?具体怎么实现?多态的实现原理?多态的作用? 答:多态的优点 ...

  • java多态面试题

    java多态性 多态分两种: (1) 编译时多态(设计时多态):方法重载。 (2) 运行时多态:JAVA运行时...

  • 多态与虚函数

    多态的基本概念 实现了多态机制的程序,可以使用同一个名字完成不同的功能。 多态分为编译时多态和运行时多态。 多态 ...

网友评论

      本文标题:多态

      本文链接:https://www.haomeiwen.com/subject/gtcxuttx.html