烟水亭论坛's Archiver

kelven 发表于 2008-4-26 19:10

Notes of "Thinking in Java 3rd Edition" (四)

[b][size=5]第7章 多态[/size][/b]
(fo;B t v;H e Hk   [b]一.再探向上转型(upcasting)[/b]
9TrVjc    将某个objectreference视为一个“referencetobasetype“的动作,称为向上转型。
8?7g)G)^bj:N:WUL    1. Upcasting后调用某个函数时,如果derivedclass中覆写了该函数,则会调用derivedclass中的函数;否则,会调用baseclass中的函数。如
6B'ai2T@"U9c}4_#[    class First{
.W@\^B5q    public void prt(){8` ~)Uins
   System.out.println("First");
0^n-oN R;ra1j*c!P    }
'PGC8}3wa    }
x6I i0nYO(w2j    class Second extends First{
OgR| A&c y4sn    //(a)
8F~8OXADW    public void prt(){
%\#ML m)J Pj7y$s)]?H    System.out.println("Second");{!wP%v+_{vS-@Pa,m
   }
)D*GpHNY"Z;Tp    }
h A)e2I:a Pw9E    public class ExplicitStatic{]&L4~Cs"^
   public static void main(String[] args){3@}'R_3N7JU
   First n = new Second();
5odW*I8Iu;v    n.prt();; eDL/{r$^
   }
2RKZ7D/K3Abdpls    }
+N;x-wCI    结果为Second。如果当Secondclass中的prt()函数注释掉,将输出First。
BL1g D/{s`WG    2. 向上转型后只能调用baseclass中被derivedclass覆写的函数。
'u2c db9bK Zs9A    /*
9gVY JfB[m,z|    abstract class First{tG.YBy&b u
   int i = 122;:p2r I%a]
   public void prt(){f)qmmU3G
   System.out.println("First.i = " + i); TtI7w5|VG d
   }%\c Ar?_K2z
   public abstract void prt(First f);b V'X2C+R$o$an
   }iu.X7{/w9q:\m
   class Second extends First{Q~@/U Z:TW
   public void prt(){B(~AT#h|loN3d
   System.out.println("Second.i = " + i);DK"lz J4{
   }
tgRIm A x%|y    public void prt(First i)
Gf p"M gG    {%}\+nZL%CG
   })^[mBqHhM`
   public void prt(int i)
S4o9m ['l%lF    {9p6u dk1R0b!Z)H~
   }
X%~'p#x1E+csS3T    }j9A&U#[I!f#h:LH
   public class ExplicitStatic{1H xNf'Co { R$[{!b
   public static void main(String[] args){
`0tvf[O}R)P    First n = new Second();
] g Z[h*]x5JI    n.prt(2);;
H |5MB[vd    }9nNS4? jh$?
   }
O7b}WU@z    */
M4b'V ~_+h3o    class First{ M~N.Z@#P i
   public void prt(){
Hz/pzy-sV7~P    System.out.println("First");S.Npee^,u
   }*G1Q[ ^4KB
   }y"?+n lLQDv#k? O
   class Second extends First{
6t_'P(d{O{N;cgo    //(a) ?M4ZoW
   public void prt(){? Fg f%HC3Q0v
   System.out.println("Second");
G5|@U1i+ECb    }
q#XL"d$q:aG^    public void prt(int i){//(a)i,x.j-aTeQ
   System.out.println("Second.i = " + i); R|V$]]`r
   }
5o zw$p&C-iR    }
D:~'P[ ]i"]    public class ExplicitStatic{
~+o+}+`5n5\L6V    public static void main(String[] args){
D@4M^2JZ9n-vH(m y\    First n = new Second();5[A~`:v
   n.prt(3);
v F\pG    }
?6| ny!e!|Pss2L+Q)Z    }
$xz W7Htt ]    (a)处的函数只是Secondclass中的函数,所以不能通过n.prt(3)进行调用。u(k$d'i&n
   [b]二.Abstractclass和Abstractmethods[/b]
@;BUN,Z'LC~    1. 如果一个class中存在abstractclass,则class也必须被声明为abstractclass。
{$sZ%f/gW E    2. abstractclass不能被实例化。&iI0[2^~e J.fLZ5U
   3. 如果baseclass是一个abstractclass,那么derivedclass必须实现baseclass中所有的abstractmethods;否则,derivedclass也必须被声明为abstractclass。m7U0P1~"{P:cE
  [b] 三.其它要点[/b]
T7?AZy\    1. 纯粹继承与扩充
?b+R$k1r1K+U    纯粹继承:只有baseclass所建议的函数,才被derivedclass加以覆写。,V TSm]#tUr
   扩充:除了覆写baseclass的函数,还实现了自己的函数 ze@2Y g6]
   abstract class First{\L6]Uk[V
   public abstract void f();
#fM|jG.Z&S4QL    public abstract void g();
6f2B^FV5h@    }ONP9rUB
   //纯粹继承
n7` g+S&n.V    class Second extends First{
_J!Nkc3Vh    public void f(){}
l|/W1s#VhUq D;q    public void g(){}
m6Y3e2uB.oG4b    } MQ$dj [lL0SV ?
   //扩充
/mR0v0_ c)c[l    class Third extends First{
6XJ(I,D fEPm8T    public void f(){}0`,T,at\6aM5U,q
   public void g(){}
8wM)jObt    public void u(){}//baseclass不存在的函数
Ea.W]\+R    }
I8CW2l| m9GT\ A    2. 向下转型6u8AH|_p4Y2kYmj
   1) 向下转型时只能调用baseclass中被覆写过的函数n Vwo&C;B~Y\
   2) 只有本来就为derivedclass对象时才能正确向下转弄。YA td [4`
   class First{
#e2lnAD c5J m    public void f(){}
6fY;h M'cC.hh5V,b    public void g(){}R vlW7e%|CK
   }
VpEP4r3?6\9KcL['N    class Second extends First{
\)h%GQ@.OU:g    public void f(){}
(K pj$|%uQZ    public void g(){}
7r%vZ&f{ N:N}    public void u(){}
J:C"f4k,D#en4Y^    public void v(){}sO;P9TC,lO3j-g
   },c'j;@ p`t
   public class ExplicitStatic{l7Lz F|U{
   public static void main(String[] args){
c)Z4v-w2y-e)pA:Xc!lht    First[] x = {new First(), new Second()};uCM.Y*P6kS
   x[0].f();*P/{Ac7J4aK*B
   x[1].g();
Mc/J1Q4ry,l k    //!x[1].u();classFirst中不存在函数u()
n;`v)K4d    //((Second)x[0]).f();(a)
'O vS_P6S^+GH!z    ((Second)x[1]).u(); SV']NC.L.QT{g_
   }
G8i+_#g@ J7j.gx    };F#o4M,j$l$B$e8T)c

$SsLrnO [color=red](--待续--)[/color]

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.