展望2011

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

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

java运行时多态性的实现
C)C!w8H3]\2@0
:g$]^^ ^,@4p }*~0运行时多态性是面向对象程序设计代码重用的一个最强大机制,动态性的概念也可以被说成“一个接口,多个方法”。Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制,下面就继承和接口实现两方面谈谈java运行时多态性的实现。51Testing软件测试网'e H-Qp&i?
51Testing软件测试网 T:HW$s/@;R
一、通过继承中超类对象引用变量引用子类对象来实现
0bQza2A~G0
J,v#B \8q d2p0举例说明:51Testing软件测试网 }Un6I:U;@*_F
//定义超类superA51Testing软件测试网STOi"~z9?
class superA51Testing软件测试网Pfs8H Zx
{51Testing软件测试网9F`Q:z2`4T,n,GG#LY
int i = 100;51Testing软件测试网0]emh q S
void fun()
3D,}8ka#l L GmrZ1c0{
5jp;U5^!R)[0System.out.println(“This is superA”);
qU } l5[KD8BIA-k0}
M+~\3A*H?j.t6}0}
;u+Wwv!tQ9W)i0//定义superA的子类subB
_q/@"I+K^/E6BGMN0class subB extends superA
,Gk*oc2\V k0{
mZi*g:iE9by-a8z [0int m = 1;51Testing软件测试网vB3B6A&Hj-hk
void fun()51Testing软件测试网lL8d%h Z rZ1d
{51Testing软件测试网1e1`X8z O%}bu ]2z
System.out.println(“This is subB”);51Testing软件测试网 ~`*G$I0tO?%P
}51Testing软件测试网b H,wc[~'s P
}51Testing软件测试网2xc7@7wSz
//定义superA的子类subC51Testing软件测试网 ?J4I u7Ojk8n
class subC extends superA
z yx&I'Bbe2l0{51Testing软件测试网#OO;NN T
int n = 1;51Testing软件测试网/]$I J J$isy
void fun()51Testing软件测试网;F i3h4J#EQ\
{
9K&X5G7AB~v}f k9^0System.out.println(“This is subC”);51Testing软件测试网 h.u |9RW U _J
}51Testing软件测试网I4A:JC3K o8{4G']}^
}
hsc BhMm TU0
a#?zbe T4y0class Test
9S&Z b1X&?maf z0{
+E `U*rh1d)N5{7Ig0public static void main(String[] args)
3P+}.A#c \#Z0{
V1O K dl&LN]'q0superA a;51Testing软件测试网y H/L5osp
subB b = new subB();51Testing软件测试网7\/R.qy/?0Wf
subC c = new subC();
+m T O\,y6W5]0T0a=b;
E(E9l m @ y?q,CV0a.fun(); (1)51Testing软件测试网]VQRkJ
a=c;51Testing软件测试网1hO)O5L$Bw
a.fun(); (2)
Hn v [I p(|k`6c0}51Testing软件测试网O#` y @_ FV-|q b9_rE
}51Testing软件测试网d2Dv-KN9}#hjZ5R'\

?fW#s G6H2s2gG_0运行结果为:51Testing软件测试网 Ld r*?Uh@4{_
This is subB
,j3p4VH"a OBy!S9t0This is subC
g8U L9Ow*KLN#N7G{%P0
&A,jP? I {5K[R0上述代码中subB和subC是超类superA的子类,我们在类Test中声明了3个引用变量a, b, c,通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。也许有人会问:“为什么(1)和(2)不输出:This is superA”。java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。
P:b$}d#eL7}Y;r'h0所以,不要被上例中(1)和(2)所迷惑,虽然写成a.fun(),但是由于(1)中的a被b赋值,指向了子类subB的一个实例,因而(1)所调用的fun()实际上是子类subB的成员方法fun(),它覆盖了超类superA的成员方法fun();同样(2)调用的是子类subC的成员方法fun()。51Testing软件测试网]@0O._LV#m

@;v M7]z2U4F t0另外,如果子类继承的超类是一个抽象类,虽然抽象类不能通过new操作符实例化,但是可以创建抽象类的对象引用指向子类对象,以实现运行时多态性。具体的实现方法同上例。
2_L,M]`l z0不过,抽象类的子类必须覆盖实现超类中的所有的抽象方法,否则子类必须被abstract修饰符修饰,当然也就不能被实例化了。51Testing软件测试网#[P,o"h;xO)v
51Testing软件测试网+{MjZ0p0t
二、通过接口类型变量引用实现接口的类的对象来实现51Testing软件测试网_/AS*T AG G

4lk6eV4pfM%{0接口的灵活性就在于“规定一个类必须做什么,而不管你如何做”。我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时,它会根据实际引用的类的实例来判断具体调用哪个方法,这和上述的超类对象引用访问子类对象的机制相似。
F&h$g4hX$p"_4V0
g%j1fm9t~8]DA0举例说明:51Testing软件测试网ZC,]P"Encwo
//定义接口InterA51Testing软件测试网 km s:g6G
interface InterA
%[.G$~G-F.O gi0{51Testing软件测试网2LT$K$K*~_7E
void fun();51Testing软件测试网'Yr,UXF[k
}
w0v:^pW2i]H0//实现接口InterA的类B51Testing软件测试网]fk3[!IK[0y
class B implements InterA51Testing软件测试网q`p,r VZ6oA)o#fD
{51Testing软件测试网Sg8N2fe%I
public void fun()
n%l]}nb\0{
3SK Hd/dA.G f0System.out.println(“This is B”);
*U*G.i-o6jz0}51Testing软件测试网egT-H$Q^ d.f
}51Testing软件测试网@q0B#a,Np2B
51Testing软件测试网T%[Qc9Lu)f_SX
//实现接口InterA的类C
!I-~:b7G&xx\Y K'^0class C implements InterA51Testing软件测试网F @-}Q+{u
{51Testing软件测试网Z;u!@Cd3RRw)lq
public void fun()
o)N3b"C,[[0{
o*Q5l}cF9a B0System.out.println(“This is C”);
g`P/Yv }#J9{0}
H&f$k:N"G,F_w]0}
F)P6i\|O051Testing软件测试网G1C Tcvdqi:s
class Test
d Q \+I2?!_0{
%P%iDY3U8o#cu0public static void main(String[] args)51Testing软件测试网8E3KF3cB5B`0V
{
pPmP%F8O&yZhGx0InterA a;51Testing软件测试网(IG~&B k3w.R
a= new B();
/kj3\iIG.U0a.fun();
'`!h{t0Z {*Aj;_0a = new C();51Testing软件测试网ZA0?2`!vd3FT*t
a.fun();51Testing软件测试网 Q d4{nHG
}51Testing软件测试网:S9h IR,RFq1\#f!B
}
?H/j5? Wyy;qR0输出结果为:
c.{ ]$|8zbk5Dr\0This is B
W)T6G0Di R0This is C
@r w@2K_ Jj051Testing软件测试网;tb }#DN+TM
上例中类B和类C是实现接口InterA的两个类,分别实现了接口的方法fun(),通过将类B和类C的实例赋给接口引用a而实现了方法在运行时的动态绑定,充分利用了“一个接口,多个方法”展示了Java的动态多态性。
P!BwzO*Irw)]'Z0
bVA P"X0需要注意的一点是:Java在利用接口变量调用其实现类的对象的方法时,该方法必须已经在接口中被声明,而且在接口的实现类中该实现方法的类型和参数必须与接口中所定义的精确匹配。51Testing软件测试网Z%[*R&h*^5Y&J

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

TAG: JAVA 多态性 编程基础

 

评分:0

我来说两句

Open Toolbar