大家好,今天小编关注到一个比较有意思的话题,就是关于java语言多态的问题,于是小编就整理了4个相关介绍Java语言多态的解答,让我们一起看看吧。
什么是多态?JAVA中如何实现多态?
1.编译时多态,其实就是方法重载,相同函数名,但签名不相同。值得注意的是签名不包括方法返回值,换句话说,两个方法,函数名和入参都相同,但返回值不同,编译器回报错的。
2.运行时多态,其实就和继承和接口实现相关了,子类可以覆盖父类的非final,非static,非private方法或者实现接口方法。运行时,动态绑定实例到父类或接口的引用,那jvm是怎么知道调用哪个子类的实例的对应方法的呢?这就是你问的问题了——J***a中对象在jvm内部都有描述元数据,对象头,对象头中存储了当前实例的类型信息,调用时jvm就根据这个type能精确找到具体是点用哪个子类的方法了。
在j***a中,什么是多态?多态是用来做什么的?
多态属于j***a面对对象编程的一个特性,他能允许不同类的对象对同一消息(或者函数)做出响应。更直白的讲就是同一消息可以根据发送对象的不同而***用多种不同的行为方式。
举例:比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个***发生在不同的对象上会产生不同的结果。
多态的作用是用来消除类型之间的耦合关系。增加程序的可扩展性。比如编程中,只管按照父类的设计进行操作,不管具体是什么样的子类,将来这个子类用着不舒服了,换一个就行,不影响原来的代码,这样代码维护起来就更加容易
J***A中的多态与重载有什么区别?
两者区别如下:
多态是建立在重写的基础之上的,是类与类之间的关系,是发生在不同的类之间的,子类重写父类的方法。实现不同的子类,不同的实现形态。
多态有3个条件
1:继承
2:重写(重写父类继承的方法)
3:父类引用指向子类对象
而重载是类的内部的方法构型上的不同,是发生在同一个类里面的。同一个函数名称,参数不同的多个方法,实现同一类型的功能。
J***a中的多态,为什么子类实例能够赋值给父类引用,反之则不行?
这个涉及到J***a多态实现的原理。(这里默认你有一点研究)
首先给出定义:
多态指的是父类引用可以指向子类对象,同一个引用在调用同一个方法时表现出不同的行为特征。多态的实现分为两个阶段:编译时和运行时;预备知识:在JVM加载类的同时,会在方法区中为这个类存放很多信息(详见《J***a 虚拟机体系结构 》)。其中就有一个数据结构叫方法表。它以数组的形式记录了当前类及其所有超类的可见方法字节码在中的直接地址 。这个方法表中包含所有的 除开私有方法、 final方法 、构造方法和静态方法之外的所有方法,而且数组元素排列特性是:首先是Object方法,再是自己的间接父类的方法表,再是自己直接父类的方法表,最后是自己这个类的方法表。
在编译时,jvm根据引用类型去找自己的类中的方法表中是否含有方法的引用,jvm会先去father类中找是否能匹配到“合适”的方法,如果能则编译通过,如果没有则编译报错。(这也就是为什么学J***a语法时,父类引用只能调用父类存在的方法而不能调用仅在子类中存在的方法)
在编译不报错的情况下,来到运行时,在运行时,jvm保证了该父类引用指向正确的对象
根据对象(father)的声明类型(Father)还不能够确定调用方法f1的位置,必须根据father在堆中实际创建的对象类型Son来确定f1方法所在的位置。这种在程序运行过程中,通过动态创建的对象的方法表来定位方法的方式,我们叫做 动态绑定机制 。这种动态绑定机制就实现了多态。
由上面的实现过程可以知道,j***a的多态只能父类引用指向子类对象。
如果要问为什么不设计让j***a的子类引用指向父类对象,这就涉及到语言设计了,已经不是j***a多态实现这个范畴,J***a之父--詹姆斯·高斯林对这个问题可能最有发言权。