展望2011

2007-01-09 | java运行时多态性的实现[转]

上一篇 / 下一篇  2007-04-27 18:09:01 / 个人分类:编程基础

java运行时多态性的实现
%]+D:s6a j0
|^ d5t+l"}6T(O}7t0运行时多态性是面向对象程序设计代码重用的一个最强大机制,动态性的概念也可以被说成“一个接口,多个方法”。Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制,下面就继承和接口实现两方面谈谈java运行时多态性的实现。
EKR6t\J0
H^ l fQ\0一、通过继承中超类对象引用变量引用子类对象来实现
8aXY;y%]:x3i;J0
oo:z;N l0]6G)c|Yg0举例说明:51Testing软件测试网0N*uY:m w5s:d"kk
//定义超类superA51Testing软件测试网v^B'M6e7J0i _
class superA
M$EL/Z"aW2i4pwy0{
$?!G1W,W1rtU0int i = 100;51Testing软件测试网+wM/X4h-A] g9t c
void fun()51Testing软件测试网a#jX.}:Z+w!Q-K,z
{
U`7[ A2O?%`0System.out.println(“This is superA”);
A?]*~-u}*b0}
w:Q*c3|5Ur R!w"q\0}
6[J x}2j3M0//定义superA的子类subB
|3\|!L KU7~7WY7u b0class subB extends superA51Testing软件测试网Z)b2Fr B Z L5U
{51Testing软件测试网9fMX:Ei)^ Y#zX9E I
int m = 1;
'^fMm)`^U0void fun()
']$Xe7]6skp d0{
L;Mq H)q`0fc0System.out.println(“This is subB”);51Testing软件测试网+E a j;uM;m6n+D
}
}0U$v)].j v,a:rt0}
:z9V5zxufT7f k0//定义superA的子类subC51Testing软件测试网] q6Mv/R^*SY`
class subC extends superA51Testing软件测试网/c5xEXN)BJ
{
5Fwg h BBE/B;]2P'q0int n = 1;
Seo+VE@v|(n0void fun()
|SGxR0s0{51Testing软件测试网 pAB.~$u9tC
System.out.println(“This is subC”);51Testing软件测试网(E9y Yx1]9Q N
}
f*E&k#g6E:_9t'wT0}
JC(i^m8f6D0
nk@7sk0class Test51Testing软件测试网"`-c:`(Y"ie {)mC
{51Testing软件测试网YhZ^3N!s eN
public static void main(String[] args)51Testing软件测试网3i2b5i4P2{
{51Testing软件测试网:co\}r j
superA a;
c,G k a#k;L2z0subB b = new subB();
&x4l)nq6@E+W*O0subC c = new subC();
kHud8J;]gKQj0a=b;
Z;_e?$m0a.fun(); (1)
s+Ui){;YB0a=c;51Testing软件测试网+W0@B's(O,Ez,_
a.fun(); (2)51Testing软件测试网c I)OBQ
}51Testing软件测试网Le:? ~rN1`n&q
}51Testing软件测试网1tt{9E7c`

\'i4Zh1l.b)m!p!p0运行结果为:51Testing软件测试网-cj&Z7m+\wM;l
This is subB
1^ u+b*DT4N0This is subC
B HQ6y#?6c051Testing软件测试网1So;b xYe
上述代码中subB和subC是超类superA的子类,我们在类Test中声明了3个引用变量a, b, c,通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。也许有人会问:“为什么(1)和(2)不输出:This is superA”。java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。51Testing软件测试网"ZO}D[QX
所以,不要被上例中(1)和(2)所迷惑,虽然写成a.fun(),但是由于(1)中的a被b赋值,指向了子类subB的一个实例,因而(1)所调用的fun()实际上是子类subB的成员方法fun(),它覆盖了超类superA的成员方法fun();同样(2)调用的是子类subC的成员方法fun()。51Testing软件测试网*aP/b;O [UW

_:qw ]z0另外,如果子类继承的超类是一个抽象类,虽然抽象类不能通过new操作符实例化,但是可以创建抽象类的对象引用指向子类对象,以实现运行时多态性。具体的实现方法同上例。51Testing软件测试网&L"I&M"Ci*C z2o
不过,抽象类的子类必须覆盖实现超类中的所有的抽象方法,否则子类必须被abstract修饰符修饰,当然也就不能被实例化了。51Testing软件测试网@ LX1[v3d(@n
51Testing软件测试网| rcVO D]
二、通过接口类型变量引用实现接口的类的对象来实现51Testing软件测试网)ZePj#v6ap7z]a
51Testing软件测试网pS ?8s-f
接口的灵活性就在于“规定一个类必须做什么,而不管你如何做”。我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时,它会根据实际引用的类的实例来判断具体调用哪个方法,这和上述的超类对象引用访问子类对象的机制相似。51Testing软件测试网9^0?1Z,P-_`

:?6|v J0`|0举例说明:
i+j:H(mzSn#lr0//定义接口InterA
g-PP YB)v0interface InterA51Testing软件测试网4h/F{xi1^H
{
)B*\;Sp8rv&z0void fun();
7Z}2sRh(Y0}51Testing软件测试网 f#[3HU%I?
//实现接口InterA的类B
{$Z(^W{,hv?Y0class B implements InterA51Testing软件测试网k*n ?yd~P
{
p%K|0tD%o5@6Z/y0public void fun()
)L4h3U.P)^YB5A;V0{51Testing软件测试网X0I4e3OB$k
System.out.println(“This is B”);51Testing软件测试网1|x&t4H%U,n.]"U
}
v H0b8\Vun0}51Testing软件测试网cb-{0J&n4_

gr%xT!c M^*d0//实现接口InterA的类C51Testing软件测试网(N#B4ahZ H)V
class C implements InterA51Testing软件测试网fe kjVeB X
{
(vERaDm^ n0public void fun()51Testing软件测试网v4gJ?r$K
{51Testing软件测试网K1U W@wL`3Wc
System.out.println(“This is C”);51Testing软件测试网 u.g3h$QM_7t;n,Ah
}
6ZCAB1De2F0}51Testing软件测试网[6v`5h vs?$S&v
51Testing软件测试网D9oP2YC7tx z1C
class Test51Testing软件测试网;GkZ^6m_rB-x
{51Testing软件测试网 GP&qF^W+ljEr
public static void main(String[] args)
,q}!](F&bB0{51Testing软件测试网;f(c[$B} e:ek
InterA a;
*vb O9N9`!}A0a= new B();
ffq/LF/n1i0a.fun();
8u7i\0`B0a = new C();
9v%gV ] h0a.fun();51Testing软件测试网 W:n'[(IPbu9D
}
-I0k:Bq i&DW)T;~0}51Testing软件测试网MJ h?W
输出结果为:
(i7g)q|4B#u#Sp0This is B51Testing软件测试网q fs I,W
This is C51Testing软件测试网]S*\0Pl [;P

%WN(n IN@'w8Wg+M2P tv0上例中类B和类C是实现接口InterA的两个类,分别实现了接口的方法fun(),通过将类B和类C的实例赋给接口引用a而实现了方法在运行时的动态绑定,充分利用了“一个接口,多个方法”展示了Java的动态多态性。
oQZB7Ix ]051Testing软件测试网]"q8KGx(i9SA$T
需要注意的一点是:Java在利用接口变量调用其实现类的对象的方法时,该方法必须已经在接口中被声明,而且在接口的实现类中该实现方法的类型和参数必须与接口中所定义的精确匹配。
RTr Lk cn]$j0
"x^Hsj5CrM2r&k0结束语:以上就是java运行时多态性的实现方法,大家在编程过程中可以灵活运用,但是在性能要求较高的代码中不提倡运用运行时多态,毕竟Java的运行时动态方法调用较之普通的方法调用的系统开销是比较大的。

TAG: JAVA 多态性 编程基础

 

评分:0

我来说两句

Open Toolbar