java

位置:IT落伍者 >> java >> 浏览文章

Java运行时多态性的实现


发布日期:2021年10月13日
 
Java运行时多态性的实现

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

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

举例说明

//定义超类superA

class superA

{

int i =

void fun()

{

Systemoutprintln(This is superA

}

}

//定义superA的子类subB

class subB extends superA

{

int m =

void fun()

{

Systemoutprintln(This is subB

}

}

//定义superA的子类subC

class subC extends superA

{

int n =

void fun()

{

Systemoutprintln(This is subC

}

}

class Test

{

public static void main(String[] args)

{

superA a

subB b = new subB()

subC c = new subC()

a=b

afun()

a=c

afun()

}

}

运行结果为

This is subB

This is subC

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

所以不要被上例中()和()所迷惑虽然写成afun()但是由于()中的a被b赋值指向了子类subB的一个实例因而()所调用的fun()实际上是子类subB的成员方法fun()它覆盖了超类superA的成员方法fun()同样()调用的是子类subC的成员方法fun()

另外如果子类继承的超类是一个抽象类虽然抽象类不能通过new操作符实例化但是可以创建抽象类的对象引用指向子类对象以实现运行时多态性具体的实现方法同上例

不过抽象类的子类必须覆盖实现超类中的所有的抽象方法否则子类必须被abstract修饰符修饰当然也就不能被实例化了

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

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

举例说明

//定义接口InterA

interface InterA

{

void fun()

}

//实现接口InterA的类B

class B implements InterA

{

public void fun()

{

Systemoutprintln(This is B

}

}

//实现接口InterA的类C

class C implements InterA

{

public void fun()

{

Systemoutprintln(This is C

}

}

class Test

{

public static void main(String[] args)

{

InterA a

a= new B()

afun()

a = new C()

afun()

}

}

输出结果为

This is B

This is C

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

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

结束语以上就是java运行时多态性的实现方法大家在编程过程中可以灵活运用但是在性能要求较高的代码中不提倡运用运行时多态毕竟Java的运行时动态方法调用较之普通的方法调用的系统开销是比较大的

               

上一篇:Java数据库字符国际化

下一篇:Java Map遍历方法