j***a语言多态,j***a语言多态性的两种表现形式

kodinid 22 0

大家好,今天小编关注到一个比较意思的话题,就是关于java语言多态问题,于是小编就整理了3个相关介绍Java语言多态的解答,让我们一起看看吧。

  1. 在java中,什么是多态?多态是用来做什么的?
  2. java是怎么通过方法区中的方法表来实现多态和接口的?
  3. Java中的多态,为什么子类实例能够赋值给父类引用,反之则不行?

在j***a中,什么是多态?多态是用来做什么的?

多态属于j***a面对对象编程的一个特性,他能允许不同类的对象对同一消息(或者函数)做出响应。更直白的讲就是同一消息可以根据发送对象的不同而***用多种不同的行为方式。

举例:比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个***发生在不同的对象上会产生不同的结果

java语言多态,java语言多态性的两种表现形式-第1张图片-安济编程网
图片来源网络,侵删)

多态的作用是用来消除类型之间的耦合关系。增加程序的可扩展性。比如编程中,只管按照父类的设计进行操作,不管具体是什么样的子类,将来这个子类用着不舒服了,换一个就行,不影响原来的代码,这样代码维护起来就更加容易

j***a是怎么通过方法区中的方法表来实现多态和接口的?

没错,这就是多态。接口实现的多态,意味着接口UserService负责定义方法的名字,形参列表返回值,而不考虑其具体实现,调用方UserBlh也不必了解findUser,s***eOrUpdate这两方法由谁来实现,只需知道这userService指针指向的对象已经实现了这两个方法,那么调用方UserBlh只管调用就好。 “调用的是接口UserService中对应的方法,还是调用的是接口的实现UserServiceImpl中对应的方法”看来你可能不太清楚在实现层(语言编译技术)上如何做的。 具体来说,1.方法实际上就是一段可执行的代码。而接口UserService其实就是定义了一个数据结构(其实就是虚函数表),而不定义方法本身(就是接口没有定义可执行的代码块) 2.接口UserService的子类UserServiceImpl在构造函数里要往这个表填一些东西,这个东西就是子类UserServiceImpl所定义的可执行代码块的入口地址。 3.当调用方UserBlh调用findUser方法,则通过查虚函数表的方式找到那个findUser方法的地址,进行调用。 给张图帮助说明从技术的角度如何实现多态。(***设还有一个类B也实现了接口UserService)

多态其实就是使用继承来实现的一个功能;由于一个类可以被多个子类所继承,那么就可以把这个被多个子类继承的父类看作是拥有多种状态,

java语言多态,java语言多态性的两种表现形式-第2张图片-安济编程网
(图片来源网络,侵删)

接口的实现

1.接口的组成:public+interface+接口名+{接口体};

2.接口实现以及多重实现的格式

java语言多态,java语言多态性的两种表现形式-第3张图片-安济编程网
(图片来源网络,侵删)

public+class+类名+implements+接口名+,+接口名+{类体};

3.接口中的变量默认都是public,static,final修饰的,方法则默认是public,abstract修饰的,所以接口中的方法都是抽象方法,在实现了一个接口之后,实现该接口的类必须重写接口中的抽象方法。

4.因为接口是没有任何具体实现的,所以是实现多重继承方法之一(另一个可以实现多重继承的方法是内部类)。

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之父--詹姆斯·高斯林对这个问题可能最有发言权。

到此,以上就是小编对于j***a语言多态的问题就介绍到这了,希望介绍关于j***a语言多态的3点解答对大家有用。

标签: 多态 方法 实现