多态在 Java 和 C++ 编程语言中的实现比较.docx
上传人:qw****27 上传时间:2024-09-12 格式:DOCX 页数:21 大小:233KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

多态在 Java 和 C++ 编程语言中的实现比较.docx

多态在Java和C++编程语言中的实现比较.docx

预览

免费试读已结束,剩余 11 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

www.027hpedu.comwww.whhpit.com多态在Java和C++编程语言中的实现比较众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。C++和Java作为当前最为流行的两种面向对象编程语言,其内部对于多态的支持到底是如何实现的呢,本文对此做了全面的介绍。注意到在本文中,指针和引用会互换使用,它们仅是一个抽象概念,表示和另一个对象的连接关系,无须在意其具体的实现。Java的实现方式Java对于方法调用动态绑定的实现主要依赖于方法表,但通过类引用调用和接口引用调用的实现则有所不同。总体而言,当某个方法被调用时,JVM首先要查找相应的常量池,得到方法的符号引用,并查找调用类的方法表以确定该方法的直接引用,最后才真正调用该方法。以下分别对该过程中涉及到的相关部分做详细介绍。JVM的结构典型的Java虚拟机的运行时结构如下图所示图1.JVM运行时结构此结构中,我们只探讨和本文密切相关的方法区(methodarea)。当程序运行需要某个类的定义时,载入子系统(classloadersubsystem)装入所需的class文件,并在内部建立该类的类型信息,这个类型信息就存贮在方法区。类型信息一般包括该类的方法代码、类变量、成员变量的定义等等。可以说,类型信息就是类的Java文件在运行时的内部结构,包含了改类的所有在Java文件中定义的信息。注意到,该类型信息和class对象是不同的。class对象是JVM在载入某个类后于堆(heap)中创建的代表该类的对象,可以通过该class对象访问到该类型信息。比如最典型的应用,在Java反射中应用class对象访问到该类支持的所有方法,定义的成员变量等等。可以想象,JVM在类型信息和class对象中维护着它们彼此的引用以便互相访问。两者的关系可以类比于进程对象与真正的进程之间的关系。Java的方法调用方式Java的方法调用有两类,动态方法调用与静态方法调用。静态方法调用是指对于类的静态方法的调用方式,是静态绑定的;而动态方法调用需要有方法调用所作用的对象,是动态绑定的。类调用(invokestatic)是在编译时刻就已经确定好具体调用方法的情况,而实例调用(invokevirtual)则是在调用的时候才确定具体的调用方法,这就是动态绑定,也是多态要解决的核心问题。JVM的方法调用指令有四个,分别是invokestatic,invokespecial,invokesvirtual和invokeinterface。前两个是静态绑定,后两个是动态绑定的。本文也可以说是对于JVM后两种调用实现的考察。常量池(constantpool)常量池中保存的是一个Java类引用的一些常量信息,包含一些字符串常量及对于类的符号引用信息等。Java代码编译生成的类文件中的常量池是静态常量池,当类被载入到虚拟机内部的时候,在内存中产生类的常量池叫运行时常量池。常量池在逻辑上可以分成多个表,每个表包含一类的常量信息,本文只探讨对于Java调用相关的常量池表。CONSTANT_Utf8_info字符串常量表,该表包含该类所使用的所有字符串常量,比如代码中的字符串引用、引用的类名、方法的名字、其他引用的类与方法的字符串描述等等。其余常量池表中所涉及到的任何常量字符串都被索引至该表。CONSTANT_Class_info类信息表,包含任何被引用的类或接口的符号引用,每一个条目主要包含一个索引,指向CONSTANT_Utf8_info表,表示该类或接口的全限定名。CONSTANT_NameAndType_info名字类型表,包含引用的任意方法或字段的名称和描述符信息在字符串常量表中的索引。CONSTANT_InterfaceMethodref_info接口方法引用表,包含引用的任何接口方法的描述信息,主要包括类信息索引和名字类型索引。CONSTANT_Methodref_info类方法引用表,包含引用的任何类型方法的描述信息,主要包括类信息索引和名字类型索引。图2.常量池各表的关系可以看到,给定任意一个方法的索引,在常量池中找到对应的条目后,可以得到该方法的类索引(class_index)和名字类型索引(name_and_type_index),进而得到该方法所属的类型信息和名称及描述符信息(参数,返回值等)。注意到所有的常量字符串都是存储在CONSTANT_Utf8_info中供其他表索引的。方法表与方法调用方法表是动态调用的核心,也是Java实现动态调用的主要方式。它被存储于方法区中的类型信息,包含有该类型所定义的所有方法及指向这些方法代码的指针,注意这些具体的方法代码可能是被覆写的方