论文部分内容阅读
[摘要] Java是一种面向对象的编程语言,实现了面向对象三大特性之一的多态性。本文深入分析了Java多态性的表现形式,并给出了具体的分析实例。
[关键词] Java面向对象 多态 上转型
多态性(polymorphisn)是面向对象编程语言的主要特性之一,是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给他的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
Java是一种面向对象的编程语言,一般来说,他的多态主要是存在两种类型:编译时的多态和运行时的多态。
一、Java编译时的多态
编译时的多态主要是通过函数重载和重写来实现的。
(一)通过函数重载实现多态
函数重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。运用参数的不同来实现多态,是最简单易懂的,这里就不举例了。
(二)通过继承实现多态
当子类重新定义了父类的虚函数后,父類指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。这样的函数地址是在运行期绑定的(晚绑定),因而实现了“多态”。
这个实例是通过继承中超类对象引用变量引用子类对象来实现。
二、Java运行时的多态
运行时的多态在不同的语言中拥有不同的实现方案。C++通过虚函数的晚捆绑来实现,而Java通过面向接口编程和面向抽象编程来实现动态调用相应的函数实现。但归根结底,这些语言都是通过将多种特殊实现的类抽象为一个泛化类来实现运行多态。
(一)通过接口编程实现多态
接口的灵活性就在于“规定一个类必须做什么,而不管你如何做”。我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时,它会根据实际引用的类的实例来判断具体调用哪个方法。
这个实例是通过接口类型变量引用实现接口的类的对象来实现的。
(二) 通过抽象类实现多态
另外,jdk1.5以后,泛型的出现,丰富了java的多态性表现,可以用向上转型实现多态,例4中,创建了抽象类weapon的父类对象person,和两个子类的实例ak47和bb。这个“人”先捡起枪ak47,开火嗒嗒嗒嗒嗒嗒,然后捡起炸弹,开火BomB!!BomB!!子类创建的一个对象引用ak47复制给其父类对象person,通过父类对象person调用子类重写父类的方法fire时,调用的是子类重写的方法fire,若将父类对象再强制转化为相应子类的对象bb时,该子类对象又具备了子类所有的属性和方法。
三、结束语
我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。以上就是java运行时多态性的实现方法,大家在编程过程中可以灵活运用,但是在性能要求较高的代码中不提倡运用运行时多态,毕竟Java的运行时动态方法调用较之普通的方法调用的系统开销是比较大的。
注:文章中涉及的公式和图表请用PDF格式打开
[关键词] Java面向对象 多态 上转型
多态性(polymorphisn)是面向对象编程语言的主要特性之一,是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给他的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
Java是一种面向对象的编程语言,一般来说,他的多态主要是存在两种类型:编译时的多态和运行时的多态。
一、Java编译时的多态
编译时的多态主要是通过函数重载和重写来实现的。
(一)通过函数重载实现多态
函数重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。运用参数的不同来实现多态,是最简单易懂的,这里就不举例了。
(二)通过继承实现多态
当子类重新定义了父类的虚函数后,父類指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。这样的函数地址是在运行期绑定的(晚绑定),因而实现了“多态”。
这个实例是通过继承中超类对象引用变量引用子类对象来实现。
二、Java运行时的多态
运行时的多态在不同的语言中拥有不同的实现方案。C++通过虚函数的晚捆绑来实现,而Java通过面向接口编程和面向抽象编程来实现动态调用相应的函数实现。但归根结底,这些语言都是通过将多种特殊实现的类抽象为一个泛化类来实现运行多态。
(一)通过接口编程实现多态
接口的灵活性就在于“规定一个类必须做什么,而不管你如何做”。我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时,它会根据实际引用的类的实例来判断具体调用哪个方法。
这个实例是通过接口类型变量引用实现接口的类的对象来实现的。
(二) 通过抽象类实现多态
另外,jdk1.5以后,泛型的出现,丰富了java的多态性表现,可以用向上转型实现多态,例4中,创建了抽象类weapon的父类对象person,和两个子类的实例ak47和bb。这个“人”先捡起枪ak47,开火嗒嗒嗒嗒嗒嗒,然后捡起炸弹,开火BomB!!BomB!!子类创建的一个对象引用ak47复制给其父类对象person,通过父类对象person调用子类重写父类的方法fire时,调用的是子类重写的方法fire,若将父类对象再强制转化为相应子类的对象bb时,该子类对象又具备了子类所有的属性和方法。
三、结束语
我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。以上就是java运行时多态性的实现方法,大家在编程过程中可以灵活运用,但是在性能要求较高的代码中不提倡运用运行时多态,毕竟Java的运行时动态方法调用较之普通的方法调用的系统开销是比较大的。
注:文章中涉及的公式和图表请用PDF格式打开