Java运行时多态性的实现

原创 2004年10月15日 10:47:00

Java运行时多态性的实现<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

               中国建设银行   郑志远 

 

 

运行时多态性是面向对象程序设计代码重用的一个最强大机制,动态性的概念也可以被说成“一个接口,多个方法”。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

 

上述代码中subBsubC是超类superA的子类,我们在类Test中声明了3个引用变量a, b, c,通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。也许有人会问:“为什么(1)(2)不输出:This is superA”。java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

所以,不要被上例中(1)(2)所迷惑,虽然写成a.fun(),但是由于(1)中的ab赋值,指向了子类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的运行时动态方法调用较之普通的方法调用的系统开销是比较大的。

 

 

java运行时多态性的实现

运行时多态性是面向对象程序设计代码重用的一个最强大机制,动态性的概念也可以被说成“一个接口,多个方法”。Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制,...
  • zdwzzu2006
  • zdwzzu2006
  • 2008年04月01日 07:26
  • 630

java运行时多态性的实现方法

运行时多态性是面向对象程序设计代码重用的一个最强大机制,动态性的概念也可以被说成 “ 一个接口,多个方法 ” 。 Java 实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载...
  • jiqimiao
  • jiqimiao
  • 2007年04月19日 10:50
  • 612

关于Java运行时多态性的实现的猜想

今天在看郑志远 先生的文章《Java运行时多态性的实现》时,突然有个想法,我猜测jvm在实例化一个类时,是不是在实例中用一个类似string的变量记录了这个对象的类名,或用一个指针引用这个类在堆里的位...
  • demon_duke
  • demon_duke
  • 2004年10月16日 19:29
  • 755

C#多态性基础实现

多态分为两种情况,一种是编译的时候的多态性,一种是运行时的多态性。 编译时的多态性:编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作...
  • zc474235918
  • zc474235918
  • 2014年02月09日 17:45
  • 2242

Java运行时多态性:继承和接口的实现

转载地址:Java运行时多态性:继承和接口的实现 Java做为一个面向对象语言的最强大机制:运行时多态性。两个实现方式分别是继承和接口。Java是面向对象的语言,而运行时多态性是面向对象程序设计代码...
  • u011026329
  • u011026329
  • 2015年08月24日 08:54
  • 1388

多态性之编译期多态和运行期多态(JAVA版)

编译期多态和运行期多态(JAVA版)     上一篇讲述了C++中的多态性,由于多态性是面向对象编程中常用的特性,所以JAVA作为面向对象的主流语言自然也有多态性,它的多态性其实和C++的概念差不...
  • dan15188387481
  • dan15188387481
  • 2015年11月05日 21:53
  • 1041

C++多态性的理解和举例

多态性是面向对象c'x'de
  • lanzhihui_10086
  • lanzhihui_10086
  • 2014年08月05日 20:43
  • 807

多态性(一)——静态多态性

多态性(polymorphism)是面向对象程序设计的一个重要特征。在面向对象方法中,一般是这样表述多态性的:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为。在C++中,多态性表现形式...
  • zcmlimi
  • zcmlimi
  • 2015年03月04日 12:18
  • 1137

多态性和动态联编的分析

参考:http://www.yesky.com/385/1785885.shtml     http://www.bbsshow.net/dispbbs.asp?    boardid=79&id=4...
  • BEN1978
  • BEN1978
  • 2006年05月15日 16:17
  • 2442

实现多态的几种方法

同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。多态性通过派生类重载基类中的虚函数型方法来实现。 可以用不同的方式实现组件中的多态性: 接口多态性。 继承多态...
  • lyq5655779
  • lyq5655779
  • 2012年01月03日 00:27
  • 4801
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java运行时多态性的实现
举报原因:
原因补充:

(最多只允许输入30个字)