创建类的方法及装置与流程

文档序号:11582326阅读:235来源:国知局
创建类的方法及装置与流程

本发明涉及计算机技术领域,具体地,涉及一种创建类的方法及装置。



背景技术:

java是一种面向对象的编程语言,也是世界上最流行的编程语言之一,其特点是一个类只能继承一个父类,但是可以实现多个接口。多态是面向对象程序设计的一个重要特征,指jvm(javavirtualmachine,java虚拟机)在运行时能够根据调用方法的实例的具体类型来选择调用哪个方法。java中的多态通常是在父类中定义方法或者在接口中定义方法,实现类继承父类或者实现接口之后,由jvm在运行时根据实现类的具体类型来进行方法调用。

目前,oracle(甲骨文公司)的jvm是世界上最流行的java虚拟机之一,广泛用于各种领域。oracle的jvm载入java类时,子类在内存中会先排列父类的方法,后排列接口中的方法,接口中的方法在实现类中的位置是无法确定的,因此在以接口的方式实现多态时,需要先根据函数签名进行查找,再将查找到的方法排列到实现类中。可见,通过接口实现多态的步骤较多,实现多态的效率较低,程序运行速度较慢。



技术实现要素:

本发明的目的是提供一种创建类的方法及装置,用于提高java中实现多态的效率。

根据本发明实施例的第一方面,提供一种创建类的方法,包括:

确定java程序中用于实现多态的第一接口是否满足预设条件;

在所述第一接口满足所述预设条件时,基于所述第一接口创建第一抽象类,其中,所述第一抽象类包括所述第一接口所包括的全部方法;

令所述java程序中实现所述第一接口的全部实现类在运行所述java程序时继承所述第一抽象类包括的方法。

可选的,所述方法还包括:

确定所述java程序中实现所述第一接口的全部实现类中的每个实现类是否有显式父类;

其中,若所述全部实现类中的每个实现类均没有显式父类,则确定所述第一接口满足所述预设条件。

可选的,所述方法还包括:

在所述全部实现类中的至少一个实现类有显式父类时,确定所述至少一个实现类的显式父类在是否有函数签名冲突的方法;

其中,若所述至少一个实现类的显式父类中没有函数签名冲突的方法,则确定所述第一接口满足所述预设条件。

可选的,所述第一抽象类包括所述第一接口所包括的全部方法以及所述至少一个实现类的显式父类所包括的全部方法。

根据本发明实施例的第二方面,提供一种创建类的装置,包括:

第一确定模块,用于确定java程序中用于实现多态的第一接口是否满足预设条件;

创建模块,用于在所述第一接口满足所述预设条件时,基于所述第一接口创建第一抽象类,其中,所述第一抽象类包括所述第一接口所包括的全部方法;

继承模块,用于令所述java程序中实现所述第一接口的全部实现类在运行所述java程序时继承所述第一抽象类包括的方法。

可选的,所述装置还包括:

第二确定模块,用于确定所述java程序中实现所述第一接口的全部实现类中的每个实现类是否有显式父类;

其中,若所述全部实现类中的每个实现类均没有显式父类,则确定所述第一接口满足所述预设条件。

可选的,所述装置还包括:

第三确定模块,用于在所述全部实现类中的至少一个实现类有显式父类时,确定所述至少一个实现类的显式父类在是否有函数签名冲突的方法;

其中,若所述至少一个实现类的显式父类中没有函数签名冲突的方法,则确定所述第一接口满足所述预设条件。

可选的,所述第一抽象类包括所述第一接口所包括的全部方法以及所述至少一个实现类的显式父类所包括的全部方法。

通过上述技术方案,可以在java程序中的用于实现多态的第一接口满足预设条件时,创建包含第一接口中全部方法的第一抽象类,那么在运行java程序过程中,实现第一接口的实现类无需再去根据函数签名查找第一接口中的方法,而可以直接以继承的方式从第一抽象类调用方法。通过这样的方式,由于方法在父类和子类中的偏移量是完全一致的,因此实现类(子类)在继承第一抽象类(父类)时,可以直接根据偏移量进行方法调用,无需根据函数签名进行查找方法,节省了查找的步骤,提升了程序运行的速度,提高了java程序实现多态的效率。

本发明的其他特征和优点将在随后的具体实施方式部分予以详细说明。

附图说明

附图是用来提供对本发明的进一步理解,并且构成说明书的一部分,与下面的具体实施方式一起用于解释本发明,但并不构成对本发明的限制。在附图中:

图1是根据一示例性实施例示出的oracle的jvm实现多态时的方法调用示意图。

图2是根据一示例性实施例示出的创建类的方法的流程图。

图3是根据一示例性实施例示出的创建类的装置的框图。

具体实施方式

以下结合附图对本发明的具体实施方式进行详细说明。应当理解的是,此处所描述的具体实施方式仅用于说明和解释本发明,并不用于限制本发明。

本发明实施例中,以oracle的jvm实现多态为例,在oraclejvm载入类的时候,由于父类只有一个,而接口可能有多个,因此子类在内存中会先排列父类的方法,后排列接口中的方法。子类继承父类后,方法在子类中的位置与父类中的位置是完全一致的,而接口中的方法的位置则无法确定。当然,其他的通过上述方式实现多态的jvm也可以应用于本发明实施例中的方案。

请参见图1,图1是通过oracle的jvm实现多态时调用方法的示意图,父类中包括方法a和方法b,接口1中包括方法c和方法d,接口2中包括方法e和方法f。实现多态时,方法a和方法b在父类和子类中的偏移量完全一致,而方法c、方法d、方法e、和方法f在子类和接口中的偏移则没有对应关系,因此在oracle的jvm中利用父类抽象方法进行多态方法调用时,可以直接根据偏移进行方法调用,而利用接口进行多态方法调用时,则需要根据函数签名进行一次查找,然后再根据查找的结果再进行方法调用。

由于通过oracle的jvm实现多态存在以上的特性,本发明实施例将针对上述特性对在oracle的jvm上运行的用接口实现多态的情况进行优化,以下将对本发明实施例中的技术方案进行说明。

图2是根据一示例性实施例示出的一种创建类的方法的流程图,如图2所示,该创建类的方法可以应用于计算机中,包括以下步骤。

步骤s11:确定java程序中用于实现多态的第一接口是否满足预设条件。

步骤s12:在第一接口满足预设条件时,基于第一接口创建第一抽象类。

步骤s13:令java程序中实现第一接口的全部实现类在运行java程序时继承第一抽象类包括的方法。

java程序可以是任意的能够通过接口实现多态的程序,第一接口可以是java程序中包括的任意的用于实现多态的接口,在实际应用中,java程序中可能包含多个用于实现多态的接口,第一接口可以是从中随机确定的任一接口,或者也可以是编程人员根据需要从中指定的接口,本发明实施例对此不作限定。

本发明实施例中,可以在java程序中的第一接口满足预设条件时,创建对应于第一接口的第一抽象类,创建的第一抽象类可以包括第一接口所包括的全部方法。

在java程序中可能有多个实现类都要实现第一接口,那么在生成了与第一接口对应的第一抽象类之后,由于第一抽象类包括了第一接口所包括的全部方法,因此这些原本要实现第一接口的实现类无需再去调用第一接口中的方法,只需继承第一抽象类即可调用同样的方法。通过这样的方式,节省了通过接口调用方法时基于函数签名查找的步骤,提升了程序运行的速度,提高了java程序实现多态的效率。

本发明实施例中,对于如何确定第一接口是否满足预设条件不作限定,以下对几种可能的情况进行说明。

第一种情况:

可选的,可以确定java程序中实现第一接口的全部实现类中的每个实现类是否有显式父类,如果全部实现类中的每个实现类均没有显式父类,则可以确定第一接口满足预设条件。

java中,如果一个类比如用extends关键字声明非object类的父类,那么可以认为这个类有显式父类;如果一个类没有显式声明父类,则默认将object类作为其父类。

可以通过判断要实现第一接口的全部实现类中的每个实现类是否有显式父类来确定第一接口是否满足预设条件,如果要实现第一接口的全部实现类均没有显式父类,可以认为第一接口满足预设条件,进而可以创建包含第一接口中全部方法的第一抽象类。

例如,java程序中要实现接口x(第一接口)的实现类有三个,分别是实现类1、实现类2、和实现类3,这三个实现类均没有显式声明父类,则默认这三个实现类都是以object类作为父类,那么可以创建抽象类xx(第一抽象类),抽象类xx将拥有接口x所有的方法,并进行默认实现。在运行java程序时,实现类1、实现类2、和实现类3将原来用接口x实现的多态方法改为从抽象类xx继承,提升了实现多态的效率,提高了java程序运行的速度。

第二种情况:

可选的,如果确定要实现第一接口的全部实现类中存在至少一个实现类有显式父类时,那么可以再确定这至少一个实现类的显式父类在是否有函数签名冲突的方法,如果至少一个实现类的显式父类中没有函数签名冲突的方法,也可以确定第一接口满足预设条件。

函数签名也就是函数名称和参数类型列表,函数签名冲突是指两个函数的签名一致但返回值不同。例如method1(int)和method1(string)是不同的两个函数签名,但返回int的method1和返回string的method1认为是冲突的两个函数签名。

可选的,在上述情况下,第一抽象类可以包括第一接口所包括的全部方法以及至少一个实现类的显式父类所包括的全部方法。

例如,java程序中要实现接口x(第一接口)的实现类有三个,分别是实现类1、实现类2、和实现类3,其中,实现类1具有显式父类a,实现类2具有显式父类b,实现类3没有显式父类,即至少一个实现类包括实现类1和实现类2这两个实现类。这种情况下,可以继续判断显式父类a和显式父类b中是否有函数签名冲突的方法,比如确定显式父类a和显式父类b中没有函数签名冲突的方法,那么可以生成抽象类xx(第一抽象类),抽象类xx将拥有接口x的所有方法,同时抽象类xx还拥有显式父类a和显式父类b的所有方法,抽象类xx中,显式父类a和显式父类b原来的方法采用原有实现,其他方法进行默认实现。在运行java程序时,实现类1、实现类2、和实现类3将原来用接口x实现的多态方法改为从抽象类xx继承,提升了实现多态的效率,提高了java程序运行的速度。

请参见图3,基于同一发明构思,本发明实施例提供一种创建类的装置,该装置可以包括:

第一确定模块301,用于确定java程序中用于实现多态的第一接口是否满足预设条件;

创建模块302,用于在第一接口满足预设条件时,基于第一接口创建第一抽象类,其中,第一抽象类包括第一接口所包括的全部方法。

继承模块303,用于令java程序中实现第一接口的全部实现类在运行java程序时继承第一抽象类包括的方法。

可选的,该装置还包括:

第二确定模块,用于确定java程序中实现第一接口的全部实现类中的每个实现类是否有显式父类;

其中,若全部实现类中的每个实现类均没有显式父类,则确定第一接口满足预设条件。

可选的,该装置还包括:

第三确定模块,用于在全部实现类中的至少一个实现类有显式父类时,确定至少一个实现类的显式父类在是否有函数签名冲突的方法;

其中,若至少一个实现类的显式父类中没有函数签名冲突的方法,则确定第一接口满足预设条件。

可选的,第一抽象类包括第一接口所包括的全部方法以及至少一个实现类的显式父类所包括的全部方法。

在本发明所提供的实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。

在本申请各个实施例中的各功能模块可以集成在一个处理单元中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、rom(read-onlymemory,只读存储器)、ram(randomaccessmemory,随机存取存储器)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述,以上实施例仅用以对本发明的技术方案进行了详细介绍,但以上实施例的说明只是用于帮助理解本发明的方法及其核心思想,不应理解为对本发明的限制。本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1