快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

JAVA运行时多态性的实现

运行时多态性是面向对象程序设计代码重用的一个最强盛机制,动态性的概念也可以被说成“一个接口,多个方式”。Java实现运行时多态性的基础是动态方式调度,它是一种在运行时而不是在编译期调用重载方式的机制,下面就继续和接口实现两方面谈谈java运行时多态性的实现。

一、通过继续中超类对象引用变量引用子类对象来实现

举例说明:
//定义超类superA
class superA
{
int i = 100;
void fun()
{
System.out.println(“This is superA”);
}
}
//定义superA的子类subB
class subB extends superA
{
int m = 1;
void fun()
{
System.out.println(“This is subB”);
}
}
//定义superA的子类subC
class subC extends superA
{
int n = 1;
void fun()
{
System.out.println(“This is subC”);
}
}

class Test
{
public static void main(String[] args)
{
superA a;
subB b = new subB();
subC c = new subC();
a=b;
a.fun(); (1)
a=c;
a.fun(); (2)
}
}

运行结果为:
This is subB
This is subC

上述代码中subB和subC是超类superA的子类,我们在类Test中声明了3个引用变量a, b, c,通过将子类对象引用赋值给超类对象引用变量来实现动态方式调用。也许有人会问:“为什么(1)和(2)不输出:This is superA”。java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方式,但是这个被调用的方式必须是在超类中定义过的,也就是说被子类覆盖的方式。
所以,不要被上例中(1)和(2)所疑惑,虽然写成a.fun(),但是由于(1)中的a被b赋值,指向了子类subB的一个实例,因而(1)所调用的fun()实际上是子类subB的成员方式fun(),它覆盖了超类superA的成员方式fun();同样(2)调用的是子类subC的成员方式fun()。

另外,假如子类继续的超类是一个抽象类,虽然抽象类不能通过new操作符实例化,但是可以创建抽象类的对象引用指向子类对象,以实现运行时多态性。详细的实现方式同上例。
不过,抽象类的子类必须覆盖实现超类中的所有的抽象方式,否则子类必须被abstract修饰符修饰,当然也就不能被实例化了。

二、通过接口类型变量引用实现接口的类的对象来实现

接口的灵活性就在于“规定一个类必须做什么,而不管你如何做”。我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方式时,它会根据实际引用的类的实例来判定详细调用哪个方式,这和上述的超类对象引用访问子类对象的机制相似。

举例说明:
//定义接口InterA
interface InterA
{
void fun();
}
//实现接口InterA的类B
class B implements InterA
{
public void fun()
{
System.out.println(“This is B”);
}
}

//实现接口InterA的类C
class C implements InterA
{
public void fun()
{
System.out.println(“This is C”);
}
}

class Test
{
public static void main(String[] args)
{
InterA a;
a= new B();
a.fun();
a = new C();
a.fun();
}
}
输出结果为:
This is B
This is C

上例中类B和类C是实现接口InterA的两个类,分别实现了接口的方式fun(),通过将类B和类C的实例赋给接口引用a而实现了方式在运行时的动态绑定,充分利用了“一个接口,多个方式”展示了Java的动态多态性。

需要注重的一点是:Java在利用接口变量调用其实现类的对象的方式时,该方式必须已经在接口中被声明,而且在接口的实现类中该实现方式的类型和参数必须与接口中所定义的精确匹配。

结束语:以上就是java运行时多态性的实现方式,大家在编程过程中可以灵活运用,但是在性能要求较高的代码中不提倡运用运行时多态,究竟Java的运行时动态方式调用较之普通的方式调用的系统开销是比较大的。
返回类别: 教程
上一教程: 用XMLHTTP和JAVA SESSION监听改善站内消息系统
下一教程: BUILDER(建造)模式

您可以阅读与"JAVA运行时多态性的实现"相关的教程:
· Java运行时多态性的实现
· java窗口的实现---计算器(算加法)
· Javascript 中 浅拷贝与深拷贝的实现
· Java中数据库事务处理的实现
· JAVA实现:文件选择器中运行.EXE文件
    微笑服务 优质保证 索取样品