Download as pdf or txt
Download as pdf or txt
You are on page 1of 241

Mc lc GII THIU .............................................................................5 Chng 1. M U ............................................................

1.1. KHI NIM C BN ................................................12 1.2. I TNG V LP................................................13 1.3. CC NGUYN TC TR CT ................................15 Chng 2. NGN NG LP TRNH JAVA ...................20

2.1. C TNH CA JAVA..............................................20 2.1.1. My o Java Java Virtual Machine ...............21 2.1.2. Cc nn tng Java .............................................23 2.1.3. Mi trng lp trnh Java ................................23 2.1.4. Cu trc m ngun Java ..................................24 2.1.5. Chng trnh Java u tin .............................25 2.2. BIN .............................................................................27 2.3. CC PHP TON C BN......................................28 2.3.1. Php gn ............................................................28 2.3.2. Cc php ton s hc........................................28 2.3.3. Cc php ton khc ..........................................29 2.3.4. u tin ca cc php ton ..........................30 2.4. CC CU TRC IU KHIN ................................30 2.4.1. Cc cu trc r nhnh.......................................31 2.4.2. Cc cu trc lp ................................................37 2.4.3. Biu thc iu kin trong cc cu trc iu khin 43 Chng 3. LP V I TNG ....................................48

3.1. TO V S DNG I TNG ............................49 3.2. TNG TC GIA CC I TNG .................51 Chng 4. BIN V CC KIU D LIU ......................57

4.1. BIN V CC KIU D LIU C BN .................58 4.2. THAM CHIU I TNG V I TNG......59 4.3. PHP GN ..................................................................62 4.4. CC PHP SO SNH ................................................63 1

4.5. MNG .........................................................................64 Chng 5. HNH VI CA I TNG .......................70

5.1. PHNG THC V TRNG THI I TNG70 5.2. TRUYN THAM S V GI TR TR V ..............71 5.3. C CH TRUYN BNG GI TR ..........................73 5.4. NG GI V CC PHNG THC TRUY NHP 5.5. KHAI BO V KHI TO BIN THC TH........79 5.6. BIN THC TH V BIN A PHNG ...........80 Chng 6. S DNG TH VIN JAVA .........................85 75

6.1. ArrayList .....................................................................85 6.2. S DNG JAVA API .................................................87 6.3. MT S LP THNG DNG TRONG API ...........88 6.3.1. Math ...................................................................88 6.3.2. Cc lp bc ngoi kiu d liu c bn ............89 6.3.3. Cc lp biu din xu k t ..............................90 6.4. TR CHI BN TU ................................................91 Chng 7. THA K V A HNH ............................. 103

7.1. QUAN H THA K .............................................. 103 7.2. THIT K CY THA K ...................................... 104 7.3. CI PHNG THC NO C GI? ... 107 7.4. CC QUAN H IS-A V HAS-A ........................... 108 7.5. KHI NO NN DNG QUAN H THA K?.... 110 7.6. LI CH CA QUAN H THA K ..................... 110 7.7. A HNH .................................................................. 111 7.8. GI PHIN BN PHNG THC CA LP CHA114 7.9. CC QUY TC CHO VIC CI ....................... 115 7.10. CHNG PHNG THC.................................... 116 7.11. CC MC TRUY NHP ....................................... 117 Chng 8. LP TRU TNG V INTERFACE........ 124

8.1. MT S LP KHNG NN TO THC TH .... 124 8.2. LP TRU TNG V LP C TH ................. 126 2

8.3. PHNG THC TRU TNG .......................... 127 8.4. V D V A HNH ................................................ 127 8.5. LP Object ................................................................ 131 8.6. I KIU KHI I TNG MT HNH VI CA MNH 8.7. A THA K V VN HNH THOI.............. 135 8.8. INTERFACE .............................................................. 137 Chng 9. VNG I CA I TNG ................... 143 132

9.1. B NH STACK V B NH HEAP ................... 143 9.2. KHI TO I TNG ........................................ 145 9.3. HM KHI TO V VN THA K ............ 149 9.3.1. Gi hm khi to ca lp cha ........................ 150 9.3.2. Truyn i s cho hm khi to lp cha ...... 152 9.4. HM KHI TO CHNG NHAU ........................ 153 9.5. TO BN SAO CA I TNG ....................... 154 9.6. CUC I CA I TNG............................... 159 Chng 10. THNH VIN LP V THNH VIN THC TH 164

10.1. BIN CA LP ...................................................... 164 10.2. PHNG THC CA LP ................................. 165 10.3. GII HN CA PHNG THC LP ............. 167 10.4. KHI TO BIN LP ........................................... 169 10.5. MU THIT K SINGLETON .............................. 170 10.6. THNH VIN BT BIN final .......................... 171 Chng 11. NGOI L ................................................... 174

11.1. NGOI L L G? .................................................. 175 11.1.1. Tnh hung s c .......................................... 175 11.1.2. X l ngoi l ................................................ 177 11.1.3. Ngoi l l i tng.................................... 178 11.2. KHI try/catch ........................................................ 179 11.2.1. Bt nhiu ngoi l ......................................... 179 11.2.2. Hot ng ca khi try/catch ...................... 180 11.2.3. Khi finally nhng vic d th no cng phi lm 182 3

11.2.4. Th t cho cc khi catch ............................ 183 11.3. NM NGOI L ..................................................... 184 11.4. N NGOI L ........................................................ 185 11.5. NGOI L C KIM TRA V KHNG C KIM TRA 11.6. NH NGHA KIU NGOI L MI ................. 190 11.7. NGOI L V CC PHNG THC CI . 191 Chng 12. CHUI HA I TNG V VO RA FILE 196 189

12.1. QUY TRNH GHI I TNG............................ 197 12.2. CHUI HA I TNG................................... 199 12.3. KHI PHC I TNG.................................... 202 12.4. GHI CHUI K T RA TP VN BN ............... 205 12.4.1. Lp File .......................................................... 206 12.4.2. B nh m ................................................... 207 12.5. C TP VN BN .............................................. 207 12.6. CC DNG VO/RA TRONG Java API ............. 209 Chng 13. LP TRNH TNG QUT V CC LP COLLECTION 215

13.1. LP TNG QUT ................................................. 217 13.2. PHNG THC TNG QUT ........................... 219 13.3. CC CU TRC D LIU TNG QUT TRONG JAVA API 220 13.4. ITERATOR V VNG LP FOR EACH ............. 222 13.5. SO SNH NI DUNG I TNG ................... 224 13.5.1. So snh bng ................................................. 224 13.5.2. So snh ln hn/nh hn ............................. 226 13.6. K T I DIN TRONG KHAI BO THAM S KIU 228 Ph lc A. DCH CHNG TRNH BNG JDK .......... 233 Ph lc B. PACKAGE T CHC GI CA JAVA .... 236 Ph lc C. BNG THUT NG ANH-VIT................. 239 Ti liu tham kho ............................................................... 241

Gii thiu

Phn mm ngy cng ln v phc tp v i hi c cp nht lin tc p ng nhng yu cu mi ca ngi dng. Phng php lp trnh th tc truyn thng dn tr nn khng p ng c nhng i hi ca ngnh cng nghip phn mm. Lp trnh hng i tng ra i trong bi cnh nh vy h tr s dng li v pht trin cc phn mm qui m ln. Gio trnh ny cung cp cho sinh vin cc kin thc t c bn cho n mt s k thut nng cao v phng php lp trnh hng i tng. Gio trnh dng cho sinh vin ngnh Cng ngh thng tin c kin thc cn bn v lp trnh. Gio trnh s dng ngn ng lp trnh Java minh ha v ng thi cng gii thiu mt s kin thc cn bn ca ngn ng ny. Cc ni dung chnh v phng php lp trnh hng i tng c trnh by trong gio trnh bao gm lp v i tng, ng gi/che giu thng tin, k tha v a hnh, x l ngoi l v lp trnh tng qut. Ngoi ra, gio trnh cng trnh by cc kin thc v Java bao gm cc c trng c bn ca ngn ng, cc th vin c bn v cch thc t chc vo/ra d liu. Thay v cch trnh by theo tnh hn lm v mt ch rng, thun tin cho ging dy, gio trnh chn cch trnh by theo cc bi hc c th c sp xp theo trnh t kin thc t c s n chuyn su. Mi ch c th c ging dy vi thi lng 2~3 gi l thuyt v gi thc hnh tng ng. Ch-ng 2 v Ch-ng 6, vi ni dung l cc kin thc c bn v ngn ng lp trnh Java, tuy cn thit nhng khng phi ni dung trng tm ca mn hc Lp trnh hng i tng. Cc chng ny, do , nn sinh vin t hc. Chng 9 v Chng 10 khng nht thit phi c dy thnh nhng ch c lp m c th c tch ri rc cc ni dung kin thc v gii thiu km theo cc khi nim hng i tng c lin quan, hoc yu cu sinh vin t c khi cn n cc kin thc ny trong qu trnh thc hnh. Tuy cun gio trnh ny khng trnh by su v lp trnh Java, nhng kin thc v lp trnh Java li l cn thit i vi sinh vin, ngay c vi mc ch thc hnh mn hc. Do , ngoi mc ch thc hnh cc ni dung lin quan n lp trnh hng i tng, cc bi tp thc hnh ca mn hc ny nn c thm ng vai tr nh hng v gi gip sinh vin t hc cc ch thun ty Java m gio vin cho l cn thit, chng hn nh hc v vo ra d liu n gin ngay t tun u tin ca mn hc. Cc nh hng ny c th c th hin nhng bi tp thc hnh vi nhng on chng trnh mu, hoc yu cu tm hiu ti liu API v mt s lp tin ch. Mt s bi tp cui chng l v d ca dng bi tp ny.

Cc thut ng hng i tng nguyn gc ting Anh c chuyn sang ting Vit theo nhng cch khc nhau ty cc tc gi. Sinh vin cn bit thut ng nguyn gc ting Anh cng nh cc cch dch khc nhau tin cho vic s dng ti liu ting Anh cng nh lin h kin thc gia cc ti liu ting Vit. V l do , gio trnh ny cung cp bng thut ng Anh-Vit vi cc cch dch khc nhau ti Ph lc C, bn cnh Ph lc A v cng c lp trnh JDK v Ph lc B v t chc gi ca ngn ng Java. Cc tc gi chn thnh cm n PGS. TS. Nguyn nh Ha, TS. Trng Anh Hong, TS. Cao Tun Dng, TS. ng c Hnh, cng nh cc ng nghip v sinh vin ti Khoa Cng ngh thng tin, Trng i hc Cng ngh c bn tho gio trnh v c cc gp qu bu v ni dung chuyn mn cng nh cch thc trnh by. Tuy vy, gio trnh vn cn nhiu khim khuyt, cc tc gi mong tip tc nhn c gp hon thin trong tng lai.

Chng 1.

m u

Lp trnh l cng on quan trng ch cht v khng th thiu to ra sn phm phn mm. Phn mm cng tr nn a dng v ngnh cng nghip phn mm cng pht trin th ngi ta cng thy r tm quan trng ca phng php lp trnh. Phng php lp trnh tt khng ch m bo to ra phn mm tt m cn h tr thit k phn mm c tnh m v h tr kh nng s dng li cc m un. Nh chng ta c th d dng bo tr, nng cp phn mm cng nh gim chi ph pht trin phn mm. Trong nhng thp k 1970, 1980, phng php pht trin phn mm ch yu l lp trnh c cu trc (structured programming). Cch tip cn cu trc i vi vic thit k chng trnh da trn chin lc chia tr: gii mt bi ton ln, chng ta tm cch chia n thnh vi bi ton nh hn v gii ring tng bi; gii mi bi, hy coi n nh mt bi ton mi v c th tip tc chia n thnh cc bi ton nh hn; cui cng, ta s i n nhng bi ton c th gii ngay c m khng cn phi chia tip. Cch tip cn ny c gi l lp trnh t trn xung (top-down programming). Lp trnh t trn xung l mt phng php tt v c p dng thnh cng cho pht trin rt nhiu phn mm. Tuy nhin, cng vi s a dng v phc tp ca phn mm, phng php ny bc l nhng hn ch. Trc ht, n hu nh ch p ng vic to ra cc lnh hay l cc quy trnh gii quyt mt bi ton. Dn dn, ngi ta nhn ra rng thit k cc cu trc d liu cho mt chng trnh c tm quan trng khng km vic thit k cc hm/th tc v cc cu trc iu khin. Lp trnh t trn xung khng quan tm n d liu m chng trnh cn x l. Th hai, vi lp trnh t trn xung, chng ta kh c th ti s dng cc phn ca chng trnh ny cho cc chng trnh khc. Bng vic xut pht t mt bi ton c th v chia n thnh cc mnh sao cho thun, cch tip cn ny c xu hng to ra mt thit k c th cho chnh bi ton . Chng ta kh c kh nng ly mt on m ln t mt chng trnh c lp vo mt d n mi m khng phi sa i ln. Vic xy dng cc chng trnh cht lng cao l kh khn v tn km, do nhng nh pht trin phn mm lun lun mun ti s dng cc sn phm c. Th ba, mi trng hot ng trong thc t ca cc ng dng lun thay i. Dn n vic yu cu phn mm cng phi lin tc thay i theo p ng nhu cu ca ngi dng nu khng mun phn mm b o thi. Do , mt thit k linh hot mm do l ci m cc nh pht trin phn mm mong mun. Phng php tip cn t di ln (bottom-up) h tr tt hn cho tnh linh hot mm do . Trong thc t, thit k v lp trnh t trn xung thng c kt hp vi thit k v lp trnh t di ln. Trong tip cn t di ln, t cc vn m ta bit 7

cch gii v c th c sn cc thnh phn ti s dng c chng ta xy dng dn theo hng ln trn, hng n mt gii php cho bi ton tng. Cc thnh phn ti s dng c nn c tnh m-un ha cao nht c th. Mi m-un l mt thnh phn ca mt h thng ln hn, n tng tc vi phn cn li ca h thng theo mt cch n gin v c quy c cht ch. tng y l mt m-un c th c "lp vo" mt h thng. Chi tit v nhng g xy ra bn trong m-un khng cn c xt n i vi h thng ni chung, min l m-un hon thnh tt vai tr c giao. y gi l che giu thng tin (information hiding), mt trong nhng nguyn l quan trng nht ca cng ngh phn mm. Mt dng thng thy ca cc m-un phn mm l n cha mt s d liu km theo mt s hm/th tc x l d liu . V d, mt m-un s a ch c th cha mt danh sch cc tn v a ch, km theo l cc hm/th tc thm mt mc tn mi, in nhn a chVi cch ny, d liu c bo v v n ch c x l theo cc cch c bit trc v c nh ngha cht ch. Ngoi ra, n cng to thun li cho cc chng trnh s dng m-un ny, v cc chng trnh khng phi quan tm n chi tit biu din d liu bn trong m-un. Thng tin v biu din d liu c che giu. Cc m-un h tr dng che giu thng tin ny bt u tr nn ph bin trong cc ngn ng lp trnh u thp k 1980. T , mt hnh thc tin tin hn ca chnh tng lan rng trong ngnh cng ngh phn mm. Cch tip cn c gi l lp trnh hng i tng (object-oriented programming), thng c gi tt l OOP. Cu chuyn tng tng sau y1 minh ha phn no s khc bit gia lp trnh th tc v lp trnh hng i tng trong thc t ca ngnh cng ngh phn mm. C hai lp trnh vin nhn c cng mt c t h thng v c yu cu xy dng h thng , thi xem ai l ngi hon thnh sm nht. Du l ngi chuyn dng phng php lp trnh th tc, cn Tut quen dng lp trnh hng i tng. C Du v Tut u cho rng y l nhim v n gin. c t nh sau:

Ngun: Head First Java, 2nd Edition.

Du tnh ton, "Chng trnh ny phi lm nhng g? Ta cn n nhng th tc no?" Anh t tr li, "xoay v chi nhc." V anh bt tay vo vit cc th tc . Chng trnh khng phi l mt lot cc th tc th n l ci g? Trong khi , Tut ngh, "Trong chng trnh ny c nhng th g...u l nhng nhn t chnh?" u tin, anh ta ngh n nhng Hnh v. Ngoi ra, anh cn ngh n nhng i tng khc nh ngi dng, m thanh, v s kin click chut. Nhng anh c sn th vin m cho my i tng , nn anh tp trung vo vic xy dng cc Hnh v. Du qu tho vi cng vic kiu ny ri, anh ra bt tay vo vit cc th tc quan trng v nhanh chng hon thnh hai th tc xoay (rotate) v chi nhc (playSound):
rotate(shapeNum) {

// cho hnh xoay 360o


} playSound(shapeNum) {

// dng shapeNum tra xem cn chi file AIF no // v chi file


}

Cn Tut ngi vit ba lp, mi lp dnh cho mt hnh.

Du va ngh rng mnh thng cuc th sp ni "V mt k thut th Du xong trc, nhng ta phi b sung mt cht xu na vo chng trnh." Hai ngi qu quen vi chuyn c t thay i chuyn thng ngy trong ngnh. c t c b sung ni dung sau:

i vi Du, th tc rotate vn n, m dng mt bng tra cu khp gi tr shapeNum vi mt hnh ha c th. Nhng playSound th phi sa. Rt cc khng phi sa nghim trng, nhng Du vn thy khng thoi mi khi phi ng vo sa phn m c test xong t trc. Anh bit, d qun l d n c ni g i chng na, c t thay i sut. 9

Cn Tut th thn nhin va nhm nhi c ph va vit mt lp mi. iu anh thch nht v OOP l anh khng phi sa g phn m c test v bn giao. Anh ngh v nhng ch li ca OOP v lm bm "Tnh linh hot, kh nng m rng,...".

Du cng va kp hon thnh ch mt lt trc Tut. Nhng n ci ca anh vt tt khi nhn thy b mt ca sp v nghe thy ging sp v tht vng "khng c ri, amoeba thc ra khng xoay kiu ny..." Th ra c hai lp trnh vin u vit on xoay hnh theo cch: (1) xc nh hnh ch nht bao hnh; (2) xc nh tm ca hnh ch nht v xoay hnh quanh im . Nhng hnh trng bin hnh th li cn xoay quanh mt im mt u mt, nh kiu kim ng h.

"Mnh to ri." Du ngn ngm. "Tuy l, m, c th thm mt lnh if/else na vo th tc rotate, ri hard-code tm xoay cho amoeba. Lm vy chc l s khng lm hng on no khc." Nhng mt ging ni trong u Du th tho, "Nhm to! Cu c chc l c t s khng thay i ln na khng y?" Cui cng Du chn cch b sung tham s v tm xoay vo cho th tc rotate. Rt nhiu on m b nh hng. Phi test li, dch li c ng m. C nhng on trc chy tt th nay khng chy c na.
rotate(shapeNum, xPt, yPt) {

10

//nu hnh khng phi amoeba, // tnh tm xoay // da trn mt hnh ch nht // ri xoay hnh //nu khng // dng xPt v yPt lm offset tm xoay // ri xoay hnh
}

Cn Tut, khng chn ch cht no, anh sa lun phng thc rotate, nhng ch sa lp Amoeba m thi. Tut khng h ng n cc on m dch, chy v test ti cc phn khc trong chng trnh. cho Amoeba mt tm xoay, anh thm mt thuc tnh m tt c cc hnh trng bin hnh s c. Anh nhanh chng sa, test, v bn giao m cho sp.

"Khng nhanh th c!" Du tm thy mt nhc im trong cch tip cn ca Tut, v anh chc mm n s gip anh chuyn bi thnh thng. Du thy m ca Tut b lp, rotate c mt c bn th hnh, thit k ny c g hay ho khi phi bo tr c bn phng thc rotate khc nhau? Tut gii thch: Du cha nhn thy c im quan trng ca thit k, l quan h tha k. Bn lp c nhng c im chung, nhng c im c tch ra v t trong mt lp mi tn l Shape. Cc lp kia, mi lp u c xem l "tha k t lp Shape". Ni cch khc, nu lp Shape c nhng chc nng g th cc lp kia t ng c cc chc nng .

11

Tuy nhin, Amoeba c tm xoay khc v chi file nhc khc. Lp Amoeba ci cc hot ng rotate v playSound c tha k t Shape bng cch nh ngha li cc th tc ny. V khi chy, h thng t bit l cn dng phin bn c vit ti Amoeba thay v dng phin bn tha k t Shape. l c im th v ca phng php hng i tng. Khi ta cn yu cu mt hnh no xoay, tam gic hay amoeba, ta ch vic gi phng thc rotate cho i tng , v h thng s t bit phi lm g, trong khi phn cn li ca chng trnh khng bit hoc khng quan tm n vic i tng xoay kiu g. V khi ta cn b sung mt ci g mi vo chng trnh, ta ch phi vit mt lp mi cho loi i tng mi, t , cc i tng mi s c cch hnh x ca ring chng. 1.1. KHI NIM C BN Hng i tng l k thut m hnh ha mt h thng th gii thc trong phn mm da trn cc i tng. i tng (object) l khi nim trung tm ca OOP, n l mt m hnh ca mt thc th hay khi nim trong th gii thc. Vic m hnh ha ny bao gm xc nh cc i tng tham gia bi ton nhng ci lm nhim v g hoc b lm g . Lp trnh theo kiu hng i tng l hot ng nh ngha cc th loi ca cc i tng hnh thc cc khun mu to ra chng. Trong thi gian chy, mt chng trnh OOP chnh l mt tp cc i tng gi thng ip cho nhau yu cu dch v v thc hin dch v khi c yu cu. Vic mt i tng thc hin mt dch v c th dn n vic n thay i trng thi ca bn thn. Mt v d c tnh cht gn vi th gii thc: ng A n rt tin ti my ATM. Ta c cc i tng: ng A, my ATM, c s d liu ngn hng, v ti khon ca ng A. Trnh t din ra nh sau: ng A cho th ngn hng vo khe my ATM; 12

i tng ATM yu cu c s d liu ngn hng cung cp i tng ti khon ca ng A; ng A yu cu rt 100.000 ng; i tng ATM yu cu i tng ti khon tr i 100.000 ng. Nh vy giao dch ny bao gm chui cc yu cu dch v v vic cc i tng thc hin cc yu cu , ng thi thay i trng thi ca mnh (ti khon ng A b bt tin, ng A c thm tin, d liu nht trnh ATM c thm thng tin v mt giao dch). 1.2. I TNG V LP Gn nh bt c th g cng c th c m hnh ha bng mt i tng. Chng hn, mt mu, mt hnh v, mt ci nhit k. Mi i tng c mt tp cc thuc tnh (attribute) nh cc gi tr hay trng thi m hnh ha i tng . Chng hn, mt ci nhit k c th c thuc tnh l v tr hin ti ca n v trng thi hin ti tt hay bt, cc thuc tnh mt mu c th l gi tr ca ba thnh phn RGB ca n. Mt ci t c cc thuc tnh nh: lng xng hin c, tc hin ti, bin s. Mi i tng c mt tp cc trch nhim m n thc hin bng cch cung cp dch v cho cc i tng khc. Cc dch v ny c th cho php truy vn thng tin hoc lm thay i trng thi ca i tng. V d, nhit k cho php truy vn v tnh trng tt/bt ca n; p ng cc yu cu v nhit hin hnh m n o c, yu cu tt/bt. Mt ci t cho php tng ga, gim ga tng/gim tc di chuyn. i vi thit k tt, cc i tng bn ngoi khng phi quan tm xem mt i tng no ci t mt dch v nh th no, m ch cn bit i tng cung cp nhng dch v no (hay n c nhng trch nhim g). Chng hn, ngi li xe khng cn bit c ch chuyn i t lc nhn ln chn p ga sang s thay i v tc ca t.

Hnh 1.1: Cc i tng t v c im chung ca chng.

Trong mi ng dng, cc i tng c c im tng t nhau, chng hn cc ti khon ngn hng, cc sinh vin, cc my ATM, nhng chic t c xp vo cng mt nhm, l lp (class). Mi lp l c t cc c im ca cc i tng 13

thuc lp . C th, mt nh ngha lp m t tt c cc thuc tnh ca cc i tng thnh vin ca lp v cc phng thc thc thi hnh vi ca cc i tng . V d, ta c th c nhiu i tng t vi thng s khc nhau v lng xng hin c, tc hin ti, v bin s xe; nh ngha lp t m t c im chung ca cc thng s cng vi cc phng thc thc hin cc hot ng tng tc, gim tc.

Hnh 1.2: Lp Automobile v bng k php UML

Quan h gia lp v i tng gn ging nh quan h gia kiu d liu v cc bin thuc kiu d liu . Cc i tng c to ra khi chng trnh chy, v lp l khun mu m t c th to ra cc i tng thuc lp . Mi i tng c to ra t mt lp c gi l mt thc th (instance) ca lp . Mt chng trnh khi c vit l s kt hp ca cc lp khc nhau. Cn khi chy, n l mt tp hp cc i tng hot ng v tng tc vi nhau, cc i tng ny c sinh ra t cc lp cu thnh nn chng trnh . Mi i tng u c mt thi gian sng. Trong khi chng trnh chy, i tng c to v khi to gi tr theo yu cu. Ngay khi mt i tng c to ra, h thng t ng gi mt hm khi to (constructor) khi to gi tr cho cc thuc tnh ca i tng. K t , i tng bt u tn ti, n gi v nhn cc thng ip, v cui cng th n b hy i khi khng cn cn n na. Trong khi i tng tn ti, n gi nh danh v trng thi ca mnh. Mi i tng c mt nh danh ring v c b thuc tnh ring, c lp vi cc i tng khc thuc cng mt lp. Trong thc t, mi i tng c v tr ring trong b nh. Cc i tng dng cc thng ip (message) lin lc vi nhau. Nhn t phng din lp trnh, vic gi mt thng ip ti mt i tng chnh l gi mt phng thc ca i tng , cn vic mt i tng nhn c mt thng ip chnh l vic mt phng thc ca n c mt i tng khc gi. Chng trnh khi chy l mt tp cc i tng, mi i tng gi thng ip cho cc i tng khc trong h thng v p ng cc thng ip m mnh nhn c. Thng thng, mt thng ip c gi bng mt li gi phng thc trong chng trnh. Tuy nhin, cc thng ip c th xut pht t h iu hnh hoc mi trng chy chng trnh. Chng hn khi ngi dng click chut vo mt nt bm ti mt ca s chng trnh, mt thng ip s c gi n i tng iu khin nt bm thng bo rng ci nt b nhn.

14

1.3. CC NGUYN TC TR CT Lp trnh hng i tng c ba nguyn tc tr ct: ng gi, tha k v a hnh, cn tru tng ha l khi nim nn tng. Tru tng ha (abstraction) l mt c ch cho php biu din mt tnh hung phc tp trong th gii thc bng mt m hnh c n gin ha. N bao gm vic tp trung vo cc tnh cht quan trng ca mt i tng khi phi lm vic vi lng ln thng tin. V d, i vi mt con mo trong ng cnh mt ca hng bn th cnh, ta c th tp trung vo ging mo, mu lng, cn nng, tui, tim phng di hay cha, v b qua cc thng tin khc nh dung tch phi, nng ng trong mu, huyt p, cn i vi mt con mo trong ng cnh bnh vin th y th li l mt chuyn khc. Cc i tng ta thit k trong chng trnh OOP s l cc tru tng ha theo ngha , ta b qua nhiu c im ca i tng thc v ch tp trung vo cc thuc tnh quan trng cho vic gii mt bi ton c th. Ngi ta gi mt tru tng ha l mt m hnh ca mt i tng hoc khi nim trong th gii thc. Tru tng ha l mt trong nhng cng c c bn ca tt c cc phng php lp trnh, khng ch lp trnh hng i tng. Khi vit mt chng trnh gii mt bi ton ca th gii thc, tru tng ha l mt cch m hnh ha bi ton . V d, khi ta vit mt chng trnh qun l s a ch, ta s dng cc tru tng ha nh tn, a ch, s in thoi, th t bng ch ci, v cc khi nim lin quan ti mt s a ch. Ta s nh ngha cc thao tc x l d liu chng hn nh thm mt mc tn mi hoc sa mt a ch. Trong ng cnh lp trnh, tru tng ha l m hnh ha th gii thc theo cch m n c th c ci t di dng mt chng trnh my tnh. Phng php hng i tng tru tng ha th gii thc thnh cc i tng v tng tc gia chng vi cc i tng khc. Vic m hnh ha tr thnh m hnh ha cc i tng tham gia bi ton mt ci nhit k, mt ngi ch ti khon ngn hng, mt s a ch mi i tng cn c cc thuc tnh v phng thc thc hin c tt c cc dch v m n c yu cu. ng gi (encapsulation): Cc tru tng ha ca nhng g c lin quan n nhau c ng gi vo trong mt n v duy nht. Cc trng thi v hnh vi ca cc tru tng ha c bc li trong mt khi gi l lp. C th, sau khi xc nh c cc i tng, ri n cc thuc tnh v hnh ng ca mi i tng, mc tiu l ng gi trong mi i tng cc tnh nng cn thit n c th thc hin c vai tr ca mnh trong chng trnh. Th d, mt i tng nhit k cn c nhng g cn thit c th o nhit , lu tr s liu ca cc ln o nhit trc v cho php truy vn cc s liu ny. nh ngha lp l cng c lp trnh chnh yu cho vic thc hin nguyn tc ng gi. Mt lp l m t v mt tp hp cc i tng c cng cc thuc tnh, hnh vi. 15

Thuc tnh (attribute) dng lu tr thng tin trng thi ca mt i tng. Mt thuc tnh c th ch n gin l mt bin Boolean lu tr trng thi tt hoc bt, hay phc tp hn khi chnh n li l mt i tng khc. Cc thuc tnh c khai bo trong nh ngha lp v c gi l cc bin ca thc th (instance variable), gi tt l bin thc th. Chng cn c gi l cc thnh vin d liu (data member), hay trng (field). Trng thi (state) phn nh cc gi tr hin ti ca cc thuc tnh ca mt i tng v l kt qu ca hnh vi ca i tng theo thi gian. Hnh vi (behavior) l hot ng ca mt i tng m c th nhn thy c t bn ngoi. Trong c vic i tng thay i trng thi ra sao hoc vic n tr v thng tin trng thi khi n c thng ip yu cu. Phng thc (method) l mt thao tc hay dch v c thc hin i vi i tng khi n nhn thng ip tng ng. Cc phng thc ci t hnh vi ca i tng v c nh ngha trong nh ngha lp. Phng thc cn c gi bng cc ci tn khc nh: hm thnh vin (member function) gi tt l 'hm', thao tc (operation), dch v (service). Khi nim ng gi cn i km vi khi nim che giu thng tin (information hiding) ngha l che giu cc chi tit bn trong ca mt i tng khi th gii bn ngoi. Chng hn khi dng mt ci cu dao in, i vi ngi s dng, n ch l mt ci hp m khi gt cn s c tc dng ngt v ni in v ci hp c kh nng t ngt in khi qu ti. Ngi dng khng bit v khng cn bit cc mch in bn trong c thit k ra sao, c ch pht hin qu ti nh th no. Nhng chi tit c giu bn trong, cn t bn ngoi ta ch nhn thy cu dao l mt ci hp c cn gt. Ni theo phng din lp trnh, nhn t bn ngoi mt m-un ch thy c cc giao din. Cc lp trnh vin t do ci t chi tit bn trong, vi rng buc duy nht l tun theo giao din c quy c t trc. Ta c th thc hin nguyn tc ng gi vi tt c cc ngn ng lp trnh hng i tng cng nh cc ngn ng th tc. Tuy nhin, ch cc ngn ng hng i tng mi cung cp c ch cho php che giu thng tin, ngn khng cho bn ngoi truy nhp vo chi tit bn trong ca m-un. Tha k (inheritance) l quan h mang tnh phn cp m trong cc thnh vin ca mt lp c k tha bi cc lp c dn xut trc tip hoc gin tip t lp . y l c ch cho php nh ngha mt lp mi da trn nh ngha ca mt lp c sn, sao cho tt c cc thnh vin ca lp "c" (lp c s hay lp cha) cng c mt trong lp mi (lp dn xut hay lp con) v cc i tng thuc lp mi c th c s dng thay cho i tng ca lp c bt c u. Tha k l mt hnh thc ti s dng phn mm, trong mt lp mi c xy dng bng cch hp th cc thnh vin ca mt lp c sn v b sung nhng tnh nng mi hoc sa tnh nng c sn. Ni cch khc, xut pht t mt lp m hnh ha mt khi nim tng qut hn, 16

chng hn Shape, ta c th dng quan h tha k xy dng cc lp m hnh ha cc khi nim c th hn, chng hn Circle, Triangle. Bng cch ny, ta c th s dng giao din cng nh ci t ca lp c cho lp mi. a hnh (polymorphism), theo ngha tng qut, l kh nng tn ti nhiu hnh thc. Trong hng i tng, a hnh i km vi quan h tha k v n c ngha rng cng mt ci tn c th c hiu theo cc cch khc nhau ty tng tnh hung. Cc i tng thuc cc lp dn xut khc nhau c th c i x nh nhau, nh th chng l cc i tng thuc lp c s, chng hn c th t cc i tng Triangle v Circle trong cng mt cu trc d liu dnh cho Shape, hoc dng cng mt li gi hm rotate cho cc i tng Triangle hay Circle. V khi nhn c cng mt thng ip , cc i tng thuc cc lp khc nhau hiu n theo nhng cch khc nhau. V d, khi nhn c thng ip "rotate", cc i tng Triangle v Amoeba thc hin cc phng thc rotate() khc nhau.

17

Bi tp
1. in t thch hp vo ch trng trong mi cu sau: a) Quan h gia mt ngi nh v mt bn thit k tng t nh quan h gia mt ________ vi mt lp. b) Khi mi i tng ca mt lp gi mt bn ring ca mt thuc tnh, trng d liu i din cho thuc tnh c gi l _________ 2. Ch trng n cc tnh cht quan trng trong khi b qua cc chi tit t quan trng c gi l A. Tru tng ha B. a hnh C. ng gi D. Che giu thng tin 3. "Cng mt thng ip c hiu theo cc cch khc nhau ty theo i tng nhn c thng ip thuc lp no" l c im ca khi nim no? A. ng gi B. a hnh C. Tha k D. Ti s dng 4. "i tng thuc lp con c th c i x nh i tng thuc lp cha" l c im ca khi nim no? A. Tru tng ha B. a hnh C. ng gi D. Che giu thng tin E. Tha k 5. "Che i cc chi tit ci t v ch cho thy giao din ca m-un" l c im ca khi nim no? A. Tru tng ha B. a hnh C. ng gi D. Ti s dng

18

19

Chng 2.

Ngn ng lp trnh Java

Java c hng Sun Microsystems2 thit k nm 1991 nh l mt ngn ng dnh cho cc chng trnh nhng (embedded program) chy trn cc thit b in t gia dng nh l vi sng v cc h thng an ninh gia nh. Tuy nhin, s pht trin v lan rng ca Internet v World Wide Web (WWW) khin Sun chuyn hng Java t mt ngn ng cho lp trnh nhng sang ngn ng lp trnh ng dng Web. n nay, Java tr thnh ngn ng lp trnh ng dng ph thng v l mt trong nhng ngn ng quan trng nht pht trin cc ng dng Web v Internet. 2.1. C TNH CA JAVA Java l ngn ng hng i tng. Cc ngn ng hng i tng chia chng trnh thnh cc m-un ring bit, c gi l cc i tng, chng ng gi d liu v cc thao tc ca chng trnh. Cc khi nim lp trnh hng i tng v thit k hng i tng ni v phong cch t chc chng trnh ang ngy cng c la chn cho vic xy dng cc h thng phn mm phc tp. Khng nh ngn ng C++, trong cc c im hng i tng c gn thm vo ngn ng C, ngay t u Java c thit k l mt ngn ng hng i tng. Java l ngn ng c tnh chc chn. Khng nh nhiu ngn ng lp trnh khc, li trong cc chng trnh Java khng gy s c h thng (system crash). Mt s c tnh ca ngn ng cn cho php pht hin nhiu li tim tng trc khi chng trnh chy. Java c tnh c lp nn tng (platform independent). Mt nn tng (platform) y c ngha mt h thng my tnh vi h iu hnh c th, chng hn nh mt h thng Windows hay Macintosh. Thng hiu ca Java l "Write once, run anywhere" (Vit mt ln, chy bt c u). C ngha l mt chng trnh Java c th chy trn cc nn tng khc nhau m khng phi dch li. Mt s ngn ng bc cao khc khng c c c tnh ny. Tnh kh chuyn, hay kh nng chy trn hu nh tt c cc nn tng, cn l nguyn do cho vic Java rt ph hp cho cc ng dng Web. Java l ngn ng phn tn. Cc chng trnh c th c thit k chy trn mng my tnh, mt chng trnh bao gm nhng lp t ri rc ti cc my khc nhau trong mng. Bn cnh ngn ng, Java cn c mt b su tp phong ph cc th vin m c thit k dng trc tip cho cc loi ng dng c th, to

Sun Microsystems nhp vo hng Oracle t nm 2010.

20

iu kin thun li cho vic xy dng cc h thng phn mm cho Internet v WWW. Java l mt ngn ng an ton. c thit k dng cho cc mng my tnh, Java c nhng c tnh t bo v trc nhng phn m khng c tin cy nhng phn c th a virus vo h thng hoc gy ri h thng bng cch no . V d, khi mt chng trnh Web vit bng Java c ti xung trnh duyt my tnh, chng b cm c v ghi thng tin ti my tnh. 2.1.1. My o Java Java Virtual Machine Ngn ng my bao gm nhng ch th (instruction) rt n gin m CPU my tnh c th thc hin trc tip. Tuy nhin, hu ht cc chng trnh u c vit bng cc ngn ng lp trnh bc cao nh Java hay C++. Mt chng trnh vit bng ngn ng bc cao cn c dch sang ngn ng my trc khi c th c chy trn my tnh. Vic dch ny do trnh bin dch thc hin. chy trn cc loi my tnh vi cc ngn ng my khc nhau, cn n cc trnh bin dch ph hp vi loi ngn ng my . C mt la chn khc thay v bin dch chng trnh vit bng ngn ng bc cao. Thay v dng mt trnh bin dch dch thng ton b chng trnh, ta c th dng mt trnh thng dch, n dch tng ch th mt v ch dch khi cn n. Mt trnh thng dch l mt chng trnh hot ng gn nh mt CPU vi mt dng chu trnh np-v-thc-thi (fetch-and-execute). thc thi mt chng trnh, trnh thng dch lp i lp li chui cng vic: c mt ch th t trong chng trnh, xc nh xem cn lm g thc hin ch th , v ri thc hin cc lnh m my thch hp thc hin ch th . Mt cng dng ca trnh thng dch l thc thi cc chng trnh vit bng ngn ng bc cao, chng hn nh ngn ng Lisp. Cng dng th hai l chng cho php ta chy mt chng trnh ngn ng my dnh cho mt loi my tnh ny trn mt loi my tnh hon ton khc. V d, c mt chng trnh tn l "Virtual PC" chy trn cc my tnh ci h iu hnh Mac OS, l mt trnh thng dch thc thi cc chng trnh m my vit cho cc my tnh tng thch IBM PC. Nu ta chy "Virtual PC" trn mt my Mac OS, ta c th chy bt c chng trnh PC no, trong c c cc chng trnh vit cho Windows. Nhng ngi thit k Java chn cch t hp gia trnh bin dch v trnh thng dch. Cc chng trnh vit bng Java c bin dch thnh m my, nhng y l loi ngn ng my dnh cho loi my tnh khng tn ti loi my "o" ny c gi l My o Java (Java Virtual Machine JVM). Ngn ng my dnh cho my o Java c gi l Java bytecode, hay ngn gn l bytecode. chy c cc chng trnh Java trn mt loi my tnh bt k, ngi ta ch cn mt trnh thng dch dnh cho Java bytecode, trnh thng dch ny gi lp my o Java theo kiu m Virtual PC gi lp mt my tnh PC. My o Java cng chnh l tn gi dnh cho trnh thng 21

dch bytecode thc hin nhim v gi lp, do ta ni rng mt my tnh cn mt my o Java chy cc chng trnh Java.

Hnh 2.1: Bin dch v thng dch i vi cc chng trnh Java

Tt nhin, mi loi my tnh cn mt trnh thng dch Java bytecode khc, nhng mt khi c mt trnh thng dch nh vy, n c th chy mt chng trnh Java bytecode bt k. V cng chnh chng trnh Java bytecode c th chy trn bt c my tnh no c mt trnh thng dch Java bytecode. y chnh l mt trong cc c im quan trng ca Java: mt chng trnh sau khi bin dch c th chy trn nhiu loi my tnh khc nhau. C nhiu l do ti sao nn dng m trung gian l Java bytecode thay cho vic phn pht m ngun chng trnh Java v cho mi ngi t bin dch n sang m my ca my tnh h ang dng. Th nht, trnh bin dch l mt chng trnh phc tp trong khi trnh thng dch ch l mt chng trnh nh v n gin. Vit mt trnh thng dch cho mt loi my tnh mi d hn l vit mt trnh bin dch. Th hai, nhiu chng trnh Java cn c ti xung t mng my tnh. Vic ny dn n cc mi quan tm d thy v bo mt: ta khng mun ti v v chy mt chng trnh s ph hoi my tnh hoc cc file trong my tnh ca ta. Trnh thng dch bytecode hot ng vi vai tr b m gia my tnh ca ta v chng trnh ta ti v. N c th bo v ta khi cc hnh ng nguy him tim tng ca chng trnh . Khi Java cn l mt ngn ng mi, n b ch trch l chy chm. Do Java bytecode c thc thi bi mt trnh thng dch, c v nh cc chng trnh bytecode khng bao gi c th chy nhanh bng cc chng trnh c bin dch ra ngn ng my ca chnh my tnh m chng trnh ang chy trn . Tuy nhin, vn ny c gii quyt gn nh ton b bng vic s dng trnh bin dch JIT (just-in-time compiler) cho vic thc thi Java bytecode. Trnh bin dch JIT dch Java bytecode thnh m my. N lm vic ny trong khi thc thi chng trnh. Cng nh mt trnh thng dch thng thng, u vo cho mt trnh bin dch JIT l mt chng trnh Java bytecode, v nhim v ca n l thc thi chng trnh . Nhng trong khi thc thi chng trnh, n dch mt phn ca chng trnh ra m my. Nhng phn c bin dch ny khi c th c thc thi nhanh hn l so 22

vi khi chng c thng dch. Do mt phn ca chng trnh thng c thc thi nhiu ln trong khi chng trnh chy, mt trnh bin dch JIT c th ci thin ng k tng thi gian chy ca chng trnh. 2.1.2. Cc nn tng Java Hng Sun nh ngha v h tr bn bn Java hng n cc mi trng ng dng khc nhau. Nhiu API (giao din lp trnh ng dng) ca Java cng c phn ra thnh nhm theo tng nn tng. Bn nn tng l: 1. Java Card dnh cho th thng minh (smartcard) v cc thit b nh nh tng t. Th SIM v th ATM c s dng nn tng ny. 2. Java Platform, Micro Edition (Java ME) dnh cho cc mi trng h thng nhng, chng hn nh in thoi di ng. 3. Java Platform, Standard Edition (Java SE) l nn tng tiu chun, dnh cho mi trng my trm, thng c dng pht trin Java application v Java applet. y l nn tng c s dng rng ri, dng trin khai cc ng dng nh cho mc ch s dng tng qut. Java SE bao gm mt my o Java v mt b cc th vin cn thit cho vic s dng h thng file, mng, giao din ha, v.v.. trong chng trnh. 4. Java Platform, Enterprise Edition (Java EE) dnh cho mi trng ln v phn tn ca doanh nghip hoc Internet, thng dng pht trin cc server. Nn tng ny khc vi Java SE ch n c thm cc th vin vi chc nng trin khai cc phn mm phn tn a tng c kh nng chu li. Cun sch ny s ch dng Java lm ngn ng minh ha cho lp trnh hng i tng, nn ch gii hn trong phm vi Java SE v Java application. 2.1.3. Mi trng lp trnh Java Mt mi trng lp trnh Java thng bao gm mt s chng trnh thc hin cc nhim v khc nhau phc v cng vic son, dch, v chy mt chng trnh Java. C th s dng mt chng trnh son tho vn bn dng text bt k vit m ngun Java. Mt chng trnh Java bao gm mt hoc nhiu nh ngha lp. Theo quy c, mi nh ngha lp c t trong mt file ring. Theo quy tc mt file m ngun Java ch c cha nhiu nht mt nh ngha lp vi t kha public ngha ca t kha ny s c ni n sau. File cha nh ngha lp phi c tn trng vi tn ca lp public t trong file , v d file HelloWorld.java cha lp public c tn HelloWorld, file HelloWorldApplet.java cha lp public c tn HelloWorldApplet. Java l ngn ng phn bit ch hoa ch thng. Do nu lp HelloWorld c t trong file helloworld.java th s gy li khi bin dch. 23

Nhng ngi mi bt u s dng Java nn bt u t vic vit chng trnh bng mt phn mm son tho n gin v s dng cc cng c dng lnh trong b JDK dch v chy chng trnh. Ngay c nhng lp trnh vin thnh tho i khi cng s dng cch ny. Cc bc c bn xy dng v thc thi mt chng trnh Java: Son tho: M ngun chng trnh c vit bng mt phn mm son tho vn bn dng text v lu trn a. Ta c th dng nhng phn mm son tho vn bn n gin nht nh Notepad (trong mi trng Windows) hay emacs (trong mi trng Unix/Linux), hoc cc cng c son tho trong mi trng tch hp vit m ngun chng trnh. M ngun Java t trong cc file vi tn c phn m rng l .java. Dch: Trnh bin dch Java (javac) ly file m ngun v dch thnh cc lnh bng bytecode m my o Java hiu c, kt qu l cc file c ui .class. Np v chy: Trnh np Java (java) s dng my o Java chy chng trnh c dch ra dng bytecode.

thun tin v tng nng sut cho vic lp trnh, ngi ta dng cc mi trng lp trnh tch hp (IDE integrated development environment). Trong , cc bc dch v chy thng c kt hp v thc hin t ng, tt c cc cng on i vi ngi dng ch cn l vic chy cc tnh nng trong mt phn mm duy nht. Trong s cc IDE ph bin nht cho Java c Eclipse, NetBean v JBuilder. Tuy IDE rt hu ch cho cc lp trnh vin, nhng ngi mi lm quen vi ngn ng nn t thc hin cc bc dch v chy chng trnh thay v thng qua cc chc nng ca IDE. Nh vy, ngi hc mi c th nm c bn cht cc bc ca qu trnh xy dng chng trnh, hiu c bn cht v c im chung ca cc IDE, trnh tnh trng b ph thuc vo mt IDE c th. Do , cun sch ny khng hng dn v mt IDE no m ch dng cng c chy t dng lnh trong b JDK. 2.1.4. Cu trc m ngun Java Mi file m ngun (tn file c ui .java) cha mt nh ngha lp (class). Mi lp i din cho mt mnh ca chng trnh, mt chng trnh nh c th ch bao gm mt lp. nh ngha lp phi c bc trong mt cp ngoc { }. Mi lp c mt vi phng thc. Trong lp Car, phng thc break cha cc lnh m t chic xe con cn phanh nh th no. Cc phng thc ca lp no phi c khai bo bn trong nh ngha lp . Bn trong cp ngoc { } ca mt phng thc, ta vit mt chui cc lnh quy nh hot ng ca phng thc . C th tm coi phng thc ca Java gn ging nh hm hay chng trnh con.

24

Hnh 2.2: Cu trc m Java.

2.1.5. Chng trnh Java u tin Chng trnh n gin trong Hnh 2.3 s hin ra mn hnh dng ch Hello, world!. Trong chng trnh c nhng chi tit m ti thi im ny ta cha cn hiu r v c th n vi chng sau. Ta s xem xt tng dng.

Hnh 2.3: Chng trnh Java u tin.

Hai dng u tin bt u bng chui // l cc dng ch thch chng trnh. l kiu ch thch dng n. Cc dng ch thch khng gy ra hot ng g ca chng trnh khi chy, trnh bin dch b qua cc dng ny. Ngoi ra cn c dng ch thch ko di trn nhiu dng, s dng /* v */ nh du im bt u v im kt thc on ch thch. Dng th ba, public class HelloWorld { tuyn b rng y l nh ngha v mt lp c tn HelloWorld. "HelloWorld" l tn ca lp v cng l tn ca chng trnh, tuy rng khng phi lp no cng l mt chng trnh nh trong v d ny. mt lp l mt chng trnh, ta cn vit cho lp mt phng thc c tn main vi nh ngha c dng sau. y l c php bt buc ca phng thc main():

25

Khi ta yu cu trnh thng dch Java chy chng trnh HelloWorld, my o Java s tm lp c tn HelloWorld, ri n tm phng thc main() vi c php bt buc nh trn. y l ni chng trnh bt u thc hin v kt thc, my o ln lt chy cc lnh bn trong cp ngoc { } ca phng thc main(). Phng thc main() c th gi cc phng thc khc c nh ngha trong lp hin ti hoc trong cc lp khc, n quyt nh chui cng vic m my tnh s thc hin khi chng trnh chy. Mi ng dng Java phi c t nht mt lp, v c mt phng thc main() trong mt lp no . T kha public ti dng u tin ca main() c ngha rng y l phng thc c mc truy nhp public (cng khai) phng thc c th c gi t bt c u trong m chng trnh. Thc t l main() c gi t trnh thng dch mt th nm ngoi chng trnh. T kha static s c gii thch trong cc chng sau. T kha void c ngha rng phng thc main() khng c kt qu tr v. Tham s String[] args ca hm main() l mng cha cc xu k t c nhp vo di hnh thc tham s dng lnh khi ta chy chng trnh t ca s lnh (console). Thn phng thc main(), cng nh bt k mt hm no khc, c bt u v kt thc bi cp ngoc { }, bn trong l chui cc lnh m khi chng trnh chy chng s c thc hin tun t t lnh u tin cho n lnh cui cng. Mi lnh Java u kt thc bng mt du chm phy. Phng thc main() trong v d ang xt c cha ng mt lnh. Lnh ny c tc dng hin th thng ip ra u ra chun (standard output). l v d v mt lnh gi hm. Lnh ny gi hm System.out.println(), mt hm c sn trong th vin chun Java, yu cu hm ny thc hin vic hin th thng ip. Ni theo cch ca lp trnh hng i tng, lnh chnh l mt thng ip gi ti i tng c tn System.out yu cu in ra u ra chun mt xu k t. Khi chy chng trnh, thng ip "Hello, world!" (khng c nhy kp) s c hin th ra u ra chun. u ra chun l ci g th ty vo vic chng trnh ang chy loi thit b no, platform no. Lu rng trong Java, mt hm khng th tn ti c lp. N phi thuc v mt lp no . Mt chng trnh c nh ngha bi mt lp public c dng

Trong , <program-name> l tn lp, tn chng trnh, v cng l tn file m ngun. public l t kha cn c t u khai bo cc lp chng trnh. Nhng 26

lp c khai bo vi t kha ny cn c t ti mt file c tn file trng vi tn lp, chnh xc n c ch hoa hay ch thng. V d, lp HelloWorld trn nm trong file m ngun c tn HelloWorld.java. Sau khi bin dch file m ngun HelloWorld.java, ta s c file bytecode HelloWorld.class file c th chy bng trnh thng dch Java. Ph lc A hng dn chi tit v cch s dng cng c dng lnh JDK dch v chy chng trnh. y l b phn mm min ph, c th c ti v t trang web ca Oracle3. 2.2. BIN Trong mt chng trnh, bin l tn ca mt vng b nh c dng lu d liu trong khi chng trnh chy. D liu lu trong mt bin c gi l gi tr ca bin . Chng ta c th truy nhp, gn hay thay i gi tr ca cc bin, khi bin c gn mt gi tr mi, gi tr c s b ghi ln. Java yu cu mi bin trc khi dng phi c khai bo. V d:

Cc bin c khai bo trong mt hm l bin a phng. Nn khai bo bin a phng ngay trc khi s dng hoc u khi m chng trnh c ng khung trong cp ngoc { }. Bin a phng c khai bo ti hm no th c hiu lc bn trong hm , chng hn numberOfBaskets v applePerBasket trong Hnh 2.4 l cc bin a phng ca hm main v ch c hiu lc bn trong hm main(). Ngoi bin a phng, Java cn c loi bin thc th vi phm vi nm trong mt i tng v bin lp vi phm vi lp. Ch-ng 4 v Ch-ng 10 s m t chi tit v hai loi bin ny.

a ch http://www.oracle.com/technetwork/java/javase/downloads/index.html

27

Hnh 2.4: S dng bin a phng.

Mt bin a phng c khai bo nhng cha c gn mt gi tr no c gi l bin cha c khi to v n c gi tr khng xc nh. Trnh bin dch s bo li i vi m s dng bin a phng cha c khi to. C th khi to gi tr ca bin ngay ti lnh khai bo trnh tnh hung qun khi to bin, v d:
char grade = 'A';

Vng hiu lc ca mt bin c th cn nh hn phm vi phng thc. Trong cc phng thc, ta thng to cc khi lnh. Thng thng, cc khi c gii hn bi cp ngoc { }. V d v mt s khi thng gp l cc lnh c cu trc (for, while) v cc lnh iu kin (if) c trnh by chi tit ti Mc 2.4. Nu mt bin c khai bo bn trong mt khi lnh th n ch c phm vi cho n ht khi lnh . 2.3. CC PHP TON C BN 2.3.1. Php gn Php gn l cch gn mt gi tr cho mt bin hoc thay i gi tr ca mt bin. Lnh gn trong Java c cng thc: bin = biu thc; Trong , du bng (=) c gi l du gn hay ton t gn, biu thc v phi du gn c tnh ri ly kt qu gn cho bin nm v tri. Biu thc ti v phi c th l mt gi tr trc tip, mt bin, hoc mt biu thc phc tp. 2.3.2. Cc php ton s hc Java h tr nm php ton s hc sau: + (cng), - (tr), * (nhn), / (chia), % (modulo ly phn d ca php chia). Cc php ton ny ch p dng c cho cc bin kiu c bn nh int, long v khng p dng c cho cc kiu tham chiu. Php chia c thc hin cho hai gi tr kiu nguyn s cho kt qu l thng nguyn. V d biu thc 4 / 3 cho kt qu bng 1, cn 3 / 5 cho kt qu bng 0. 28

Mt s php gn km theo biu thc xut hin nhiu ln trong mt chng trnh, v vy Java cho php vit cc php gn biu thc mt cch ngn ngn hn, s dng cc php gn phc hp (+=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=). Cch s dng php gn phc hp += nh sau: bin += biu thc; tng ng bin = bin + biu thc; V d:
apples += 2; tng ng apples = apples + 2;

Cc php gn phc hp khc c s dng tng t. Java cn cung cp cc php ton ++ (hay --) tng (gim) gi tr ca bin ln mt n v. V d: apples++ hay ++apple c tc dng tng apples thm 1 n v apples-- hay --apple c tc dng gim apples i 1 n v Khc bit gia vic vit php tng/gim trc bin (tng/gim trc) v vit php tng/gim sau bin (tng/gim sau) l thi im thc hin php tng/gim, th hin gi tr ca biu thc. Php tng/gim trc c thc hin trc khi biu thc c tnh gi tr, cn php tng/gim sau c thc hin sau khi biu thc c tnh gi tr. V d, nu apples vn c gi tr 1 th cc biu thc ++apples hay apples++ u c hiu ng l apples c tng t 1 ln 2. Tuy nhin, ++apples l biu thc c gi tr bng 2 (tng apples trc tnh gi tr), trong khi apples++ l biu thc c gi tr bng 1 (tng apples sau khi tnh gi tr biu thc). Nu ta ch quan tm n hiu ng tng hay gim ca cc php ++ hay -- th vic php ton c t trc hay t sau khng quan trng. cng l cch dng ph bin nht ca cc php ton ny. 2.3.3. Cc php ton khc Cc php ton so snh c s dng so snh gi tr hai biu thc. Cc php ton ny cho kt qu kiu boolean bng true nu ng v false nu sai. V d:
boolean enoughApples = (totalApples > 10);

Cc php ton so snh trong Java c lit k trong Bng 2.1. Cn lu rng mc d tt c cc php ton ny u dng c cho cc kiu d liu c bn, ch c == v != l dng c cho kiu tham chiu. Tuy nhin, hai php ton ny cng khng c ngha so snh gi tr ca cc i tng. Chi tit s c ni n ti Ch-ng 3.

29

K hiu ton hc Ton t > < = > < >= <= == !=

V d x > y x < y x >= y x <= y x == y x != y

ngha x ln hn y x nh hn y x ln hn hoc bng y x nh hn hoc bng y x bng y x khc y

Bng 2.1: Cc php ton so snh.

Ton t ngha && || And Or

V d x && y x || y

ngha ca v d Cho gi tr ng khi c x v y ng, ngc li cho gi tr sai. Cho gi tr ng khi x ng hoc y ng, ngc li cho gi tr sai Ph nh ca x. Cho gi tr ng khi x sai; cho gi tr sai khi x ng

Not

!x

Bng 2.2: Cc php ton logic.

Cc php ton logic dnh cho cc ton hng l cc biu thc quan h hoc cc gi tr boolean. Kt qu ca biu thc logic l gi tr boolean. V d:
bool enoughApples = (apples > 3) && (apples < 10);

c kt qu l bin enoughApples nhn gi tr l cu tr li ca cu hi "bin apples c gi tr ln hn 3 v nh hn 10 hay khng?". 2.3.4. u tin ca cc php ton Mc u tin ca mt s php ton thng gp c th t ca chng nh sau: Cc ton t n, +, -, !, ++ v -- c u tin cao nht. Tip theo l cc php ton i *, / v %. Cui cng l cc php ton i +, -. Cui cng l cc php ton so snh <, >, <=, >=. V d: 3 + 4 < 2 + 6 cho kt qu true. C th dng cc cp ngoc ( ) nh r th t u tin trong biu thc. V d: 2 * (1 + 3) cho kt qu bng 8. 2.4. CC CU TRC IU KHIN Java cung cp hai loi lnh kim sot lung iu khin: 30 lnh r nhnh (branching) chn mt hnh ng t danh sch gm nhiu hnh ng.

lnh lp (loop) thc hin lp i lp li mt hnh ng cho n khi mt iu kin dng no c tha mn.

Hai loi lnh to thnh cc cu trc iu khin (control structure) bn trong chng trnh. 2.4.1. Cc cu trc r nhnh Lnh if-else Lnh if-else (hay gi tt l lnh if) cho php r nhnh bng cch la chn thc hin mt trong hai hnh ng. V d, trong mt chng trnh xp loi im thi, nu im ca sinh vin nh hn 4.0, sinh vin c coi l trt, nu khng th c coi l . Th hin ni dung bng mt lnh if-else ca Java, ta c on m:
if (score < 4.0) System.out.print("Failed"); else System.out.print("Passed");

Khi chng trnh chy mt lnh if-else, u tin n kim tra biu thc iu kin nm trong cp ngoc n sau t kha if. Nu biu thc c gi tr bng true th lnh nm sau t kha if s c thc hin. Ngc li, lnh nm sau else s c thc hin. Ch l biu thc iu kin phi c t trong mt cp ngoc n.

Hnh 2.5: V d v cu trc if-else.

Chng trnh v d trong Hnh 2.5 yu cu ngi dng nhp im ri in ra cc thng bo khc nhau ty theo im s hoc trt.

31

Trong cu trc r nhnh if-else, ta c th b phn else nu khng mun chng trnh thc hin hnh ng no nu iu kin khng tha mn. Chng hn, nu mun thm mt li khen c bit cho im s xut sc t 9.0 tr ln, ta c th thm lnh if sau vo trong chng trnh ti Hnh 2.5.
if (score >= 9.0) System.out.print("Excellent!"); Ta c th dng cc cu trc if-else lng nhau to ra iu kin r nhnh

phc tp. Ly mt v d phc tp hn: cho trc im s (lu ti bin score kiu double), xc nh xp loi hc lc A, B, C, D, F ty theo im . Quy tc xp loi l: nu im t 8.5 tr ln th t loi A, im t 7.0 ti di 8.5 t loi B, v.v.. Ti on m xt cc trng hp ca xp loi im, ta c th dng cu trc if-else lng nhau nh sau:
if (score >= 8.5) grade = 'A'; else if (score >= 7.0) grade = 'B'; else if (score >= 5.5) grade = 'C'; else if (score >= 4.0) grade = 'D'; else grade = 'F';

Mt iu cn c bit lu l nu mun thc hin nhiu hn mt lnh trong mi trng hp ca lnh if-else, ta cn dng cp ngoc { } bc tp lnh thnh mt khi lnh. V d, phin bn phc tp hn ca lnh if trong Hnh 2.5:

32

Lnh switch Khi chng ta mun vit mt cu trc r nhnh c nhiu la chn, ta c th s dng nhiu lnh if-else lng nhau. Tuy nhin, trong trng hp vic la chn r nhnh ph thuc vo gi tr (kiu s nguyn hoc k t, hoc xu k t k t JDK 7.0) ca mt bin hay biu thc, ta c th s dng cu trc switch chng trnh d hiu hn. Lnh switch in hnh c dng nh sau:
switch (biu_thc) { case hng_1: tp_lnh_1; break; case hng_2: tp_lnh_2; break; ... default: tp_lnh_mc_nh; }

Khi lnh switch c chy, biu_thc c tnh gi tr v so snh vi hng_1. Nu bng nhau, chui lnh k t tp_lnh_1 c thc thi cho n khi gp lnh break u tin, n y chng trnh s nhy ti im kt thc cu trc switch. Nu biu_thc khng c gi tr bng hng_1, n s c so snh vi hng_2, nu bng nhau, chng trnh s thc thi chui lnh k t tp_lnh_2 ti khi gp lnh break u tin th nhy ti cui cu trc switch. Quy trnh c tip din nh vy. Cui cng, nu biu_thc c gi tr khc vi tt c cc gi tr c lit k (hng_1, hng_2, ...), chng trnh s thc thi tp_lnh_mc_nh nm sau nhn default: nu nh c nhn ny (khng bt buc). V d, lnh sau so snh gi tr ca bin grade vi cc hng k t 'A', 'B', 'C' v in ra cc thng bo khc nhau cho tng trng hp.

33

switch (grade) { case 'A': System.out.print("Grade = case 'B': System.out.print("Grade = case 'C': System.out.print("Grade = default: System.out.print("Grade's }

A"); break; B"); break; C"); break; not A, B or C");

N tng ng vi khi lnh if-else lng nhau sau:

Lu , cc nhn case trong cu trc switch phi l hng ch khng th l bin hay biu thc. Nu cn so snh vi bin hay biu thc, ta nn dng khi lnh if-else lng nhau. Vn c bit ca cu trc switch l cc lnh break. Nu ta khng t gn mt lnh break vo cui chui lnh cn thc hin cho mi trng hp, chng trnh s chy tip chui lnh ca trng hp sau ch khng t ng nhy ti cui cu trc switch. V d, on chng trnh sau s chy lnh in th nht nu grade nhn mt trong ba gi tr 'A', 'B', 'C' v chy lnh in th hai trong trng hp cn li:
switch (grade) { case 'A': case 'B': case 'C': cout << "Grade is A, B or C."; break; default: cout << "Grade is not A, B or C."; }

Chng trnh trong Hnh 2.6 l mt v d hon chnh s dng cu trc switch in ra cc thng bo khc nhau ty theo xp loi hc lc (grade) m ngi dng nhp t bn phm. Trong , case 'A' kt thc vi break sau ch mt lnh, cn case 'B' chy tip qua case 'C', 'D' ri mi gp break v thot khi lnh switch. Nhn default c dng x l trng hp bin grade gi gi tr khng hp l i vi xp loi hc lc. Trong nhiu chng trnh, phn default thng c dng x l cc trng hp khng mong i, chng hn nh bt li cc k hiu hc lc khng hp l m ngi dng c th nhp sai. 34

C mt lu nh l Scanner khng h tr vic c tng k t mt. Do , c gi tr ca grade do ngi dng nhp, ta dng phng thc next() c mt chui (khng cha k t trng), ri ly k t u tin bng hm charAt(0) (m kiu String cung cp) lm gi tr ca grade.

35

import java.util.Scanner; public class SwitchExample { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("Enter your grade: "); String userInput = input.next(); char grade = userInput.charAt(0); switch (grade) { case 'A': System.out.println("Excellent!"); break; case 'B': System.out.println("Great!"); case 'C': case 'D': System.out.println("Well done!"); break; case 'F': System.out.println("Sorry, you failed."); break; default: System.out.println("Error! Invalid grade."); } } } Kt qu chy chng trnh Enter your grade: A Excellent! Enter your grade: B Great! Well done! Enter your grade: D Well done! Enter your grade: F Sorry, you failed.
Hnh 2.6: V d s dng cu trc switch.

K t Java SE 7, ta c th dng cc i tng String lm nhn cho cc lnh case. V d:


switch (answer) { case "yes": System.out.print("You said 'yes'"); break; case "no": System.out.print("You said 'no'"); break; default: System.out.print("I don't get what you mean."); }

36

2.4.2. Cc cu trc lp Cc chng trnh thng cn phi lp i lp li mt hot ng no . V d, mt chng trnh xp loi hc lc s cha cc lnh r nhnh gn xp loi A, B, C cho mt sinh vin ty theo im s ca sinh vin ny. xp loi cho c mt lp, chng trnh s phi lp li thao tc cho tng sinh vin trong lp. Phn chng trnh lp i lp li mt lnh hoc mt khi lnh c gi l mt vng lp. Lnh hoc khi lnh c lp i lp li c gi l thn ca vng lp. Cu trc lp cho php lp trnh vin ch th cho chng trnh lp i lp li mt hot ng trong khi mt iu kin no vn c tha mn. Khi thit k mt vng lp, ta cn xc nh thn vng lp thc hin hnh ng g. Ngoi ra, ta cn cn mt c ch quyt nh khi no vng lp s kt thc. Mc ny s gii thiu v cc lnh lp m Java cung cp. Vng while Vng while lp i lp li chui hnh ng, gi l thn vng lp, nu nh iu kin lp vn cn c tha mn. C php ca vng lp while nh sau:
while (iu_kin_lp)

thn_vng_lp Cu trc ny bt u bng t kha while, tip theo l iu kin lp t trong mt cp ngoc n, cui cng l thn vng lp. Thn vng lp hay cha nhiu hn mt lnh v khi th phi c gi trong mt cp ngoc { }. Khi thc thi mt cu trc while, u tin chng trnh kim tra gi tr ca biu thc iu kin, nu biu thc cho gi tr false th nhy n im kt thc lnh while, cn nu iu kin lp c gi tr true th tin hnh thc hin tp lnh trong thn vng lp ri quay tr li kim tra iu kin lp, nu khng tha mn th kt thc, nu tha mn th li thc thi thn vng lp ri quay li... Tp lnh thn vng lp c th lm thay i gi tr ca biu thc iu kin t true sang false dng vng lp. V d, xt mt chng trnh c nhim v m t 1 n mt ngng number cho trc. on m m t 1 n number c th c vit nh sau:
count = 1; while (count <= number) { System.out.print(count + ", "); count++; }

Gi s bin number c gi tr bng 2, on m trn hot ng nh sau: u tin, bin count c khi to bng 1. Vng while bt u bng vic kim tra iu kin (count <= number), ngha l 1 2, iu kin tha mn. Thn vng lp c thc thi ln th nht: gi tr 1 ca count c in ra mn hnh km theo du phy, sau count c tng ln 2. Vng lp quay v im xut pht: kim tra iu kin lp, gi l 2 2, vn tha mn. Thn vng lp c chy ln th hai (in gi tr 2 ca count v 37

tng count ln 3) trc khi quay li im xut pht ca vng lp. Ti ln kim tra iu kin lp ny, biu thc 3 2 cho gi tr false, vng lp kt thc do iu kin lp khng cn c tha mn, chng trnh chy tip lnh nm sau cu trc while ang xt. Cu trc while trong on m trn c th c biu din bng s trong
2.7. Hnh

Hnh 2.7: S mt vng lp while.

Chng trnh hon chnh trong Hnh 2.8 minh ha cch s dng vng lp while in ra cc s nguyn (bin count) t 1 cho n mt ngng gi tr do ngi dng nhp vo t bn phm (lu ti bin number). Km theo l kt qu ca cc ln chy khc nhau vi cc gi tr khc nhau ca number. c bit, khi ngi dng nhp gi tr 0 cho number, thn vng while khng chy mt ln no, th hin vic khng mt s no c in ra mn hnh. L do l v nu number bng 0 th biu thc count <= number ngay t u vng while c gi tr false.

38

Hnh 2.8: V d v vng lp while.

Vng do-while Vng do-while rt ging vi vng while, khc bit l ch thn vng lp s c thc hin trc, sau mi kim tra iu kin lp, nu ng th quay li chy thn vng lp, nu sai th dng vng lp. Khc bit c ngha rng thn ca vng do-while lun c chy t nht mt ln, trong khi thn vng while c th khng c chy ln no. Cng thc ca vng do-while tng qut l:
do

thn_vng_lp
while (iu_kin_lp);

Tng t nh vng while, thn_vng_lp ca vng do-while c th ch gm mt lnh hoc thng gp hn l mt chui lnh c bc trong mt cp ngoc { }. Lu du chm phy t cui ton b khi do-while.

39

Cng thc tng qut ca vng do-while trn tng ng vi cng thc sau nu dng vng while: thn_vng_lp while (iu_kin_lp) thn_vng_lp minh ha hot ng ca hai cu trc lp while v do-while, ta so snh hai on m di y:
count = 1; while (count <= number) { System.out.print( count + ", "); count++; } count = 1; do { System.out.print( count + ", "); count++; } while (count <= number);

Hai on m ch khc nhau ch mt bn tri dng vng while, bn phi dng vng do-while, cn li, cc phn thn vng lp, iu kin, khi to u ging ht nhau. on bn tri c ly t v d trong mc trc, n in ra cc s t 1 n number. on m dng vng do-while bn phi cng thc hin cng vic ging ht on bn tri, ngoi tr mt im: khi number nh hn 1 th n vn m 1 trc khi dng vng lp thn vng lp chy mt ln trc khi kim tra iu kin. Vng for Vng for l cu trc h tr vic vit cc vng lp m s ln lp c kim sot bng bin m. Chng hn, on m gi sau y m t thut ton in ra cc s t 1 n number: Lm nhim v sau y i vi mi gi tr ca count t 1 n number: In count ra mn hnh on m gi c th c vit bng vng for nh sau:
for (count = 1; count <= number; count++) cout << count << ", ";

Vi number c gi tr bng 3, on trnh trn cho kt qu in ra mn hnh l:


1, 2, 3,

Cu trc tng qut ca vng lp for l:


for ( khi_to; iu_kin_lp; cp_nht)

thn_vng_lp Trong , biu thc khi_to thng khi to con m iu khin vng lp, iu_kin_lp xc nh xem thn vng lp c nn chy tip hay khng (iu kin ny thng cha ngng cui cng ca con m), v biu thc cp_nht lm tng hay gim con m. Cng tng t nh cc cu trc if, while..., nu thn_vng_lp c nhiu hn mt lnh th cn phi bc n trong mt cp ngoc { }. Lu rng cp ngoc n bao quanh b ba khi_to, iu_kin_lp, cp_nht, cng nh hai du chm phy ngn cch ba thnh phn , l cc thnh bt buc ca c php cu trc for. Ba 40

thnh phn cng c th l biu thc rng nu cn thit, nhng k c khi vn phi c hai du chm phy. Ta c th khai bo bin ngay trong phn khi_to ca vng for, chng hn i vi bin con m. Nhng cc bin c khai bo ti ch c hiu lc bn trong cu trc lp. V d:
for (int count = 1; count <= number; count++) cout << count << ", ";
import java.util.Scanner; public class ForExample { public static void main(String[] args) { float sum = 0; int subjects = 10; Scanner input = new Scanner(System.in); System.out.print( "Enter the marks for " + subjects + " subjects: "); for (int count = 0; count < subjects; count++) { float mark; mark = input.nextFloat(); sum += mark; } System.out.print("Average mark = "+sum/subjects); } }
Hnh 2.9: V d v vng lp for.

Hnh 2.9 minh ha cch s dng vng lp for tnh im trung bnh t im ca 10 mn hc (s mn hc lu trong bin subjects). Ngi dng s c yu cu nhp t bn phm im s ca 10 mn hc trong khi chng trnh cng dn tng ca 10 im s ny. Cng vic m chng trnh cn lp i lp li 10 ln l: nhp im ca mt mn hc, cng dn im vo tng im. u tin vng for s tin hnh bc khi to vi mc ch chnh l khi to bin m. Vic khi to ch c tin hnh duy nht mt ln. Trong v d ny, bin count c khai bo ngay ti vng for v khi to gi tr bng 0. Tip theo vng for s tin hnh kim tra iu kin lp count < subjects. Nu iu kin sai, vng lp for s kt thc. Nu iu kin ng, thn vng lp for s c thc hin (nhp mt gi tr kiu float ri cng dn vo bin sum). Sau l bc cp nht vi nhim v tng bin m thm 1. Kt qu l vng lp s chy 10 ln vi cc gi tr count bng 0, 1, .., 9 (khi count nhn gi tr 10 th iu kin lp khng cn ng v vng lp kt thc). Cc lnh break v continue Nh gii thiu cc mc trc, cc vng lp while, do-while, v for u kt thc khi kim tra biu thc iu kin c gi tr false v chy tip thn vng lp trong trng hp cn li. Cc lnh break v continue l cc lnh nhy cho php thay i lung iu khin . 41

Lnh break khi c thc thi bn trong mt cu trc lp hay mt cu trc switch c tc dng lp tc chm dt cu trc , chng trnh s chy tip lnh nm tip sau cu trc . Lnh break thng c dng kt thc sm vng lp (thay v i n lt kim tra iu kin lp) hoc b qua phn cn li ca cu trc switch. V v d s dng lnh break trong vng lp. Chng hn, nu ta sa v d trong Hnh 2.9 vng for ngng li khi ngi dng nhp im s c gi tr m, ta c chng trnh trong Hnh 2.10. Vi ci t ny, khi ngi dng nhp mt im s c gi tr m, iu kin (mark < 0) s cho kt qu true, chng trnh thot khi vng for v chy tip t lnh if nm sau . Trong trng hp , bin count cha kp tng n ngng subjects (iu kin lp ca vng for cha kp b ph v). Do , biu thc (count >= subjects) trong lnh if sau c ngha "vng for c chy subjects ln hay khng?" hoc "vng for c b ngt gia chng bi lnh break hay khng?", hay l "d liu nhp vo c thnh cng hay khng?".

Hnh 2.10: V d v lnh break.

Lnh continue nm trong mt vng lp c tc dng kt thc ln lp hin hnh ca vng lp . Hnh 2.11 l mt bn sa i khc ca chng trnh trong Hnh 2.9. Trong phin bn ny, chng trnh khng ghi nhn im s c gi tr m, cng khng kt thc chng trnh sau khi bo li nh bn trong Hnh 2.10, m yu cu nhp li cho n khi no thnh cng. Khi gp im s m c nhp vo (bin mark), lnh continue c thc thi c tc dng b qua on lnh ghi nhn im na sau ca thn vng while (on cng dn vo tng sum v tng bin m count).

42

Ln lp c thc hin sau s yu cu nhp li im cho mn hc ang nhp d (xem kt qu chy chng trnh trong Hnh 2.11). Mt im cn lu l cc lnh break hay continue ch c tc dng i vi vng lp trong cng cha n. Chng hn, nu c hai vng lp lng nhau v lnh break nm trong vng lp bn trong, th khi c thc thi, lnh break ch c tc dng kt thc vng lp bn trong.
import java.util.Scanner; public class ContinueTest { public static void main(String[] args) { float sum = 0; int count=0, subjects = 3; Scanner input = new Scanner(System.in); System.out.print( "Enter the marks for " + subjects + " subjects: "); while (count < subjects) { System.out.print("#" + (count+1) + ": "); float mark = input.nextFloat(); if (mark < 0) { System.out.println(mark + " ignored"); continue; } sum += mark; count++; } System.out.print("Average mark = "+sum/subjects); } } % java ContinueTest

Enter the marks of 3 subjects. #1: 8.0 #2: 7.2 #3: -5 -5 ignored #3: 10.0 Average mark = 8.400001

Hnh 2.11: V d v lnh continue.

2.4.3. Biu thc iu kin trong cc cu trc iu khin Hu ht cc cu trc iu khin m ta ni n trong chng ny u dng n mt thnh phn quan trng: biu thc iu kin. Trong cc v d trc, ta mi ch dng n cc iu kin n gin, chng hn count <= number hay grade == 'A', vi duy nht mt php so snh. Khi cn vit nhng iu kin phc tp hn, cn n nhiu iu kin nh, ta c th kt hp chng bng cc php ton logic && (AND v), || (OR hoc) v ! (NOT ph nh). V d:

43

Khi kim tra iu kin 80 # score < 90, bt ng thc ton hc ny cn c tch thnh hai iu kin n. Bt ng ng khi c hai iu kin n u tha mn. l khi ta cn dng php ton logic && (AND).
if (score >= 80 && score < 90) grade = 'B';

Khi mt trong hai iu kin xy ra, hoc tin ht hoc ti y, th khng th mua thm hng. Trng hp ny, ta cn dng php ton logic || (OR).
if (moneyLeft <= 0 || bagIsFull) cout << "Can't buy anything more!";

Tip tc lp trong khi d liu vo cha c gi tr bng gi tr canh nh du im cui ca chui d liu:
while ( !(input == 0)) ...

Trong trng hp ny, ta c th dng php ph nh, hoc chn cch n gin hn l dng php so snh khc (!=) nh sau:
while (input != 0) ...

c thm
Chng ny ch gii thiu cc nt c bn v ngn ng Java. Bn c c th tm hiu su hn ti cc ti liu nh: 1. Language Basics, The JavaTM Tutorials, http://docs.oracle.com/javase/tutorial/java/nutsandbolts/index.html 2. Chng 4, 5, Deitel & Deitel, Java How to Program, 6th edition, Prentice Hall, 2005.

44

Bi tp
1. in t thch hp vo ch trng trong mi cu sau: a) Mi khai bo lp m bt u bng t kha _______ phi c lu trong mt file c tn trng vi tn lp v kt thc bng phn m rng .java b) T kha ______ to mt i tng thuc lp c tn t bn phi t kha. c) Mi bin khi khai bo phi c ch r mt _______ v mt ______. 2. Cc pht biu sau y ng hay sai? Nu sai, hy gii thch. a) Lp no c cha phng thc public static void main(String [] args) th c th c dng chy ng dng. b) Mt tp lnh cha trong mt cp ngoc {} c gi l mt khi lnh c) Mt lnh c iu kin cho php mt hnh ng c lp i lp li trong khi mt iu kin no vn gi gi tr true. d) Java cung cp cc php ton phc hp nh +=, -= vit tt cc lnh gn. e) Lung iu khin quy nh th t cc lnh c thc thi trong chng trnh. f) Php ton i kiu (double) tr v mt gi tr nguyn l bn sao ca ton hng ca n. g) Bin a phng kiu boolean nhn gi tr mc nh l false. h) Bin a phng kiu boolean nhn gi tr mc nh l true. 3. Ci t b cng c JDK, dch v chy th cc chng trnh v d cho trong chng ny. 4. Vit cc lnh Java thc hin tng nhim v sau y: a) Dng mt lnh gn tng ca x v y cho z v tng x thm 1 sau php tnh trn. b) Kim tra xem gi tr bin count c ln hn 10 hay khng, nu c th in ra dng text "Count is greater than 10". c) Gim x i 1 n v, sau gn cho bin total gi tr l hiu ca total v x. Ch dng mt lnh. d) Tnh phn d ca php chia q cho d ri gn kt qu cho q. e) Khai bo cc bin sum v x thuc kiu int. f) Cng dn gi tr ca x vo bin sum g) In ra dng "The sum is ", tip theo l gi tr ca bin sum. h) Tnh tng cc s chn trong khong t 1 n 99. 45

i) S dng vng lp in ra cc s t 1 n 10 trn mt dng, dng k t tab ('\t') ngn cch gia cc s. 5. Vit mt chng trnh tnh tng cc s nguyn t 1 n 10, s dng vng while cho nhim v lp. 6. Vit mt chng trnh tnh tng cc s nguyn t 1 n 10, s dng vng for cho nhim v lp. 7. Vit mt chng trnh tnh tng cc s nguyn t 1 n 10, s dng vng dowhile cho nhim v lp. 8. Tm kt qu hin th ca chng trnh sau:

9. Sp xp li cc dng m sau y thnh chng trnh c kt qu hin th nh hnh di. T b sung cc ngoc ng } vo nhng ni thch hp.

10. Vit chng trnh th nghim vic in d liu ra mn hnh bng lnh System.out.printf(), v d: 46

System.out.printf( "Hello, I am %s, I am %d years old.\n", "Bob", 20 );

trong , %s l k hiu nh dng i din cho mt xu k t (trong v d l "Bob") cn %d i din cho mt s kiu int (trong v d l 20). Tnh nng ny c Java 5.0 mn t ngn ng lp trnh C. Chi tit v tnh nng ny xem li Ph lc G Formatted Output ca ti liu [1].

47

Chng 3.

Lp v i tng

Trong chng ny, chng ta s bn su hn v lp v i tng. Cc khi nim hng i tng khc s ln lt l trng tm ca cc chng sau. Chng ny cng ni v cc vn cn bn m ta cn xem xt mi khi thit k mt lp. Nh gii thiu s lc trong chng trc, chng trnh Java khi chy l mt tp hp cc i tng, chng c yu cu thc hin dch v v yu cu dch v ca cc i tng khc. Mt i tng c to ra t mt lp c gi l mt thc th (instance) ca lp . Ta c th coi "thc th" l mt cch gi khc ca "i tng". Lp l khun mu t to ra cc thc th. Vy nn, khi thit k mt lp, ta cn ngh n nhng i tng s c to ra t lp . C hai loi thng tin quan trng v mi i tng: Nhng thng tin m i tng bit. Nhng vic m i tng lm.

Hnh 3.1: Hai loi thng tin quan trng v i tng.

Nhng g m mt i tng bit v bn thn n c gi l cc bin thc th (instance variable) hay thuc tnh thc th (instance attribute). Chng biu din trng thi (state) ca i tng hay cn gi l d liu ca i tng, cc i tng khc nhau thuc cng loi c th c cc gi tr khc nhau cho cc bin thc th. Cc bin thc th c th l bin thuc mt trong nhng kiu d liu c bn (int, boolean, float...) hoc l tham chiu ti i tng thuc mt lp no . Nhng g mt i tng c th lm c gi l cc phng thc (method). Cc phng thc c thit k thao tc trn d liu ca i tng. Mt i tng thng c cc phng thc c v ghi gi tr cho cc bin thc th. V d, mt i tng ng h bo thc c mt bin thc th lu thi gian cn bo thc, v hai phng thc t v ly gi bo thc. Tm li, i tng c cc bin thc th v cc phng thc, cc bin thc th v cc phng thc ny c nh ngha trong thit k ca lp. Cng vic vit chng trnh l vit cc nh ngha lp. nh ngha lp m t v cc thnh phn m mi 48

thc th ca n s cha, c th l d liu ca mi thc th v cc phng thc cho php truy nhp v sa i d liu . Mt lp khng phi l mt i tng, n l mt khun mu dng to nn i tng. N m t cch to mt i tng thuc kiu c th . Mi i tng to ra t mt lp c th c cc gi tr ring cho cc bin thc th. V d, ta c th dng lp BankAccount to ra nhiu i tng ti khon ngn hng, mi ti khon c mt ch ti khon, mt s ti khon, v mt s d ring; mi ti khon u c th lm nhng vic ging nhau (rt tin, gi tin, ng ti khon), tuy ch bit nhng g ch c ti khon c th . 3.1. TO V S DNG I TNG Vy lm th no to v s dng mt i tng? Ta cn n hai lp. Mt lp dnh cho kiu i tng m ta mun to (BankAccount, Dog, Cow, AlarmClock, AddressBookEntry,...) v mt lp khc th nghim lp . Lp th nghim l chng trnh, ni ta t phng thc main, v ti phng thc main , ta to v s dng cc i tng thuc lp va xy dng. Lp th nghim ch c mt nhim v duy nht: chy th cc bin v phng thc ca lp i tng mi.

Hnh 3.2. Lp Cow v lp th nghim CowTestDrive

T y, trong nhiu v d, ta s dng hai lp. Mt l lp nh ngha cc i tng ta mun dng, lp kia l lp th nghim vi tn l <Ci_g_>TestDrive. Chng hn, khi ta xy dng lp Cow, ta s cn thm lp CowTestDrive l chng trnh th nghim lp Cow. Ch c <Ci_g_>TestDrive mi c cha mt phng thc main, vi mc ch to cc i tng thuc lp <Ci_g_>, ri truy nhp cc phng thc v bin ca cc i tng . V d trong Hnh 3.2 dng hai lp Cow

49

v CowTestDrive minh ha cch xy dng mt lp mi v th nghim cc i tng thuc lp . Chng trnh CowTestDrive th nghim lp Cow bng cch to mt i tng c thuc lp ny (lnh Cow c = new Cow()), sau dng ton t du chm (.) truy nhp cc bin thc th v gi phng thc ca i tng. C th, lnh c.age = 2 gn gi tr 2 cho bin thc th age ca c, cn c.moo() kch hot phng thc moo() ca c.
4

ci t mt lp, vic vit mt lp th nghim km theo khng phi l bc bt buc. Tuy nhin, l cng vic cn thit m bo rng lp c ci t ng v hot ng nh mong mun ca ngi thit k.

Hnh 3.3. Lp PhoneBookEntry v lp th nghim.

V d trong Hnh 3.3 tng t vi v d trong Hnh 3.2. Phng thc main y to hai i tng thuc lp PhoneBookEntry, gn gi tr cho cc bin thc th ca chng v gi phng thc display() cho tng i tng. rng hai i tng tom v jerry c cc b bin name v phone c lp vi nhau, tuy rng chng trng tn.

y ta tm gi l "i tng c". Trong nhiu ng cnh, ngi ta cng quen gi l "i tng

c". Tuy nhin, c bn cht khng phi l i tng m ch l tham chiu i tng. Chng 4 s bn chi tit v khi nim tham chiu i tng.

50

3.2. TNG TC GIA CC I TNG Nh ni n trong cc phn trc, phng thc main phc v hai mc tiu s dng: (1) th nghim cc lp ci; (2) khi ng ng dng Java. Khi trong cc phng thc main ni trn, ta khng thc s mi trng hng i tng, main ch to v chy th cc i tng. Trong khi , mt ng dng hng i tng thc th, cc i tng phi "ni chuyn" vi nhau. Mt ng dng hng i tng ni chung v ng dng Java ni ring thc cht l cc i tng ni chuyn vi nhau. "Ni chuyn" y c ngha rng cc i tng gi cc phng thc ca nhau. Ti cc v d trc, ta c cc lp TestDrive to i tng cc lp khc v chy th cc phng thc ca chng. Ti Ch-ng 5, ta s c v d m phng thc main to cc i tng ri th cho chng tng tc vi nhau. Tm thi, ta dng mt v d nh v tr chi on s c mt cht phc ha v hot ng ca mt ng dng hng i tng thc th. Do ta vn ang giai on lm quen vi Java, chng trnh v d ny hi ln xn v khng hiu qu, ta s ci tin n nhng chng sau. Nu c nhng on m kh hiu, ta hy tm b qua, v im quan trng ca v d ny l cc i tng ni chuyn vi nhau. Tr chi on s bao gm mt i tng game v ba i tng player. i tng game sinh ngu nhin mt s trong on t 0 n 9, ba player ln lt th on s . Chng trnh bao gm ba lp: GameLauncher, GuessGame, v Player L-gic chng trnh: GameLauncher l ni ng dng bt u chy. Lp ny c phng thc main(). Phng thc main() to mt i tng GuessGame c to v chy phng thc startGame() ca n. Phng thc startGame() ca i tng GuessGame l ni ton b vn chi xy ra. N to ra ba u th (player), ri "ba" ra mt s ngu nhin (ci m cc u th cn on). Sau , n yu cu tng u th on, kim tra kt qu, v in ra thng tin v (cc) u th thng cuc hoc yu cu c ba on li.

51

Hnh 3.4. Ba lp ca chng trnh on s.

Ni dung y ca m ngun cc lp GameLauncher, GuessGame v Player c cho trong Hnh 3.5 v Hnh 3.6.

52

public class GuessGame { Player p1; GuessGame c 3 bin thc th Player p2; dnh cho 3 i tng Player Player p3; public void startGame() { gn cho 3 bin thc th p1 = new Player(); p2 = new Player(); khai bo 3 bin lu 3 gi tr m 3 u th on p3 = new Player(); int guessp1 = 0; khai bo 3 bin lu gi tr ng/sai int guessp2 = 0; int guessp3 = 0; ty theo cu tr li ca cc u th boolean p1isRight = false; boolean p2isRight = false; sinh 1 s 3 u th on boolean p3isRight = false; int targetNumber = (int) (Math.random() * 10); System.out.println("I'm thinking of a number between 0 and 9..."); while(true) { System.out.println("Number to guess is " + targetNumber); p1.guess(); p2.guess(); p3.guess();

to 3 i tng Player v

yu cu tng u th on (gi phng thc guess()) ly kt qu on ca tng u th

guessp1 = p1.number; System.out.println("Player one guessed " + guessp1); guessp2 = p2.number; System.out.println("Player two guessed " + guessp2); guessp3 = p3.number; System.out.println("Player three guessed " + guessp3); if (guessp1 p1isRight } if (guessp2 p2isRight } if (guessp3 p3isRight } == targetNumber) { = true; == targetNumber) { = true; == targetNumber) { = true;

Kim tra tng ngi xem on ng khng, nu ng th t bin ca ngi v true. Nh rng ta t gi tr mc nh ca cc bin l false

if (p1isRight || p2isRight || p3isRight) ( || l ton t HOC ) { System.out.println("We have a winner!"); System.out.println("Player one got it right? " + p1isRight); System.out.println("Player two got it right? " + p2isRight); System.out.println("Player three got it right? " + p3isRight); System.out.println("Game is over"); break; } nu khng th lp li else vic yu cu on s { System.out.println("Players will have to try again."); } } } }

nu c t nht 1 ngi on ng

Hnh 3.5: M ngun GuessGame.java.

53

Hnh 3.6: Player.java v GameLauncher.java

Nhng im quan trng: Tt c m Java u nm trong mt lp no . Mt lp c t cch to mt i tng thuc lp . Mt lp ging nh mt bn thit k Mt i tng c th t lo cho bn thn, ta khng phi cn bit hay quan tm mt i tng lm vic nh th no. Mt i tng bit v mt s th v c th lm mt s vic. Nhng g mt i tng bit v chnh n c gi l cc bin thc th (thuc tnh) ca n. Chng i din cho trng thi ca i tng . Nhng g mt i tng c th lm c gi l cc phng thc. Chng i din cho hnh vi ca i tng . Khi vit mt lp, ta c th mun vit mt lp khc test. Ti ta to cc i tng thuc lp kia v th nghim vi chng. Ti thi gian chy, mt chng trnh Java chnh l mt nhm cc i tng ang "ni chuyn" vi nhau.

54

Bi tp
1. in vo ch trng cc t thch hp (lp, i tng, phng thc, bin thc th): _____________ c bin dch t mt file .java. _____________ ng vai tr nh mt khun mu. _____________ thc hin cc cng vic. _____________ c th c nhiu phng thc. _____________ biu din 'trng thi' _____________ c cc hnh vi. _____________ c t trong cc i tng. _____________ c dng to cc thc th i tng. _____________ c th thay i khi chng trnh chy _____________ c cc phng thc. 2. Tm v sa li ca cc chng trnh sau (mi phn l ni dung ca mt file m ngun hon chnh). a)

b)

55

56

Chng 4.

Bin v cc kiu d liu

Trong cc v d cc chng trc, ta gp cc bin c s dng hai mi trng: (1) bin thc th l trng thi ca i tng, v (2) bin a phng l bin c khai bo bn trong mt phng thc. Sau ny, ta s dng bin dng i s (cc gi tr c truyn vo trong phng thc bi li gi phng thc), v dng gi tr tr v (gi tr do phng thc tr v cho ni gi n). Ta gp cc bin c khai bo vi kiu d liu c bn, v d kiu int, v cc bin c khai bo thuc kiu i tng nh String, Cow, PhoneBookAddress. Trong chng ny, ta s m t k v cc loi bin ca Java, cch khai bo v s dng bin. Java l ngn ng nh kiu mnh (strongly-typed language). Ngha l, bin no cng c kiu d liu xc nh v phi c khai bo trc khi s dng. Trnh bin dch khng cho php gn mt gi tr kiu Cow vo mt bin kiu String, chuyn g xy ra nu ta gi phng thc length() ca bin String ly di xu k t? Java cng khng cho php gn mt gi tr kiu s thc vi du chm ng (chng hn float) vo mt bin kiu s nguyn (chng hn int), trnh bin dch s pht hin v bo li. Ta phi dng php i kiu mt cch tng minh lm vic ny, bit rng vic c th lm gim chnh xc ca gi tr. Cc kiu d liu ca Java c chia thnh hai loi: d liu c bn (primitive) v tham chiu i tng (object reference). Cc kiu d liu c bn dnh cho cc gi tr c bn nh cc s hay cc k t. V d nh cc kiu char (k t), int. Cn cc tham chiu i tng l cc tham chiu ti i tng. Nghe c v khng r rng hn c cht no, nhng ta s quay li khi nim "tham chiu" ny sau (nu ta bit v C/C++ th khi nim ny gn ging vi con tr ti i tng). Nhng d thuc loi d liu no, mi bin u cn c mt ci tn v thuc mt kiu d liu c th. Khi ta ni mt i tng thuc lp X, iu cng c rng i tng thuc kiu d liu X.

57

Hnh 4.1. Mi bin cn c mt kiu d liu v mt ci tn

4.1. BIN V CC KIU D LIU C BN Trc ht, ta bn v cc kiu d liu c bn. Bin thuc mt kiu d liu c bn c kch thc c nh ty theo l kiu d liu g (xem Bng 4.1 lit k cc kiu d liu c bn ca Java).
Kiu char boolean short int long float M t k t n (Unicode) gi tr boolean s nguyn s nguyn s nguyn s thc du phy ng s thc du phy ng Kch thc 2 byte 1 bit 2 byte 4 byte 8 byte 4 Khong gi tr tt c cc gi tr Unicode t 0 n 65.535 true hoc false -32.767 n 32.767 -2.147.483.648 ti 2.147.483.647 -9.223.372.036.854.775.808 ti 9.223.372.036.854.775.808 +/- 1,4023x10-45 ti 3,4028x1038 +/- 4,9406x10-324 ti 1,7977x10308

double

Bng 4.1: Cc kiu d liu c bn ca Java.

Ti mi thi im, bin lu tr mt gi tr. Khi gn mt gi tr khc cho bin , gi tr mi s thay th cho gi tr c (b ghi ). Ta c th dng php gn ghi gi tr mi cho mt bin theo nhiu cch, trong c: dng mt gi tr trc tip sau du gn. V d:
x = 10; isCrazy = true; bloodType = 'A';

ly gi tr ca bin khc. V d:
x = y;

kt hp hai cch trn trong mt biu thc. V d:


x = y + 1;

Thng thng, ta khng th ghi mt gi tr kch thc ln vo mt bin thuc kiu d liu nh. Trnh bin dch s bo li nu pht hin ra. V d: 58

int x = 10; byte b = x;

// compile error!

Tuy rng r rng 10 l mt gi tr b lu trong mt bin kiu byte, nhng trnh bin dch khng quan tm n gi tr, n ch bit rng ta ang c ly ni dung ca mt bin kiu int vi kch thc ln hn ghi vo mt bin kiu byte vi kch thc nh hn. Nh thy ti cc v d trc, bin thuc cc kiu d liu c bn c gi n bng tn ca n. V d sau lnh khai bo int a; ta c mt bin kiu int c tn l a, mi khi cn thao tc vi bin ny, ta dng tn a ch nh bin , v d a = 5;. Vy c nhng quy tc g lin quan n tn bin? nh danh (identifier) l thut ng ch tn (tn bin, tn hm, tn lp...). Java quy nh nh danh l mt chui k t vit lin nhau, (bao gm cc ch ci a..z, A..Z, ch s 0..9, du gch chn _). nh danh khng c bt u bng ch s v khng c trng vi cc t kha (keyword). T kha l t mang ngha c bit ca ngn ng lp trnh, chng hn ta gp cc t kha ca Java nh public, static, void, int, byte... Lu , Java phn bit ch ci hoa v ch ci thng. Cch t tn bin tun th theo cch t tn nh danh. Tn bin nn d c, v gi nh n cng dng ca bin hay kiu d liu m bin s lu tr. V d, nu cn dng mt bin lu s lng qu to, ta c th t tn l totalApples. Khng nn s dng cc tn bin ch gm mt k t v khng c ngha nh a hay b. Theo thng l, tn lp bt u bng mt ch vit ha (v d String), tn bin bt u bng ch vit thng (v d totalApples); cc tn cu to t nhiu t n, cc t t th hai tr i c vit hoa "tch" nhau. 4.2. THAM CHIU I TNG V I TNG Bin kiu c bn ch lu cc gi tr c bn. Vy cn cc i tng th sao? Thc ra, trong Java khng c khi nim bin i tng, m ch c bin tham chiu i tng. Mt bin tham chiu i tng lu tr cc bit i din cho mt cch truy nhp ti mt i tng. Bin tham chiu khng lu tr chnh i tng . C th ni rng n lu ci g ging nh mt con tr, hay a ch ca i tng trong b nh my tnh. Ta khng bit chnh xc gi tr l ci g. Ch cn bit rng gi tr i din cho mt v ch mt i tng, v rng my o Java bit cch dng tham chiu truy nhp i tng. Ni cch khc, v bn cht, cc bin kiu c bn hay cc bin tham chiu u l cc nh cha y cc bit 0 v 1. S phn bit gia hai loi bin ny nm ngha ca cc bit . i vi mt bin kiu c bn, cc bit ca n biu din gi tr thc ca bin. Cn cc bit ca bin tham chiu biu din cch truy nhp ti mt i tng. Nh li v d trong Hnh 3.2, vi cc lnh
Cow c = new Cow();

59

c.moo();

Ta c th coi bin tham chiu c nh l mt ci iu khin t xa ca i tng b c sinh ra t lnh new Cow(). Ta dng ci iu khin km vi ton t du chm (.) yu cu con b rng ln mt hi (bm nt "moo" ca ci iu khin t xa kch hot phng thc moo() ca i tng). Tng t nh vy, ta ly v d:
String s1 = new String("Hello, "); System.out.println(s1.length());

Ta c s1 l bin tham chiu kiu String. N c chiu ti i tng kiu String c to ra bi biu thc new String("Hello, "). Ti y, i tng kiu String va to khng c tn, s1 khng phi tn ca n m l tham chiu hin ang chiu ti i tng v l cch duy nht tng tc vi n. Ta gi hm length() ca i tng ly di ca n bng cch dng tham chiu s1 trong biu thc s1.length(). Nhn mnh, mt bin tham chiu i tng khng phi l mt i tng, n ch ng vai tr nh mt con tr ti mt i tng no . Tuy rng, trong ngn ng thng thng, ta hay dng cc cch ni nh "Ta truyn i tng kiu String s1 vo cho phng thc System.out.println()" hay "Ta to mt i tng Cow mi vi tn c ", s1 hay c khng phi tn ca cc i tng , chng ch l cc tham chiu. Thc cht, cc i tng khng c tn, chng cng khng nm trong bin no. Trong Java, cc i tng c to ra u nm trong b nh heap. Hnh 4.2 minh ha quan h gia bin s v i tng kiu String5 m n chiu ti. C th, ti v d ang xt, s v i tng n chiu ti nm ti hai loi b nh khc nhau: i tng xu "Hello" nm trong heap, cn bin s nm trong vng b nh stack dnh cho cc bin a phng ca hm main(). S khc bit v v tr ca hai d liu ny dn n di cuc i ca chng. Mt bin tham chiu l bin a phng ca mt hm s kt thc s tn ti ca mnh sau khi hm kt thc. Cn i tng c to ra t bn trong hm vn tip tc tn ti cho n khi no c my o Java gii phng sau khi i tng khng cn c dng n na.

T nay, "i tng kiu X", vi X l mt lp, s c vit ngn gn thnh "i tng X".

60

Hnh 4.2. Bin tham chiu s v i tng kiu String

Vi dng lnh String s = new String("Hello"); nh trong Hnh 4.2, c ba bc khai bo, to v gn i tng v tham chiu i tng. Bc 1, String s, khai bo mt bin tham chiu c kiu c nh l String v c t tn l s. Bc 2, new String("Hello"), yu cu my o Java cp pht b nh cho mt i tng String mi, t ti heap, vi d liu khi to l xu "Hello". Bc 3, =, l php gn gn bin tham chiu s vi i tng String va to, t nay c th dng s lm mt ci iu khin t xa i vi i tng . Tham chiu null l tham chiu ang nhn gi tr null khng chiu ti mt i tng no ht. Nu chng trnh truy nhp bin thc th hoc gi phng thc t mt tham chiu null, ngha l khng c i tng no truy nhp cc bin thc th hoc gi phng thc ca n, khi thc thi n lnh , chng trnh s sp v gp li NullPointerException (con tr null). Cn cn thn trnh li ny bng cch kim tra tham chiu null trc khi truy nhp i tng qua tham chiu . i vi mt i tng, li gi lnh new nh trong bc 2 l giai on m u. Trc khi ta c th lm bt c vic g i vi mt i tng mi, n phi c khi to, ngha l cc bin thc th ca n phi c gn gi tr ban u. Khi ta dng lnh new, Java thc hin t ng cng vic ny bng cch gi mt phng thc c bit c gi l hm khi to (constructor). Phng thc ny khng tr v gi tr no v c tn trng vi tn lp. Mt lp c th c nhiu hn mt hm khi to vi danh sch tham s khc nhau. Trnh bin dch s da vo danh sch i s ti li gi new gi hm khi to tng ng. Chi tit v hm khi to c ni n trong mc 9.2. i tng mi c to s tn ti trong b nh chng no ta cn c mt tham chiu no chiu ti n. Khi mt i tng khng cn mt tham chiu no chiu ti, ta khng c cch no s dng i tng na. V d nh trong Hnh 4.3, sau khi ta chiu bin c2 n ch khc, ta mt hon ton 'lin lc' i vi vi i tng Cow th hai. Ni cch khc, n b b ri v do s c b phn dn rc (garbage collector) ca my o Java thu hi ti s dng vng b nh m n chim gi. Chi tit v ni dung ny c ni n trong Ch-ng 9.

61

Cow c1 = new Cow(); Cow c2 = new Cow();

:Cow c1
Cow i tng Cow

:Cow c2
Cow i tng Cow

c2 = c1;

:Cow c1
Cow i tng Cow

:Cow c2
Cow i tng sp b thu hi v gii phng

Hnh 4.3. i tng s b thu hi khi khng cn bin tham chiu no gn vi n.

4.3. PHP GN Cng nh ta c th gn mt gi tr mi cho mt bin kiu c bn, ta cng c th dng php gn chiu mt bin tham chiu ti mt i tng khc khi cn, min l i tng phi thuc cng kiu. Th hin ng bn cht ca tham chiu i tng, v hot ng sao chp ni dung ca php gn, php gn xy ra gia hai bin tham chiu khng c tc dng sao chp ni dung ca i tng ny sang i tng khc. Php gn ch sao chp chui bit ca bin tham chiu ny sang bin tham chiu kia. Kt qu l bin tham chiu v tri c tr ti i tng m bin/biu thc tham chiu ti v bn phi ang chiu ti. Hnh 4.4 minh ha kt qu ca mt php gn bin tham chiu. Bin String s2 sau khi nhn gi tr ca s th chiu ti cng mt i tng String m s khi ang chiu ti. Php gn i vi cc bin tham chiu khng to ra mt bn sao ca i tng. Vy nu ta mun sao chp ni dung i tng th lm th no? Vn ny s c ni n trong Ch-ng 9.

62

Hnh 4.4. Php gn i vi bin tham chiu.

4.4. CC PHP SO SNH Cng tng t nh php gn, cc php so snh == v != i vi cc bin tham chiu so snh chui bit nm trong cc bin . Ta bit rng chui bit ca hai tham chiu s ging ht nhau nu chng cng chiu ti mt i tng. Ni cch khc, so snh hai bin tham chiu l kim tra xem chng c tr ti cng mt i tng hay khng. Cc php so snh tham chiu khng h so snh ni dung i tng m tham chiu chiu ti. Trong v d Hnh 4.5, c1 v c3 bng nhau v chng chiu ti cng mt i tng. Cn c1 v c2 khc nhau v chng chiu ti hai i tng nm ti hai ch khc nhau trong b nh, bt k hai i tng c "ging nhau" v ni dung hay khng.
c1 == c3 is true c1 == c2 is false

:Cow
name = "Daisy" i tng Cow

c1
Cow

:Cow
name = "Daisy" i tng Cow Cow

c2

c3
Co w

Hnh 4.5. So snh tham chiu.

Cc php so snh ln hn, nh hn khng c ngha v khng th dng cho cc kiu tham chiu i tng. so snh ni dung ca cc i tng, ta c nhng cch khc s c bn n trong nhng chng sau (cc mc 8.5 v 13.5).

63

4.5. MNG V mt hnh tng, mng (array) l mt chui cc bin thuc cng mt loi c nh s th t. V d mt mng int kch thc 5 l mt chui lin tc 5 bin kiu int c nh s th t t 0 ti 4. Mt mng Java thc cht l mt i tng. Mt bin mng l tham chiu ti mt i tng mng. V d:
int[] nums; nums = new int[5]; nums[3] = 2;

Lnh th nht khai bo bin tham chiu nums kiu mng int (int[]). N s l ci iu khiu t xa ca mt i tng mng. Lnh th hai to mt mng int vi di 5 v gn n vi bin nums c khai bo trc . Lnh th ba gn gi tr 2 cho phn t c ch s 3 trong mng.

Hnh 4.6. Tham chiu v i tng mng int.

V d trn minh ha mng gm cc phn t kiu c bn. Mi phn t mng kiu int l mt bin kiu int. Vy cn mng Cow hay mng String th sao? Cng y ht nh vy, mng Cow cha cc bin kiu Cow, ngha l cc tham chiu i tng Cow (ci iu khin t xa ch khng phi bn thn i tng Cow).
i tng Cow i tng Cow

Cow[] cows; cows = new Cow[5]; cows[0] = ne w Co w(); cows[1] = ne w Co w();

:Cow

:Cow

0 cows Cow[]
Co w

1
Co w

2
Cow

3
Cow

4
Co w

i tng mng Cow (Cow[])

Hnh 4.7. Tham chiu v i tng mng Cow.

Tm li, mng c th c khai bo cha cc phn t thuc kiu c bn hoc kiu tham chiu i tng. Ty theo mng c khai bo kiu d liu g th cha cc phn t l bin thuc kiu d liu . Tuy nhin, d cc phn t thuc kiu c bn hay tham chiu i tng th bn thn mi mng l mt i tng, v bin mng l tham chiu ti i tng mng. 64

Thao tc i vi cc phn t mng kiu Cow c khc g vi vic thao tc mt bin kiu Cow? Ta cng dng ton t (.) nh bnh thng, nhng v phn t mng khng c tn bin, thay vo , ta dng k hiu phn t ca mng. V d, vi lp Cow c nh ngha nh trong Hnh 4.8, ta dng cc tham chiu mng thao tc vi cc phn t mng Cow nh trong Hnh 4.9.

Hnh 4.8: Cow.java

public class CowArrayDemo { public static void main(String[] args) { Cow cow1 = new Cow(); cow1.moo(); %>java CowArrayDemo cow1.name = "Lazy"; Cow[] myCows = new Cow[3]; myCows[0] = new Cow(); myCows[1] = new Cow(); myCows[2] = cow1; myCows[0].name = "Daisy"; myCows[1].name = "Lady"; System.out.print("last cow's name is "); System.out.println(myCows[2].name); int x = 0; while (x < myCows.length) { myCows[x].moo(); x = x+1; } } }
Hnh 4.9: CowArrayTest.java
null says Moooo... last cow's name is Lazy Daisy says Moooo... Lady says Moooo... Lazy says Moooo...

Mng c mt bin 'length' cho ta bit s phn t ca mng

Ta thng dng vng for duyt cc phn t ca mt mng. V d, on m duyt mng myCows v in ra tn ca tng con b trong c th c vit nh sau:

65

Ngoi c php thng dng nh trn, vng for duyt mng cn c mt cch vit ngn gn hn, l vng for-each. V d, ta c th vit li vng for trn nh di y:

Trong , ta khai bo bin chy aCow l bin kiu Cow, bin chy s chy t u n cui mng myCows, mi ln li ly gi tr bng gi tr ca phn t hin ti trong mng (trong v d ny, gi tr l mt tham chiu ti mt i tng Cow). Vng for-each c th p dng cho mng thuc kiu d liu tham chiu cng nh kiu c bn, ngoi ra cn dng c cho cc cu trc collection ca th vin Java m ta s ni n trong Ch-ng 13.

66

Bi tp
1. in t thch hp vo ch trng trong mi cu sau: a) Bin thc th thuc cc kiu char, byte, short, int, long, float, v double u c gi tr mc nh l _________. b) Bin thc th thuc kiu boolean c gi tr mc nh l ________. c) Cc kiu d liu trong Java c phn thnh hai loi: cc kiu _________ v cc kiu ____________. 2. Cc pht biu sau y ng hay sai? a) C th gi phng thc t mt bin kiu c bn. b) Cc i tng c to ra u tn ti trong b nh heap cho n khi chng trnh kt thc c) Lc no mt i tng thuc din dng c cng cn phi c mt tham chiu chiu ti n. d) Cc gi tr c dng du chm ng trong m ngun c hiu mc nh l cc gi tr trc tip du chm ng thuc kiu float. 3. Bin thc th dng lm g? 4. Tham s ca phng thc main() l mt mng String. Mng ny l danh sch cc tham s dng lnh khi ta chy chng trnh. V d, khi chy lnh java CowArrayDemo foo bar t du nhc ca s lnh. Mng args[] s cha cc xu k t foo v bar. Hy vit mt chng trnh in ra mn hnh tt c cc tham s dng lnh nhn c. 5. Tm v sa li ca cc chng trnh sau (mi phn l mt file m ngun hon chnh).

67

a)

b)

6. Cho chng trnh sau, lit k cc i tng HeapQuiz c to ra; hi n on //do stuff th cc phn t mng hq[0] cho ti hq[4] chiu ti cc i tng no. 68

7. Dn nh T v Su gip vit nhanh mt on m x l danh b in thoi cho in thoi di ng, ngi no c gii php tt hn s c tr cng l mt ti bng ng. Sau khi nghe Dn m t, Su vit ln bng on m sau:

T nhn qua ri ci "in thoi di ng b nh b t m cu hoang ph qu!". Ni on, T vit:

Vit xong, T h h "Bng ng l ca t ri!". Dn ci "Tit kim b nh hn tht, nhng cu phi n k Su thi." Ti sao Dn li quyt nh nh vy?

69

Chng 5.

Hnh vi ca i tng

Trng thi nh hng n hnh vi, hnh vi nh hng n trng thi. Ta bit rng i tng c trng thi v hnh vi, chng c biu din bi cc bin thc th v cc phng thc. Ta cng bit rng mi thc th ca mt lp (mi i tng thuc mt lp) c cc gi tr ring cho cc bin thc th. Chng hn i tng Cow ny c tn (name) l "Lady" v nng (weight) 80 kg, trong khi mt i tng Cow khc tn l "Daisy" v nng 150kg. Hai i tng thc hin phng thc moo() c khc nhau hay khng? C th, v mi i tng c hnh vi th hin ty theo trng thi ca n. Ni cch khc, phng thc gi t i tng no s s dng gi tr ca cc bin thc th ca i tng . Chng ny s xem xt mi quan h tng h ny. 5.1. PHNG THC V TRNG THI I TNG Nh li rng lp l khun mu to ra cc i tng thuc lp . Khi ta vit mt lp, ta m t cch xy dng mt i tng thuc lp . Ta bit rng gi tr ca cng mt bin thc th ca cc i tng khc nhau c th khc nhau. Nhng cn cc phng thc th sao? Chng c hot ng khc nhau hay khng? i loi l c. Mi thc th ca mt lp u c chung cc phng thc, nhng cc phng thc ny c th hot ng khc nhau ty theo gi tr c th ca cc bin thc th. V d, lp PhoneBookEntry c hai bin thc th, name v phone. Phng thc display() hin th ni dung ca i tng PhoneBookEntry, c th l gi tr ca name v phone ca i tng . Cc i tng khc nhau c cc gi tr khc nhau cho hai bin , nn ni dung c display() hin th cho cc i tng cng khc nhau. tom.display()
Name: Tom the Cat Phone: 84208594

jerry.display()

Name: Jerry the Mouse Phone: 98768065

Xem li v d trong Hnh 3.3, ta s thy cc li gi phng thc display() t tom v jerry hin ra kt qu khc nhau trn mn hnh, tuy rng m ngun ca display() cho tom hay jerry u l mt:

70

Thc cht, ni dung trn ca display() tng ng cch vit nh sau:

Trong , this l t kha c ngha l mt tham chiu c bit chiu ti i tng ch ca phng thc hin hnh. Chng hn, i vi li gi tom.display(), this c gi tr bng gi tr ca tham chiu tom; i vi li gi jerry.display(), this c gi tr bng jerry. C th ni rng khi gi mt phng thc i vi mt i tng, tham chiu ti i tng c truyn vo phng thc ti mt tham s n: tham chiu this. Tham chiu this c th c dng truy cp bin thc th hoc gi phng thc i vi i tng hin hnh. Thng thng, cng dng ny ca this ch c ch khi tn bin thc th b trng vi mt bin a phng hoc tham s ca phng thc. Chng hn, gi s phng thc setName() ca lp PhoneBookEntry ly mt tham s name kiu String trng tn vi bin thc th name ca lp . T trong phng thc setName(), nu dng tn 'name' th trnh bin dch s hiu l ta ang ni n tham s name. gi n bin thc th name, cch duy nht l s dng tham chiu this gi mt cch tng minh. V d nh sau:

5.2. TRUYN THAM S V GI TR TR V Cng nh trong cc ngn ng lp trnh khc, ta c th truyn cc gi tr vo trong phng thc. V d, ta mun ch th cho mt i tng Cow v s ln rng cn thc hin bng cch gi phng thc nh sau:
c.moo(3);

Ta gi i s (argument) l nhng g ta truyn vo trong phng thc. i vi Java, i s l mt gi tr, chng hn 3 nh trong li gi trn, hoc "Hello" nh trong System.out.println("Hello"), hoc gi tr ca mt tham chiu ti mt i tng Cow. Khi li gi phng thc c thc thi, gi tr i s c chp vo mt tham s. Tham s (parameter) thc cht ch l mt bin a phng ca phng thc mt bin c mt ci tn v mt kiu d liu, n c th c s dng bn trong thn ca phng thc.

71

(1) Gi phng thc moo t tham chiu Cow v truyn gi tr 3 vo phng thc di dng i s 00000011 tham s

Cow c = new Cow(); c.moo(3);


i s

(2) gi tr i s 3 c chp vo tham s numOfMoos

void moo(int numOfMoos) { while (numOfMoos > 0) { System.out.println("Moo..."); numOfMoos = numOfMoos 1; } }

(3) tham s numOfMoos c dng nh mt bin a phng trong phng thc

Hnh 5.1: i s v tham s.

iu quan trng cn nh: Nu mt phng thc yu cu mt tham s, ta phi truyn cho n mt gi tr no , v gi tr phi thuc ng kiu c khai bo ca tham s. Phng thc c th c nhiu tham s. Khi khai bo, ta dng du phy tch gia chng. V khi gi hm, ta phi truyn cc i s thuc ng kiu d liu v theo ng th t khai bo.

Hnh 5.2: Phng thc c th c nhiu tham s.

Phng thc c th tr v gi tr. Mi phng thc c khai bo vi mt kiu tr v, nhng cho n nay, cc phng thc v d ca ta vn dng kiu tr v l void, ngha l chng khng tr v ci g.
void doSomething() { }

Ta c th khai bo phng thc tr v cho ni gi n mt loi gi tr c th, chng hn:


int giveSecret() { return 3; }

Phng thc khai bo s tr v gi tr thuc kiu d liu g th phi tr v gi tr thuc kiu . (Hoc mt gi tr thuc mt kiu tng thch vi kiu khai bo. Ta s bn chi tit v im ny khi ni v a hnh Ch-ng 5.) 72

Hnh 5.3: V d v gi tr tr v t phng thc

Nh ni n mc trc, this l tham chiu ti i tng hin hnh. Do , nu mt phng thc cn tr v tham chiu ti i tng hin hnh, n dng lnh return this;. Tham chiu this cng c th c dng lm i s nu ta cn truyn cho mt phng thc mt tham chiu ti i tng hin hnh. Chng hn, t bn trong mt phng thc ca lp Square, i tng hnh vung hin hnh yu cu mt i tng ha myGraphics dng li gi myGraphics.draw(this); v chnh hnh vung , trong , this l phng tin i tng lp Square truyn tham chiu ti chnh mnh vo cho phng thc draw(). Hay mt v d khc l lp MyInteger trong Hnh 5.4. V d ny minh ha cc cng dng ca tham chiu this. Mt im ng ch trong v d ny l phng thc increment() tr v tham chiu ti chnh i tng ch, iu ny cho php gi phng thc ny thnh chui nh trong phn m v d s dng lp MyInteger.

Hnh 5.4: Cc cng dng ca tham chiu this trong phng thc.

5.3. C CH TRUYN BNG GI TR Ngn ng lp trnh s dng duy nht mt c ch truyn tham s: truyn bng gi tr (pass-by-value). Khi mt i s c truyn vo mt phng thc, ch c gi 73

tr ca n c chp vo tham s tng ng. K t , cc thao tc lin quan ca phng thc ch c thc hin trn tham s thc cht l bin a phng ca phng thc. Cn bn thn i s khng chu nh hng g ca phng thc c gi.
Cow c = new Cow(); int moos = 3; c.moo(moos); System.out.println(moos);

gi tr ca i s moos c chp vo tham s numOfMoos

void moo(int numOfMoos) { Moo...Moo...Moo while (numOfMoos > 0) { 3 System.out.println("Moo..."); numOfMoos = numOfMoos 1; } tham s numOfMoos b gim dn bn trong moo(), } cn i s moos vn gi nguyn gi tr c (3)
Hnh 5.5: i s khng chu nh hng ca tham s.

% java SomeTestDrive

C ch truyn bng gi tr hot ng nh th no khi i s l tham chiu i tng? Cng vy thi, gi tr ca i s c chp vo tham s. V gi tr y, nh ta ni v bn cht ca tham chiu, l chui bit biu din cch truy nhp i tng ang c chiu ti. Kt qu ca vic truyn i s l ta c tham s cng l mt tham chiu chiu ti cng mt i tng m i s ang chiu ti. Ta s gp nhiu v d v vic ny trong cc chng sau. Nhng im quan trng: Lp nh ngha nhng g m mt i tng bit v nhng g n c th lm. Nhng g m mt i tng bit l cc bin thc th ca n (trng thi ca i tng) Nhng g mt i tng c th lm l cc phng thc ca n (hnh vi ca i tng) Cc phng thc c th s dng cc bin thc th ca i tng, nh cc i tng thuc cng mt lp c th c hnh x khng ging nhau. Mt phng thc c th c cc tham s. Ta c th truyn cc gi tr vo phng thc qua cc tham s ca phng thc. S lng v kiu d liu ca cc gi tr ta truyn vo phng thc (i s) phi khp vi th t v kiu d liu ca cc tham s c khai bo ca phng thc. Cc gi tr truyn vo phng thc hoc c tr v t phng thc c th c ngm i t kiu hp hn sang kiu rng hn, hoc phi c i tng minh sang kiu hp hn. Cc gi tr dng lm i s c th l mt gi tr trc tip (1, 'd', v.v..) hoc mt bin hay biu thc c gi tr thuc kiu c khai bo cho tham s. 74

Mt phng thc phi c kiu tr v. Kiu tr v void c ngha phng thc khng tr v gi tr g. Nu khng, phng thc phi tr v mt gi tr tng thch vi kiu tr v khai bo.

5.4. NG GI V CC PHNG THC TRUY NHP Cc tham s v gi tr tr v c s dng c lc nht trong cc phng thc c nhim v truy nhp d liu ca i tng. C hai loi phng thc truy nhp: Cc phng thc c d liu ca i tng v tr v d liu c c. Chng thng c t tn l getDLiuG, nn cn c gi l cc phng thc get. Cc phng thc ghi d liu vo cc bin thc th ca i tng, chng nhn d liu mi qua cc tham s ri ghi vo cc bin lin quan. Chng thng c t tn l setDLiuG, nn cn c gi l cc phng thc set. V d nh trong Hnh 5.6
class Cow { String name; int age; void setName(String aName) { name = aName; } String getName() { return name; } void setAge(int anAge) { age = anAge; } int getAge() { return age; } }
Hnh 5.6: Lp Cow vi cc hm c/ghi

Co w
name a ge getNa me() setNa me() getAge() setAge()

Cho n nay, ta l i mt trong nhng nguyn tc quan trng nht ca lp trnh hng i tng, l ng gi v che giu thng tin. Nguyn tc ny ni rng "ng l cu trc d liu bn trong". Trong tt c cc v d t u cun sch n gi, ta l tt c d liu. ' l' y c ngha l t bn ngoi lp c th dng mt tham chiu ti i tng km theo ton t du chm (.) truy nhp bin thc th ca i tng . V d:
theCow.age = 2;

Ni cch khc l ta ang cho php dng tham chiu trc tip sa bin thc th ca i tng. y l cng c nguy him nu t trong tay nhng ai mun ph hoi hoc khng bit dng ng cch. N cho php ngi ta lm nhng vic chng hn nh cho mt i tng Cow c tui l s m: 75

theCow.age = -2;

ngn chn nguy c ny, ta cn ci cc phng thc set cho cc bin thc th v tm cch buc cc on m khc phi gi cc phng thc set thay v truy nhp trc tip n d liu. Khi m bo c rng gi mt phng thc set l cch duy nht sa mt bin thc th, ta c th kim tra tnh hp l ca d liu mi v bo v khng cho php bt c ai gn mt gi tr khng hp l cho bin thc th . V d, trong lp Cow, phng thc setAge() c th bo v tnh hp l ca bin thc th age nh sau:
void setAge(int a) { if (a >= 0) { age = a; } }

Na cng vic cn li, cn lm g che giu d liu, khng cho php cc on m khc dng tham chiu trc tip sa bin thc th? Lm cch no che giu d liu? Quy tc khi u cho vic thc hin ng gi l: nh du cc bin thc th vi t kha private v cung cp cc phng thc public set v get cho bin . Cc t kha private v public quy nh quyn truy nhp ca bin thc th, phng thc, hay lp c khai bo vi t kha . (Ta quen vi t kha public, n i km khai bo ca tt c cc phng thc main.) T kha private c ngha l ring t, c nhn. Trong mt lp, bin thc th / phng thc no c khai bo vi t kha private th ch c m chng trnh bn trong lp mi c quyn truy nhp bin / phng thc . T nay ta s gi cc bin / phng thc c khai bo vi t kha private l bin private / phng thc private. Cn public c ngha l m bt c u u c th truy nhp bin / phng thc . Minh ha lp ProtectedCow trong Hnh 5.7. Ti , bin thc th age c khai bo l bin private, cn hai phng thc get v set tng ng, setAge() v getAge(), c khai bo l phng thc public. Khi ta thnh tho hn trong vic thit k v ci t bng Java, ta c th s lm hi khc, nhng ti thi im ny, quy tc n gin "bin thc th private, get v set public" l la chn an ton.

76

Hnh 5.7: Lp SecuredCow v nguyn tc ng gi

Ngoi vic bo v d liu, ng gi v che giu d liu cn mang li mt li ch khc. l kh nng thay i cu trc bn trong ca mt lp m khng lm nh hng n nhng phn m bn ngoi c s dng n lp . Ti v d trong Hnh 5.8, cu trc bn trong ca lp SecuredCow b sa i. Tui ca b khng c i din bi bin thc th age nh trc m thay vo l bin birthdate lu ngy sinh ca con b. Tui ca b c th c tnh t ngy sinh v ngy thng nm hin ti. Ni dung cc phng thc dng n gi tr tui b cng thay i mt cch tng xng. Trong khi , giao din ca lp SecuredCow vi bn ngoi khng thay i. C th l cc phng thc public vn gi nguyn tn, kiu tr v, v danh sch tham s. iu c ngha rng cc on m dng n SecuredCow t bn ngoi s khng b thay i.

77

Hnh 5.8: Lp SecuredCow vi cu trc bn trong c sa.

Chng trnh ClientProgram di y chy c vi phin bn trc ca SecuredCow v cng chy c vi phin bn mi m khng cn sa i. Bt k chng trnh no khc dng n SecuredCow cng u tip tc hot ng nh khng c thay i g xy ra.

Tnh hung tng t khng xy ra i vi lp Cow khi ta mun i age thnh birthdate hay mt thay i tng t. Cc on m trc tip truy nhp bin age t bn ngoi s khng th chy c sau sa i. Kh nng thay i cu trc bn trong ca mt lp m khng lm nh hng n nhng phn m bn ngoi c s dng n lp cho php ta gim mnh s li pht sinh do sa chng trnh. iu rt c gi tr cho vic pht trin chng trnh mt cch hiu qu. Vic che giu chi tit bn trong ca mt m-un nu c thc hin cng tt th cng lm gim s ph thuc ln nhau gia m-un ny v phn cn li ca h thng. M-un khng phi ph thuc vo vic n phi c bn ngoi s dng ng cch, v n c th t m bo l n khng th b dng sai cch. V d, t bn ngoi lp Cow ch c th sa tui b thng qua setAge(), trong khi setAge() m bo b khng th c tui l s m. Ngc li, phn cn li ca h thng khng phi bit 78

qu nhiu v m-un c th s dng n ng cch. V d, ch cn gi setAge() ch khng trc tip gn gi tr cho bin thc th ca Cow nn khng cn bit Cow dng cch g lu tr tui b, quy tc cho gi tr nh th no. S t ph thuc ln nhau gia cc m-un chng trnh l mt trong nhng c im ca thit k c cht lng tt. 5.5. KHAI BO V KHI TO BIN THC TH Ta bit rng mt lnh khai bo bin thc th c t nht hai phn: tn bin v kiu d liu. V d:
int age; String name;

Ta cn c th khi to (gn mt gi tr u tin) cho bin ngay ti lnh khi to:


int age = 2; String name = "Fido";

Nhng nu ta khng khi to mt bin thc th, chuyn g s xy ra khi ta gi mt phng thc get? Ni cch khc, mt bin thc th c gi tr g trc khi n c khi to? Xem li v d trong Hnh 5.6, age v name c khai bo nhng khng c khi to, vy getAge() v getName() s tr v gi tr g? Cc bin thc th lun c mt gi tr mc nh. Nu ta khng gn gi tr cho mt bin thc th, hoc khng gi mt phng thc set gn tr cho n, n vn c mt gi tr mc nh: 0 nu bin thuc kiu s nguyn, 0.0 nu bin thuc kiu s thc du chm ng, false nu bin thuc kiu boolean, null nu bin l tham chiu.

79

Hnh 5.9: Gi tr mc nh ca bin thc th

V d trong Hnh 5.9 minh ha gi tr mc nh ca hai bin thc th name v age ca lp Cow. Hai bin ny khng c khi to, v gi tr mc nh ca bin age kiu int l 0, cn gi tr mc nh ca name kiu tham chiu l null. Nh rng null c ngha l mt tham chiu khng chiu ti mt i tng no, hay mt ci iu khin t xa khng iu khin ci ti vi no. V d trong Hnh 4.9 chng trc cng minh ha vic c bin tham chiu name ca i tng Cow trc khi n c khi to. 5.6. BIN THC TH V BIN A PHNG Ta gp c bin thc th v bin a phng trong cc v d trc. Mc ny tng kt li cc c im phn bit gia hai loi bin ny. Bin thc th c khai bo bn trong mt lp nhng khng nm trong mt phng thc no. V d a v b trong Hnh 5.10 l bin thc th ca lp Foo. Bin a phng c khai bo bn trong mt phng thc. V d sum v dummy trong Hnh 5.10. Bin a phng phi c khi to trc khi s dng. V d dummy cha c khi to nhng c dng trong lnh sum = a + dummy; s gy li khi bin dch.

80

class Foo { int a = 1; int b;


a l bin thc th cha c public int add() { khi to nhng c gi tr int sum = a + b; mc nh return sum; } public int addThatWontCompile() { int dummy; int sum = a + dummy; li bin dch do dng bin return sum; a phng dummy cha }

c khi to

Hnh 5.10: Bin thc th v bin a phng.

Nh ni, tham s ca mt phng thc cng l bin a phng ca phng thc . N c khi to bng gi tr ca i s c truyn vo phng thc. l cc c im mang tnh cht c php v c th ngn ng. Cn v bn cht khi nim, hai loi bin ny khc hn nhau theo ngha sau: Bin a phng thuc v mt phng thc ni khai bo n. N c sinh ra khi phng thc c gi v dng lnh khai bo n c thc thi. N ht hiu lc khi ra ngoi phm vi kt thc khi lnh khai bo n hoc khi phng thc kt thc. Bin thc th thuc v mt thc th i tng ch ca n. N c to ra khi i tng c to ra v ht hiu lc khi i tng b hy.

81

Bi tp
1. in vo mi ch trng mt hoc vi t trong cc t sau: bin thc th, i s, gi tr tr v, phng thc get, phng thc set, ng gi, public, private, truyn bng gi tr, phng thc. Mt lp c th c s lng ty cc ____________. Mt phng thc ch c th c mt ____________. ____________ c th c ngm i kiu d liu. ____________ c ngha l "ti mun bin thc th ca ti dng private". ____________ thc cht c ngha l "to mt bn sao". ____________ ch nn c cp nht bi cc phng thc setter. Mt phng thc c th c nhiu ____________. ____________ tr v gi tr g . ____________ khng nn c dng cho cc bin thc th. ____________ c th c nhiu i s. ____________ gip thc hin nguyn tc ng gi. ____________ lc no cng ch c mt. 2. in t thch hp vo ch trng trong mi cu sau: a) Mi tham s phi c ch r mt _______ v mt ______ b) T kha ______ t ti khai bo kiu tr v quy nh rng mt phng thc s khng tr v gi tr g sau khi n hon thnh nhim v. 3. Cc pht biu sau y ng hay sai? Nu sai, hy gii thch. a) Cp ngoc rng() ng sau tn phng thc ti mt khai bo phng thc cho bit phng thc khng yu cu tham s no. b) Cc bin thc th hoc phng thc c khai bo vi t kha private ch c truy cp t cc phng thc nm trong lp ni chng c khai bo. c) Thn phng thc c gii hn trong mt cp ngoc {}. d) C th gi phng thc t mt bin kiu c bn. e) Cc bin a phng kiu c bn v mc nh l c khi to sn. f) S cc i s cha trong li gi phng thc phi khp vi s tham s trong danh sch tham s ca khai bo phng thc . 4. Phn bit gia bin thc th v bin a phng. 5. Gii thch mc ch ca tham s phng thc. Phn bit gia tham s v i s. 82

6. Ti sao mt lp c th cn cung cp phng thc set v phng thc get cho mt bin thc th? 7. Vit class Employee cha ba mu thng tin di dng cc thnh vin d liu: tn (first name, kiu String), h (last name, kiu String) v lng thng (salary, kiu double). Class Employee cn c mt hm khi to c nhim v khi to ba thnh vin d liu ny. Hy vit mt hm set v mt hm get cho mi thnh vin d liu. Nu lng thng c gi tr m th hy gn cho n gi tr 0.0. Vit mt chng trnh th nghim EmployeeTest chy th cc tnh nng ca class Employee. To hai i tng Employee v in ra mn hnh tng lng hng nm ca mi ngi. Sau cho tng lng cho mi ngi thm 10% v hin th li lng ca h theo nm. 8. To mt lp c tn Invoice (ha n) m mt ca hng c th dng biu din mt ha n cho mt mn hng c bn ra ti ca hng. Mi i tng Invoice cn c 4 thng tin cha trong cc thnh vin d liu: s hiu ca mt hng (partNumber kiu String), miu t mt hng (partDescription kiu String), s lng bn ra (quantity kiu int) v n gi (unitPrice kiu double). Lp Invoice cn c mt hm khi to c nhim v khi to 4 thnh vin d liu . Hy vit mt phng thc set v mt phng thc get cho mi thnh vin d liu. Ngoi ra, hy vit mt phng thc c tn getInvoiceAmount vi nhim v tnh tin ha n (ngha l s lng nhn vi n gi), ri tr v gi tr ha n di dng mt gi tr kiu double. Nu s lng khng phi s dng th cn gn cho n gi tr 0. Nu n gi c gi tr m, n cng cn c gn gi tr 0.0. Vit mt ng dng th nghim tn l InvoiceTest chy th cc tnh nng ca class Invoice. 9. Tm v sa li ca cc chng trnh sau (mi phn l mt file m ngun hon chnh). a)

83

b)

84

Chng 6.

S dng th vin Java

Kh nng h tr ti s dng ca lp trnh hng i tng th hin th vin s ca Java bao gm hng trm lp c xy dng sn. l cc khi c bn cho ta lp ghp thnh chng trnh ln. Chng ny gii thiu v cc khi c bn . 6.1. ArrayList u tin, ta ly mt v d v mt lp trong th vin: ArrayList. Ta bit v cu trc mng ca Java. Cng nh mng ca nhiu ngn ng khc, mng ca Java c nhng hn ch chng hn nh ta phi bit kch thc khi to mng; vic xa mt phn t gia mng khng n gin; mng khng th lu nhiu phn t hn kch thc khai bo. Lp ArrayList l mt cu trc dng mng khc phc c cc nhc im ca cu trc mng. Ta khng cn bit mt ArrayList cn c kch thc bao nhiu khi to n, n s t gin ra hoc co vo khi cc i tng c a vo hoc ly ra. Thm vo , ArrayList cn l cu trc c tham s kiu, ta c th to ArrayList<String> lu cc phn t kiu String, ArrayList<Cow> lu cc phn t kiu Cow, v.v.. ArrayList cho ta cc tin ch sau: add(Object item) gn i tng vo cui danh sch add(int i, Object item) chn i tng vo v tr i trong danh sch get(int i) tr v i tng ti v tr i trong danh sch remove(int index) xa i tng ti v tr c ch s index remove(Object item) xa i tng nu n nm trong danh sch contains(Object item) tr v true nu danh sch cha i tng item isEmpty() tr v true nu danh sch rng 85

size() tr v s phn t hin ang c trong danh sch get(int index) tr v i tng hin ang nm ti v tr index

V d s dng ArrayList c cho trong Hnh 6.1. Trong , lnh khi to new ArrayList<String> to mt i tng danh sch dnh cho kiu String, tm thi danh sch rng. Ln gi add th nht lm kch thc danh sch tng t 0 ln 1. Ln th hai add xu "Goodbye" vo v tr s 1 trong danh sch v lm cho kch thc danh sch tng ln 2. Sau khi remove(a), kch thc danh sch li gim v 1. Bn cht mt i tng ArrayList lu tr mt danh sch cc tham chiu ti cc i tng thuc kiu c khai bo. Nh trong v d ny, thi im sau khi gi add(0,b), i tng ArrayList ca ta cha mt danh sch gm hai tham chiu kiu String, mt chiu ti i tng String "Goodbye" m b ang chiu ti, tham chiu cn li chiu ti i tng String "Hello".

Hnh 6.1: V d s dng ArrayList.

C php <String> ti dng khai bo ArrayList s c gii thch chi tit ti Ch-ng 13. Tm thi, ta tm chp nhn ArrayList<String> l kiu danh sch ca cc i tng String, ArrayList<Cow> l kiu danh sch ca cc i tng Cow.

86

6.2. S DNG JAVA API Trong Java API, cc lp c nhm thnh cc gi (package). dng mt lp trong th vin, ta phi bit n nm trong gi no. Mi gi c t mt ci tn, chng hn java.util. Scanner nm trong gi java.util ny. N cha rt nhiu lp tin ch. Ta cng dng n lp System (System.out.println), String, v Math l cc lp nm trong gi java.lang. Chi tit v gi, trong c cch t cc lp ca chnh mnh vo gi ca ring mnh, c trnh by trong Ph lc B. Trong chng ny, ta ch gii thiu qua v vic s dng mt s lp trong th vin Java. Ta s ly v d v ArrayList trong mc trc minh ha cho cc ni dung trong mc ny. u tin, ta cn bit tn y ca lp m ta mun s dng trong chng trnh. Tn y ca ArrayList khng phi ArrayList m l java.util.ArrayList. Trong java.util l tn gi, cn ArrayList l tn lp. Ta phi cho my o Java bit ta nh dng ArrayList no. Ta c hai la chn: 1. Dng lnh import u file m ngun. V d dng u tin trong file chng trnh ArrayListTest trong mc trc l:
import java.util.ArrayList;

2.

Gi thng tn y ca lp mi khi gi n tn n. V d:
java.util.ArrayList<Cow> = new java.util.ArrayList<Cow>

Gi java.lang thuc dng c np sn. Do ta khng phi import java.lang hay dng tn y c th s dng cc lp String v System. C ba l do cho vic t chc cc lp vo cc gi: Th nht, gi gip ch cho vic t chc project hay th vin. Thay cho mt l cc lp t cng mt ch, cc lp c t vo cc gi khc nhau ty theo chc nng, chng hn GUI, cu trc d liu, hay c s d liu. Th hai, cu trc gi cho ta mt khng gian tn, gip trnh trng tn. Nu mt lot lp trnh vin to cc lp c tn ging nhau nhng t ti cc gi khc nhau th my o Java vn c th c cc lp . Th ba, t chc gi cho ta mt mc bo mt (mc gi), ta c th hn ch m ta vit trong mt gi ch c cc lp nm trong gi mi c th truy nhp. Ta s ni k hn v vn ny sau. S dng API bng cch no? Ta cn bit hai iu: (1) trong th vin c nhng lp no, (2) khi tm thy mt lp, lm th no bit n c th lm c g. tr li cho hai cu hi , ta c th tra cu mt cun sch v Java hoc ti liu API.

87

Hnh 6.2: Ti liu API phin bn Java 6, trang v ArrayList.

Ti liu API l ngun ti liu tt nht tm chi tit v tng lp v cc phng thc ca n. Ti , ta c th tm v duyt theo gi, tm v tra cu theo tn lp. Vi mi lp, ta c y thng tin m t lp, cc lp lin quan, danh sch cc phng thc, v c t chi tit ca tng phng thc. 6.3. MT S LP THNG DNG TRONG API 6.3.1. Math Math l lp cung cp cc hm ton hc thng dng. Math.random() : tr v mt gi tr kiu double trong khong [0.0,..,1.0). Math.abs() : tr v mt gi tr double l gi tr tuyt i ca i s kiu double, tng t i vi i s v gi tr tr v kiu int. Math.round() : tr v mt gi tr int hoc long (ty theo i s l kiu float hay double) l gi tr lm trn ca i s ti gi tr nguyn gn nht. Lu rng cc hng kiu float c Java hiu l thuc kiu double tr khi thm k t f vo cui, v d 1.2f. Math.min() : tr v gi tr nh hn trong hai i s. i s c th l int, long, float, hoc double. Math.max(): tr v gi tr ln hn trong hai i s. i s c th l int, long, float, hoc double.

Ngoi ra, Math cn cc phng thc khc nh sqrt(), tan(), ceil(), floor(), v sin(). Ta nn tra cu chi tit ti ti liu API. 88

6.3.2. Cc lp bc ngoi kiu d liu c bn i khi, ta mun i x vi mt gi tr kiu c bn nh l mt i tng. V d, cc phin bn Java trc 5.0, ta khng th chn thng mt gi tr kiu c bn vo trong mt cu trc kiu ArrayList. Cc li gi tng t nh list.add(2) s b trnh bin dch bo li do phng thc add ly i s l tham chiu i tng. Trong nhng trng hp nh vy, ta c cc lp bc ngoi mi kiu c bn (wrapper class). Cc lp bc ngoi ny c tn gn trng vi tn kiu c bn tng ng: Boolean, Character, Byte, Short, Integer, Long, Float, Double. Mi i tng thuc cc lp trn bao bc mt gi tr kiu c bn tng ng, km theo cc phng thc thao tc vi gi tr . V d:

Hnh 6.3: S dng lp Integer.

Cc lp bc ngoi khc cng c cch s dng v cc phng thc tin ch tng t nh Integer. chng hn mi i tng Boolean c phng thc booleanValue() tr v gi tr boolean cha trong n. Tm li, nu dng phin bn Java trc 5.0 hay t 5.0 tr i, ta s s dng ArrayList cho cc gi tr int theo kiu nh sau:

Vi cc phin bn Java t 5.0 tr i, trnh bin dch t ng lm h ta cc cng vic bc v g cc i tng bc ngoi thuc kiu tng ng. Ni cch khc, 89

ArrayList thc s l danh sch ca cc i tng Integer, nhng ta c th coi nh ArrayList ly vo v tr v cc gi tr int. Trnh bin dch khng ch t ng bc v g bc trong cc tnh hung s dng cc cu trc d liu tng t ArrayList. Vic ny cn xy ra hu ht cc tnh hung khc: i s ca phng thc: d mt phng thc khai bo tham s kiu c bn hay kiu lp bc ngoi th n vn chp nhn i s c dng c bn cng nh kiu lp bc ngoi. Gi tr tr v: d mt phng thc khai bo kiu tr v kiu c bn hay bc ngoi th lnh return trong phng thc dng gi tr c dng c bn cng nh bc ngoi u c. Biu thc boolean: nhng v tr yu cu mt biu thc boolean, ta c th dng biu thc cho gi tr boolean (chng hn 2 < a), hoc mt bin boolean, hoc mt tham chiu kiu Boolean u c. Php ton s hc: ta c th dng tham chiu kiu bc ngoi lm ton hng ca cc php ton s hc, k c php ++. Php gn: ta c th dng mt tham chiu kiu bc ngoi gn tr cho mt bin kiu c bn v ngc li. V d: Double d = 10.0;

6.3.3. Cc lp biu din xu k t String v StringBuffer l hai lp thng dng biu din d liu dng xu k t. String dnh cho cc chui k t khng th sa i ni dung. Tt c cc hng xu k t nh "abc" u c Java coi nh cc thc th ca lp String. StringBuffer v StringBuilder cho php sa i ni dung chui, s dng mt trong hai lp ny s hiu qu hn String nu ta cn dng nhiu thao tc sa xu. T Java 5.0, ta nn dng StringBuilder thay v String Buffer cho mc ch ny, tr khi ta cn ch trnh xung t gia cc thao tc x l xu ti cc lung khc nhau. String v StringBuffer/StringBuilder u c cc phng thc sau: charAt (int index) tr v k t ti mt v tr compareTo() so snh gi tr vi mt i tng cng loi. cc phng thc indexOf() tm v tr ca mt k t/xu con theo chiu t tri sang phi. cc phng thc lastIndexOf() tm v tr ca mt k t/xu con theo chiu t phi sang tri. length() tr v di ca xu. substring(int start, int end) tr v i tng String l xu con.

ni xu, ta dng concat() cho String v append() cho StringBuffer/StringBuilder. Ngoi ra, String cn c thm cc tin ch : 90

valueOf() tr v biu din kiu String ca mt gi tr thuc kiu c bn, split() tch xu thnh cc t con theo mt c php cho trc, replace(char old, char new) tr v mt String mi l kt qu ca vic thay th ht cc k t old bng k t new trim() tr v mt String mi l kt qu ca vic xa cc k t trng u v cui String hin ti. StringBuffer v StringBuilder c cc phng thc cung cp cc phng thc chn (insert), thay (replace), xa mt phn (delete), o xu (reverse) ti i tng StringBuffer/StringBuilder hin ti. Ta bit nhng cch n gin ly biu din bng xu k t cho cc gi tr

s:
int n = 302044; String s1 = "" + n; String s2 = Integer.toString(n);

i khi, ta cn biu din cc gi tr s mt cch cu k hn, chng hn 302,044, hay quy nh s ch s nm sau du phy thp phn s c in ra, biu din dng nh phn, h c s 16... Phng thc format() ca lp String gip chng ta lm c vic ny. V d:

6.4. TR CHI BN TU Trong mc ny, ta s lm mt chng trnh v d: tr chi bn tu SinkAShip6. y s l mt ng dng hon chnh minh ha vic s dng Java API, v cng l mt ng dng ln minh ha r hn s tng tc gia cc i tng trong chng trnh. Tr chi bn tu c m t nh sau: My tnh c mt s con tu kch thc 1 x 3 trn mt vng l li vung 7 x 7, cho php ngi chi bn mi ln mt vin n, mi vin trng no s lm chy phn tu nm trong , nu nh c tu. Ngi chi khng bit cc con tu u, nhng c mc tiu l bn chy ht tu, nn phi on xem nn bn vo u tn cng t n cng tt.

Chnh sa t v d DotComBust ca cun Head First Java, 2nd Edition.

91

Khi bt u mt vn chi, chng trnh s t ngu nhin ba con tu vo mt li o kch thc 7x7, sau mi ngi chi bn pht u tin. Ta cha hc lp trnh giao din ha, do chng trnh ca chng ta s s dng giao din dng lnh. Mi ln, chng trnh s mi ngi chi nhp ta mt pht bn, ngi chi nhp mt ta c dng "A5" hay "B1". Chng trnh x l pht bn, kim tra xem c trng hay khng ri in ra mn hnh mt thng bo thuc mt trong cc loi: "hit" (trng), "miss" (trt), hoc "You sunk a ship" (khi mt tu va b bn chy ht). Khi c ba con tu u b chy ht, vn chi kt thc, chng trnh thng bo im ca ngi chi. Ta trong tr chi c dng "A4", trong k t th nht l mt ch ci trong on t A n G i din cho ta dng, k t th hai l mt ch s trong on t 0 n 6 i din cho ta ct trong li vung 7x7. Thit k mc cao cho hot ng ca chng trnh:

Bc tip theo l xc nh ta cn n cc i tng no. t nht, ta s cn n vn chi v cc m hnh tu, tng ng vi hai lp SinkAShip v Ship. Khi vit mt lp, quy trnh chung c gi nh sau: 92

Xc nh cc nhim v v hot ng ca lp Lit k cc bin thc th v phng thc Vit m gi cho cc phng thc m t thut ton/quy trnh cng vic ca chng. Vit chng trnh test cho cc phng thc. Ci t lp Test cc phng thc Tm li v ci li nu cn Test vi ngi dng thc.

Ta s b qua bc cui cng. u tin l lp Ship, ta cn lu hai thng tin chnh: ta cc ca tu v tu b bn chy ht hay cha. Di y l thit k m ta d dng ngh n.

Nhng thit k trn cha tnh n trng hp ngi chi bn hai pht vo cng mt , cha phn bit mt pht n bn vo cha b chy vi mt pht n bn vo chy. Nu ngi chi bn ba ln vo cng mt th thut ton trn s cho l tu b bn chy, mc d thc t vn cn hai cha b bn. Ta c th gii quyt vn ny bng mt mng ph cha cc gi tr boolean nh du cc b bn, hoc dng gi tr int sn c ti mng locationCells m ha cc trng thi cha b bn / b bn. Tuy nhin, c gii php va gn gng, va tn dng th vin Java, ta chn cch dng ArrayList lu danh sch cc cha b bn ca con tu. Mi khi no b bn trng, phn t tng ng s b xa khi danh sch. Khi danh sch rng l khi tu b bn chy. Nh vy ta ch cn mt i tng ArrayList l dng thay cho c mng int locationCells v bin m numOfHits. Ta c thit k nh sau:

93

Ci t lp Ship theo thit k trn:

Lp SinkAShip c cc nhim v sau: to ra ba con tu, cho mi con tu mt ci tn, t ba con tu vo li. y ta cn tnh v tr tu mt cch ngu nhin, ta to mt lp GameHelper cung cp tin ch ny (s ni n Helper sau). hi ta bn ca ngi chi, kim tra vi c ba con tu ri in kt qu. Lp cho n khi no c ba con tu u b chy.

Nh vy, ta cn ba lp: SinkAShip vn hnh tr chi, Ship i din cho tu, v GameHelper cung cp cho Sink cc tin ch tr gip nh nhn input t ngi chi v sinh v tr cho cc con tu. Ta cn mt i tng SinkAShip, ba i tng Ship, v mt i tng GameHelper. Ngoi ra cn c cc i tng ArrayList cha trong ba i tng Ship. 94

Vy ai lm g trong mt vn SinkAShip? Cc i tng trong chng trnh bn tu hot ng v tng tc vi nhau theo tng giai on nh sau: 1. Phng thc main() ca lp SinkAShip to mt i tng SinkAShip, i tng ny s vn hnh tr chi.

2. i tng SinkAShip to mt i tng GameHelper n lm 'tr l'.

3. i tng SinkAShip to mt ArrayList chun b lu tr ba i tng Ship.

4. i tng SinkAShip to ba i tng Ship v gn vo ArrayList ni trn.

5. i tng SinkAShip yu cu 'tr l' sinh ta cho tng i tng Ship, chuyn d liu ta nhn c cho cc i tng Ship. Cc i tng Ship cp nht danh sch ta ti ArrayList ca mnh.

6. i tng SinkAShip yu cu 'tr l' ly ta bn ca ngi chi, 'tr l' hin th li mi nhp ti giao din dng lnh v nhn input ca ngi chi). Nhn c kt qu do 'tr l' cung cp, i tng SinkAShip yu cu tng i tng Ship t kim tra xem c b bn trng hay khng. Mi i tng Ship kim tra tng v tr trong ArrayList ca mnh v tr v kt qu tng ng 95

("miss", "hit", ). Bc ny lp i lp li cho n khi tt c cc con tu u b bn chy.

Nh ni Chng 1, chng trnh hng i tng l mt nhm cc i tng tng tc vi nhau. Cc v d trc trong cun sch ny u nh nn kh thy r s tng tc gia cc i tng. V d tr chi bn tu ny ln minh ha c kha cnh . Vi hot ng nh m t, lp SinkAShip c thit k nh sau:

96

Lp SinkAShip c ci t nh sau:

97

98

Cui cng l lp GameHelper cha cc phng thc tin ch cho SinkAShip s dng. Lp ny cung cp hai phng thc. Phng thc getUserInput() nhn input ca ngi chi bng cch hin th li mi nhp ta bn v c chui k t ngi dng g vo t dng lnh. Phng thc th hai, placeShip(), sinh t ng v tr cho cc con tu. Trong m ngun, c mt s lnh System.out.print(ln) trong phng thc placeShip() c chuyn thnh dng ch thch. l cc lnh hin th ta ca cc con tu. Nu cho cc lnh ny chy, chng s cho php ta bit ta ca tu chi "n gian" hoc test chng trnh. Do ch l mt v d minh ha, chng trnh ny tuy hon chnh nhng c vit mc vn tt ti a vi giao din ti thiu. Bn c c th sa ci thin phn giao din i vi ngi dng, chng hn nh hin th bn vng bin cng vi cc thng tin v cc ta bn trng hoc trt h tr ngi chi, hoc c th s dng th vin giao din ha ca Java tng tnh thm m v tnh thn thin ngi dng.

99

Hnh 6.4: GameHelper, phn 1/2.

100

Hnh 6.5: GameHelper, phn 2/2.

101

Bi tp
1. Vit lp Dice m hnh ha xc xc v vic tung xc xc. Mi i tng Dice c mt bin int lu trng thi hin ti l mt nga ca ln gieo gn nht (mt gi tr trong khong t 1 n 6), mt phng thc public roll() gi lp vic gieo xc xc v tr v gi tr ca mt nga va gieo c. Hy s dng th vin Math cho vic sinh s ngu nhin. 2. Vit lp Card m hnh ha cc qun bi t-l-kh. S dng ArrayList xy dng lp CardSet m hnh ha mt xp bi c qun khng xc nh. Ci phng thc shuffle() ca lp CardSet vi nhim v tro ngu nhin cc qun bi trong xp bi. Vit lp CardTestDrive th nghim hai lp Card v CardSet ni trn. 3. C th dng mt i tng thuc lp Scanner c d liu t mt file text tng t nh c d liu t bn phm. V d:
try { Scanner input = new Scanner (new File("C:\\Tmp\\test.txt")); // c d liu int n = input.nextInt(); } catch (java.io.FileNotFoundException e) { }

a) Hy vit mt chng trnh Java c d liu t mt file text v in tng t ra mn hnh. b) Sa chng trnh ti phn a b qua cc du .,:.khi c cc t trong vn bn. Gi : Lnh sau y t ch cho i tng Scanner coi tt c cc k t khng phi a..z hay A..Z nh cc k t phn tch gia cc t khi thc hin lnh c tng t
input.useDelimiter(Pattern.compile("[^a-zA-Z]"));

Lnh sau y b qua tt c cc k t khng phi a..z hay A..Z cho n khi gp mt k t trong khon a..z hay A..Z
input.skip("[^a-zA-Z]*");

102

Chng 7.

Tha k v a hnh

Hai nguyn l tha k v a hnh ca lp trnh hng i tng gip ta c th xy dng chng trnh mt cch nhanh chng v hiu qu hn, thu c kt qu l nhng m-un chng trnh m cc lp trnh vin khc d m rng hn, c kh nng p ng tt hn i vi s thay i lin tc ca cc yu cu ca khch hng. 7.1. QUAN H THA K Nh li v d u tin v lp trnh hng i tng ti Ch-ng 1. Trong , Du xy dng 4 lp: Square (hnh vung), Circle (ng trn), Triangle (hnh tam gic), v Amoeba (hnh trng bin hnh). C bn u l cc hnh vi hai phng thc rotate() v playSound(). Do , anh ta dng t duy tru tng ha tch ra cc c im chung v a chng vo mt lp mi c tn Shape (hnh ni chung). Sau , kt ni cc lp hnh v kia vi lp Shape bi mt quan h gi l tha k. Ta ni rng "Square tha k t Shape", "Circle tha k t Shape", v.v.. Ta tho g rotate() v playSound ra khi 4 loi hnh, v gi th ch cn phi qun l mt bn t ti lp Shape. Shape c gi l lp cha (superclass) hay lp c s (base class) ca bn lp kia. Cn bn lp l cc lp con (subclass) hay lp dn xut (derived class) ca lp Shape. Cc lp con tha k cc phng thc ca lp cha. Ni cch khc, nu lp Shape c chc nng g th cc lp con ca n t ng c cc chc nng .
Shape lp cha
rotate() playSound()

nhng g c c bn lp

quan h tha k

cc lp con Square Circle Triangle Amoeba


rotate() { // m xoay hnh // ring cho amoeba } playSound() { // m chi nhc // ring cho amoeba}

overriding

Vy th no l quan h tha k? Nu ta cn xy dng cc lp i din cho hai loi mo nh v h, mo nh nn tha k t h, hay h nn tha k t mo, hay c hai cng tha k t mt lp th ba? 103

Khi ta dng quan h tha k trong thit k, ta t cc phn m dng chung ti mt lp v coi l lp cha lp dng chung tru tng hn, cc lp c th hn l cc lp con. Cc lp con c tha k t lp cha . Quan h tha k c ngha rng lp con c tha hng cc thnh vin (member) ca lp cha. Thnh vin ca mt lp l cc bin thc th v phng thc ca lp . V d, Shape trong v d trn c hai thnh vin rotate() v playSound(), Cow trong Hnh 5.6 c cc thnh vin name, age, getName(), getAge(), setName(), setAge(). Ta cn ni rng lp con chuyn bit ha (specialize) lp cha. Ngha ca "chuyn bit ha" y gm c hai phn: (1) lp con l mt loi con ca lp cha th hin ch lp con t ng tha hng cc thnh vin ca lp cha, (2) lp con c nhng c im ca ring n - th hin ch lp con c th b sung cc phng thc v bin thc th mi ca ring mnh, v n c th ci (override) cc phng thc tha k t lp cha. V d, hnh trng bin hnh (Amoeba) cng l mt hnh (Shape), do lp con Amoeba c tt c nhng g m Shape c. Ngoi ra, Amoeba c thm nhng c im ring ca th loi hnh trng bin hnh: cc bin thc th i din cho tm xoay phc v cch xoay ca ring n, v n nh ngha li cc phng thc rotate xoay theo cch ring, nh ngha li playSound chi loi m thanh ring. Theo thut ng, v cng l t kha, ca Java, lp con "ni di" (extends) lp cha. Cc bin thc th khng b ci v vic l khng cn thit. Bin thc th khng quy nh mt hnh vi c bit no v lp con ch vic gn gi tr ty chn cho bin c tha k. 7.2. THIT K CY THA K Gi s ta cn thit k mt chng trnh gi lp cho php ngi dng th mt m cc con ng vt thuc cc loi khc nhau vo mt mi trng xem chuyn g xy ra. Ta hin cha phi vit m m mi ch giai on thit k. Ta bit rng mi con vt s c i din bi mt i tng, v cc i tng s di chuyn loanh quanh trong mi trng, thc hin cc hnh vi c lp trnh cho loi vt . Ta c giao mt danh sch cc loi vt s c a vo chng trnh: s t, h m, h, ch, mo, si. V ta mun rng, khi cn, cc lp trnh vin khc cng c th b sung cc loi vt mi vo chng trnh. Bc 1, ta xc nh cc c im chung v tru tng m tt c cc loi ng vt u c. Cc c im chung bao gm: nm bin thc th: picture tn file nh i din cho con vt ny 104

food loi thc n m con vt thch. Hin gi, bin ny ch c hai gi tr: c (grass) hoc tht (meat). hunger mt bin int biu din mc i ca con vt. Bin ny thay i ty theo khi no con vt n v n n bao nhiu. boundaries cc gi tr biu din chiu dc v chiu ngang (v d 640 x 480) ca khu vc m cc con vt s i li hot ng trong . location cc ta X v Y ca con vt trong khu vc ca n. v bn phng thc: makeNoise() hnh vi khi con vt pht ra ting ku eat() hnh vi khi con vt gp ngun thc n a thch, tht hoc c. sleep() hnh vi khi con vt c coi l ang ng. roam() hnh vi khi con vt khng phi ang n hay ang ng, c th ch i lang thang i gp mn g n c hoc gp bin gii lnh a. Bc 2, thit k mt lp vi tt c cc thuc tnh v hnh vi chung k trn. y s l lp m tt c cc lp ng vt u c th chuyn bit ha. Cc i tng trong ng dng u l cc con vt (animal), do , ta s gi tn lp cha chung ca chng l Animal. Ta a vo cc phng thc v bin thc th m tt c cc con vt u c th cn. Kt qu l ta c lp cha l lp tng qut hn, hay ni cch khc l tru tng hn, cn cc lp con mang tnh c th hn, chuyn bit hn lp cha.

Cc con vt hot ng c ging nhau khng? Ta bit rng mi loi Animal u c tt c cc bin thc th khai bo cho Animal. Mt con s t s c cc gi tr ring cho picture, food, hunger, boundaries, v location. Mt con h m s c nhng gi tr khc cho b bin thc th tng t. Cng nh vy i vi ch, h... Th cn cc hnh vi ca chng th sao? 105

Bc 3: Xc nh xem cc lp con c cn cc hnh vi (ci t ca cc phng thc) c th ca th loi con c th hay khng? lp Animal. Chc chn s t khng n ging h m. Cn v ting ku, ta c th vit duy nht mt phng thc makeNoise ti Animal trong chi mt file m thanh c tn l gi tr ca mt bin thc th m c gi tr khc nhau ty loi, con vt ny ku khc con vt khc. Nhng lm vy c v cha v ty tng tnh hung m cc loi khc nhau pht ra cc ting ku khc nhau, chng hn ting ku khi ang n v ting ku khi gp k th, v.v.. Do , ta quyt nh rng eat() v makeNoise() nn c ci ti tng lp con. Tm coi cc con vt sleep v roam nh nhau v khng cn ci hai phng thc ny. Ngoi ra, mt s loi c nhng hnh vi ring c trng ca loi , chng hn ch c thm hnh vi ui mo (chaseCats()) bn cnh cc hnh vi m cc loi ng vt khc cng c.

Bc 4: Tip tc dng tru tng ha tm cc lp con c th cn c hnh vi ging nhau, vi mc ch phn nhm mn hn nu cn. V d, si v ch c h hng gn, cng thuc h Ch (canine) trong phn loi ng vt hc, chng cng c xu hng di chuyn theo by n nn c th dng chung mt phng thc roam(). Mo, h v s t cng thuc h Mo (feline). Ba loi ny c th chung phng thc roam() v khi di chuyn chng cng c xu hng trnh ng loi. Ta s cho h m tip tc dng phng thc roam() tng qut c tha k t Animal. Ta tm hon thnh thit k nh trong Hnh 7.1 v s quay li bi ton ny trong chng sau.

106

Hnh 7.1: Cy tha k ca cc loi ng vt.

7.3. CI PHNG THC NO C GI? Lp Wolf c bn phng thc: sleep() c tha k t Animal, roam() c tha k t Canine (thc ra l phin bn bn ca Animal), v hai phng thc m Wolf ci bn ca Animal - makeNoise() v eat(). Khi ta to mt i tng Wolf v gn mt bin tham chiu ti n, ta c th dng bin gi c bn phng thc trn. Nhng phin bn no ca chng s c gi?

107

Khi gi phng thc t mt tham chiu i tng, ta ang gi phin bn c th nht ca phng thc i vi lp ca i tng c th . Nu hnh dung cy tha k theo kiu cc lp cha pha trn cn cc lp con pha di, th quy tc y l: phin bn thp nht s c gi. Trong v d dng bin w gi phng thc cho mt i tng Wolf trn, th t t thp ln cao ln lt l Wolf, Canine, Animal. Khi gi mt phng thc cho mt i tng Wolf, my o Java bt u tm t lp Wolf ln, nu n khng tm c mt phin bn ca phng thc ti Wolf th n chuyn ln tm ti lp tip theo bn trn Wolf cy tha k, c nh vy cho n khi tm thy mt phin bn khp vi li gi phng thc. Vi v d ang xt, nh c minh ha trong hnh v, w.makeNoise() s dn n vic kch hot phin bn ca Wolf, w.roam() gi phin bn ca Canine, v.v.. 7.4. CC QUAN H IS-A V HAS-A Nh trnh by trong cc chng trc, khi mt lp k tha t mt lp khc, ta ni rng lp con chuyn bit ha lp cha. Nhng liu khi no th nn chuyn bit ha mt lp khc? Nh li rng lp cha l loi tng qut, cn lp con l loi c th v chuyn bit, l loi con ca lp cha. Nhn t kha cnh khc, tp hp cc i tng m lp con i din l mt tp con ca cc i tng m lp cha i din. Do , a ra la chn ng n cho vn nn hay khng nn lp X l lp chuyn bit ha lp Y, ta c mt phng php hiu qu: kim tra quan h IS-A, ngha l xem th ny c l th kia hay khng. xem X c nn l lp con ca Y hay khng, ta t cu hi theo dng "Nu pht biu mt cch tng qut rng loi X l mt dng/th/kiu ca loi Y th c l hay khng?". Nu cu tr li l "C", th X c th l lp con ca Y. V d: Tam gic l mt hnh (Triangle IS-A Shape)? ng. Mo l mt ng vt h Mo (Cat IS-A Feline)? ng. Xe ti l mt phng tin giao thng (Truck IS-A Vehicle)? ng. Ngha l, Triangle c th l lp con ca Shape, Cat c th l lp con ca Feline, Truck c th l lp con ca Vehicle. Ta xt tip: Phng bp l mt ci nh (Kitchen IS-A House)? Chc chn sai. Ngc li th sao? Nh l mt phng bp (House IS-A Kitchen)? ng l c mt s ngi v phong tc hay iu kin sng m ngi nh ca h ch c mt phng duy nht nn va l ni nu bp va l phng cho nhiu chc nng khc. Tuy nhin, cc trng hp ch l "mt s", nn cu tr li tng qut vn l "Sai". Cho nn, Kitchen khng th l lp con ca House hay ngc li. Phng bp v nh r rng c lin quan n nhau, nhng khng phi qua quan h tha k m l mt quan h cha HAS-A. Cu hi y l: Nh c cha mt phng bp hay khng (House HAS-A Kitchen)? Nu cu tr li l "C", iu c ngha House c mt bin thc th kiu Kitchen. Ni cch khc, House c mt tham 108

chiu ti mt i tng Kitchen, ch House khng chuyn bit ha Kitchen hay ngc li.

Quan h HAS-A trong Java c ci t bng tham chiu t ti i tng cha chiu ti i tng thnh phn. Quan h HAS-A gia hai lp th hin mt trong ba quan h: kt hp (association), t hp (aggregation) v hp thnh (composition) m cc ti liu v thit k hng i tng thng ni n. Gia hai lp c quan h kt hp nu nh cc i tng thuc lp ny cn bit n i tng thuc lp kia c th thc hin c cng vic ca mnh. Chng hn, mt ngi nhn vin chu s qun l ca mt ngi qun l, ta c quan h kt hp ni t Employee ti Manager, th hin vic mi i tng Employee c mt tham chiu boss kiu Manager. Hp thnh v t hp l cc quan h gia mt i tng v thnh phn ca n (cng l i tng). Khc nhau ch, vi quan h hp thnh, i tng thnh phn l phn khng th thiu c ca i tng cha n, cn vi quan h t hp th ngc li. V d, mt cun sch bao gm nhiu trang sch v mt cun sch khng th tn ti nu khng c trang no. Do gia Book (sch) v Page (trang) c quan h hp thnh. Th vin c nhiu sch, nhng th vin khng c cun sch no vn l mt th vin, nn quan h gia Library (th vin) v Book l quan h t hp. Java khng c cu trc no dnh ring ci t cc quan h t hp hay hp thnh. Ta ch ci t n gin bng cch t vo i tng ch cc tham chiu ti i tng thnh phn, hay ni cch khc l phn r thnh cc quan h HAS-A, chng hn quan h hp thnh gia Book v Page c th c phn r thnh 'Book HAS-A ArrayList<Page>' v nhiu quan h 'ArrayList<Page> HAS-A Page'. Cc rng buc khc c m bo bi cc phng thc c nhim v khi to hay sa cc tham chiu . Quay li quan h IS-A, c mt im cn lu : quan h tha k IS-A ch c mt chiu. V d: "Tam gic l mt hnh" l pht biu c l, nhng khng nh theo chiu ngc li, "Hnh l mt tam gic", th khng ng. C nhiu hnh l hnh tam gic, nhng cng c v s hnh khng phi hnh tam gic. Thc ra, lu trn l hin nhin, nu ta nh n m t v lp con ti mc trc: Lp con chuyn bit ha lp cha. n y, chng ta cha kt thc cu chuyn v quan h tha k. Chng sau s tip tc trnh by v cc vn hng i tng. Mt s gii php thit k trong chng ny s c xem li v ci tin. 109

7.5. KHI NO NN DNG QUAN H THA K? Mc ny lit k mt s quy tc hng dn vic s dng quan h tha k trong thit k. Ti thi im ny, ta tm bng lng vi vic bit quy tc. Vic hiu quy tc nu cha trn vn th s c bi p dn trong nhng phn sau ca cun sch. NN dng quan h tha k khi mt lp l mt loi c th hn ca mt lp cha. V d, ti khon tit kim (saving account) l mt loi ti khon ngn hng (bank account), nn SavingAccount l lp con ca BankAccount l hp l. NN cn nhc vic tha k khi ta c mt hnh vi (m c vit) nn c dng chung gia nhiu lp thuc cng mt kiu tng qut no . V d, Square, Circle v Triangle trong bi ton ca Du v Tut cng cn xoay v chi nhc, nn vic t cc chc nng ti mt lp cha Shape l hp l. Tuy vy, cn lu rng mc d tha k l mt trong nhng c im quan trng ca lp trnh hng i tng nhng n khng nht thit l cch tt nht cho vic ti s dng hnh vi. Quan h tha k gip ta khi ng vic ti s dng, v n thng l la chn ng khi thit k, nhng cc mu thit k s gip ta nhn ra nhng la chn khc tinh t v linh hot hn. KHNG NN dng tha k ch nhm mc ch ti s dng m ca mt lp khc, trong khi quan h gia lp cha v lp con vi phm mt trong hai quy tc trn. V d, gi s ta vit cho lp DoorBell (chung ca) mt on m dnh ring cho vic in, v gi ta cn vit m cho chc nng in ca lp Piano. Khng nn v nhu cu m cho Piano lm lp con ca DoorBell. n piano khng phi l mt loi chung gi ca. (Gii php nn chn cho tnh hung ny l: phn m cho chc nng in nn c t trong mt lp Printer, v cc lp cn c chc nng in s hng li t lp Printer qua mt quan h HAS-A.) KHNG NN dng quan h tha k nu lp con v lp cha khng qua c th nghim IS-A. Hy t kim tra xem lp con c phi l mt kiu chuyn bit ca lp cha hay khng. V d: Bike IS-A Vehicle (xe p l mt phng tin giao thng) hp l. Nhng Vehicle IS-A Bike (phng tin giao thng l mt loi xe p) th khng c. 7.6. LI CH CA QUAN H THA K Quan h tha k trong thit k mang li cho ta rt nhiu iu. Li ch th nht: trnh lp cc on m b trng lp. Ta c th loi b c nhng on m trng lp bng cch tch ra cc hnh vi chung ca mt nhm cc lp i tng v a phn m vo mt lp cha. Nh , khi ta cn sa n, ta ch cn cp nht m duy nht mt ni, v sa i c hiu lc ti tt c cc lp k tha hnh vi . Cng vic gi gn trong vic sa v dch lp cha. Tm li: ta khng phi ng n cc lp con! 110

Vi ngn ng Java, chng trnh l mt tp cc lp. Do , ta khng cn phi dch li cc lp con c th dng c phin bn mi ca lp cha. i hi duy nht l phin bn mi ca lp cha khng ph v ci g ca lp con. Ngha c th ca t "ph v" trong ng cnh trn s c trnh by chi tit sau. Tm thi, ta ch cn hiu rng hnh ng c ngha l sa ci g ti lp cha m lp con b ph thuc vo, chng hn nh sa kiu tham s, hay kiu tr v, hoc tn ca mt phng thc no . Li ch th hai: ta nh ngha c mt giao thc chung cho tp cc lp gn kt vi nhau bi quan h tha k. Quan h tha k cho php ta m bo rng tt c cc lp con ca mt lp u c tt c cc phng thc7 m lp c. l mt dng giao thc m lp tuyn b vi tt c cc phn m khc rng: "Tt c cc th loi con ca ti (ngha l cc lp con) u c th lm nhng vic ny, vi cc phng thc trng nh th ny...". Ni cch khc, ta thit lp mt hp ng (contract).

Lu rng, khi ni v Animal bt k, ta ang ni v i tng Animal hay i tng thuc bt c lp no c Animal l t tin trong cy ph h. Khi ta nh ngha mt kiu tng qut (lp cha) cho mt nhm cc lp, bt c lp con no trong nhm u c th dng thay cho v tr ca lp cha. Ta c Wolf l mt loi con ca Animal; mt i tng Wolf c tt c cc thnh vin m mt i tng Animal c. Vy th l-gic hin nhin: mt i tng Wolf c th c coi l thuc loi Animal; ni no dng c Animal th cng dng c Wolf. Ta bt u chm n phn th v nht ca lp trnh hng i tng: a hnh. 7.7. A HNH Trc khi trnh by v a hnh, ta nhc li mt cht v cch khai bo mt tham chiu v to mt i tng.

Nu mun ni tht chnh xc th phi l "tt c cc phng thc tha k c". Tm thi, n c

ngha l "cc phng thc public", nhng ta s tinh chnh nh ngha ny sau.

111

Trong v d trn, tham chiu w c khai bo bng lnh Wolf w, i tng lp Wolf c khai bo bng lnh new Wolf. im ng ch l kiu ca bin tham chiu v kiu ca i tng cng l Wolf. Vi a hnh th sao? y l v d: w c khai bo thuc kiu Animal, trong khi i tng vn c to theo kiu Wolf:
Animal w = new Wolf();

:Wolf
i tng Wolf

w
Animal

tham chiu kiu Animal, trong khi i tng kiu Wolf

Vi a hnh, tham chiu c th thuc kiu lp cha ca lp ca i tng c to. Khi ta khai bo mt bin tham chiu thuc kiu lp cha, n c th c gn vi bt c i tng no thuc mt trong cc lp con. c tnh ny cho php ta c nhng th th v kiu nh mng a hnh. V d, trong Hnh 7.2, ta khai bo mt mng kiu Animal, ngha l mt mng cha cc i tng thuc loi Animal. Nhng sau ta li gn vo mng cc i tng thuc cc lp con ty ca Animal. V vng lp duyt mng sau l phn th v nht lin quan n a hnh trng tm ca v d. Ti , ta duyt t u n cui mng, vi mi phn t mng, ta gi mt trong cc phng thc Animal t tham chiu kiu Animal. Khi i chy t 0 ti 4, animals[i] ln lt chiu ti mt i tng Dog, Cat, Wolf, Hippo, Lion. Kt qu ca animals[i].eat() hay animals[i].roam() u l: mi i tng thc hin ng phin bn thch hp vi loi ca chnh mnh.

Hnh 7.2: Mng a hnh

Tnh a hnh cn c th th hin kiu d liu ca i s v gi tr tr v.

112

class Vet { public void giveShot(Animal a) { // give a a shot, vaccination for example a.makeNoise(); tham s Animal chp nhn } kiu Animal bt k lm i s }

Vet v = new Vet(); Dog d = new Dog(); Cat c = new Cat(); v.giveShot(d); v.giveShot(c);

makeNoise() ca Dog c thc thi makeNoise() ca Cat c thc thi

Hnh 7.3: Tham s a hnh

Trong v d Hnh 7.3, ti phng thc giveShot(), tham s Animal chp nhn i s thuc kiu Animal bt k. on m bn di gi giveShot() ln lt vi i s l cc i tng Dog v Cat. Sau khi bc s th y (Vet) tim xong, makeNoise() c gi t trong phng thc giveShot() cho i tng Animal m a ang chiu ti. Mc d a l tham chiu thuc kiu Animal, nhng i tng n chiu ti thuc lp no quyt nh phin bn makeNoise() no c chy. Kt qu l phin bn ca Dog c chy cho i tng Dog, v phin bn ca Cat c chy cho i tng Cat. Nh vy, vi a hnh, ta c th vit nhng on m khng phi sa i khi ta b sung lp con mi vo chng trnh. Ly v d lp Vet trong v d va ri, do s dng tham s kiu Animal, phn m ny c th dng cho lp con bt k ca Animal. Bn cnh cc lp Lion, Tiger...sn c, nu ta mun b sung loi ng vt mi, chng hn Cow, trong khi vn mun tn dng lp Vet, ta ch cn cho lp mi l lp con ca Animal. Khi , cc phng thc ca Vet vn tip tc hot ng c vi lp mi, mc d khi vit Vet ta khng c cht thng tin g v cc loi con ca Animal m n s hot ng cng. Tm li, a hnh l g? Theo ngha tng qut, a hnh l kh nng tn ti nhiu hnh thc. Trong hng i tng, a hnh i km vi quan h tha k v c hai c im sau: (1) cc i tng thuc cc lp dn xut khc nhau c th c i x nh nhau, nh th chng l cc i tng thuc lp c s, chng hn c th gi cng mt thng ip ti i tng; (2) khi nhn c cng mt thng ip , cc i tng thuc cc lp dn xut khc nhau hiu n theo nhng cch khc nhau. Ta thy c im th nht th hin vic ta c th dng tham chiu kiu lp cha chiu ti cc i tng thuc lp con nh th chng u l cc i tng thuc lp cha, trong cc v d gn y l tham s Animal chp nhn cc i s kiu Dog v Cat, Vet i x vi cc loi con ca Animal mt cch thng nht nh th chng u thuc loi Animal. c im th hai th hin vic khi ta gi phng thc ca i tng t tham chiu kiu cha, phin bn c gi ty theo i tng thuc loi c th g. Kt qu ca cng mt lnh a.makeNoise() l makeNoise() ca 113

Dog c gi nu a ang chiu ti i tng Dog, makeNoise() ca Cat c gi nu a ang chiu ti i tng Cat. 7.8. GI PHIN BN PHNG THC CA LP CHA i khi, ti mt lp con, ta ci mt hnh vi ca lp cha, nhng ta khng mun thay th hon ton m ch mun b sung mt s chi tit. Chng hn, lp Account i din cho ti khon ngn hng chung chung. N cung cp phng thc withdraw(double) vi chc nng rt tin, phng thc ny thc hin quy trnh rt tin c bn: tr s tin rt khi s d ti khon (balance). FeeBasedAccount l loi ti khon ngn hng thu ph i vi mi ln rt tin, ngha l bn cnh quy trnh rt tin c bn, n cn lm thm mt vic l tr ph rt tin khi s d ti khon. Nh vy, FeeBasedAccount c cn n ni dung ca bn withdraw() c Account cung cp sn, nhng vn phi ci v ni dung khng dng. Ta cng khng mun chp ni dung bn withdraw() ca Account vo bn ca FeeBasedAccount. Thay vo , ta mun c cch gi phng thc withdraw() ca Account t trong phin bn ci ti FeeBasedAccount. Tm li, t trong phin bn ci ti lp con, ta mun gi n chnh phng thc ca lp cha, ta phi lm nh th no? T kha super cho php gi n cch thnh vin c tha k. Phng thc withdraw() ca FeeBasedAccount c th c ci t i loi nh trong Hnh 7.4

Hnh 7.4: Gi phin bn phng thc ca lp cha.

Mt tham chiu ti i tng thuc lp con s lun lun gi phin bn mi nht chnh l phin bn ca lp con nu c. l cch hot ng ca a hnh. Tuy nhin, t kha super cho php gi phin bn c hn phin bn m lp con c tha k.

114

T kha super ca Java thc cht l mt tham chiu ti phn c tha k ca mt i tng. Khi m ca lp con dng super, chng hn nh trong li gi phng thc, phin bn c tha k s chy. 7.9. CC QUY TC CHO VIC CI Khi ta ci mt phng thc ca lp cha, ta ng tun th hp ng m lp cha cam kt. Chng hn, hp ng ni rng "ti khng ly i s v ti tr v mt gi tr boolean". Ni cch khc, cc kiu i s v kiu tr v ca phin bn mi ca phng thc phi trng ging ht vi bn ca lp cha. Cc phng thc chnh l hp ng. Nh li rng, vi mi li gi phng thc, trnh bin dch dng kiu tham chiu xc nh xem ta c th gi phng thc t tham chiu hay khng. Vi mt tham chiu kiu Appliance (thit b in) chiu ti mt i tng ElectricFan (qut in), trnh bin dch ch quan tm xem lp Appliance c phng thc m ta ang gi t tham chiu Appliance hay khng. Cn khi chng trnh chy, my o Java khng n kiu tham chiu (Appliance) v ch quan tm n i tng ElectricFan thc t ang nm trong b nh heap. Do , nu trnh bin dch chp thun li gi phng thc, li gi ch c th hot ng c nu nh phin bn ci cng c cc tham s v kiu tr v ging nh phin bn ca Appliance. Khi ai dng mt tham chiu Appliance gi turnOn() khng c i s, phin bn turnOn() ca Appliance s c chy, ngay c khi ElectricFan c mt bn turnOn() vi mt tham s int. Ni cch khc, n gin l phng thc turnOn(int level) ti ElectricFan khng phin bn turnOn() khng tham s ti Appliance!
Appliance
public boolea n turnOn() public boolea n turnOff()

MicrowaveOven
private boolean turnOn(int level)

ElectricFan
public boolean turnOn(int level)

Khng hp l! phng thc override khng c tht cht quyn truy nhp. Cng khng phi overload hp l v ta khng sa tham s

y khng phi override. khng c sa tham s ti phng thc override! Thc ra, y l overload hp l.

Hnh 7.5: V d v ci sai.

Vic ci phi tun th cc quy tc sau:

115

1. Danh sch tham s phi trng nhau, kiu gi tr tr v phi tng thch. Hp ng ca lp cha quy nh quy cch m cc phn m khc s dng cc phng thc ca n. Phng thc ca lp cha c th c gi vi danh sch i s nh th no th cng c th gi phng thc ca lp con vi danh sch i s . Phng thc ca lp cha tuyn b kiu tr v l g, th phng thc ca lp con cng phi khai bo chnh kiu tr v hoc mt kiu lp con ca kiu . Nh li rng mt i tng thuc lp con phi c m bo c th lm c bt c th g m lp cha tuyn b, do , vic tr v i tng lp con v tr ca i tng lp cha l vic an ton. 2. Phng thc khng c gim quyn truy nhp so vi phin bn ca lp cha. Ni cch khc, quyn truy nhp m phin bn ca lp con cho php phi bng hoc rng hn phin bn ca lp cha. Ta khng th ci mt phng thc public bng mt phin bn private. Nu khng, tnh hung xy ra l mt li gi phng thc c trnh bin dch chp nhn v tng l phng thc public nhng n khi n chy li b my o t chi v phin bn c gi li l private. Nh vy, ta hiu thm v hai mc quyn truy nhp: private v public. Cn hai mc quyn truy nhp khc s c ni n trong Mc 7.11. Ngoi ra cn c mt quy tc khc v ci lin quan n x l ngoi l, ta s ni v quy tc ny ti Ch-ng 10. 7.10. CHNG PHNG THC Cc v d v ci sai trong mc trc ni n khi nim ci chng phng thc (method overload). Ci chng phng thc ch n gin l c mt vi phng thc trng tn nhng khc danh sch i s. Phng thc chng khng lin quan n a hnh hay tha k. Mt phng thc ci chng khng phi phng thc ci . Ci chng phng thc cho php ta to nhiu phin bn ca mt phng thc, mi phin bn chp nhn mt danh sch i s khc nhau, nhm to thun li cho vic gi phng thc.

116

public class Cow { public void moo() { System.out.println(name + " says Moooo..."); } public void moo(int n) { Cow System.out.print(name + " says"); for (int i = 0; i < n; i++) moo() System.out.print(" Moooo..."); moo(int n) System.out.println(""); } }

Hnh 7.6: V d v phng thc chng

Ta s cn quay li cc trng hp p dng ci chng khi ni v cc hm khi to (constructor) trong Ch-ng 9. Do c ch ci chng phng thc khng phi tun th hp ng a hnh do lp cha quy nh, cc phng thc chng c tnh linh hot cao hn. Kiu tr v c th khc nhau. Ta c th ty thay i kiu tr v ti cc phng thc chng, min l danh sch i s khc nhau. Khc bit duy nht kiu tr v l khng . Nu khng, khng phi l vic ci chng hp l, trnh bin dch s cho rng ta ang nh ci phng thc. overload, ta nht nh phi sa danh sch tham s. C th ni rng hoc hn ch quyn truy nhp ty . Ta c th ty thay i quyn truy nhp ca phng thc chng v phng thc mi khng b buc phi tun theo hp ng a hnh, nu c, ca phng thc c.

7.11. CC MC TRUY NHP n y, ngoi hai t kha public v private quy nh mc truy nhp, ta c th hc thm v loi protected (c bo v). Mc ny tng kt cc kin thc v cc loi quyn truy nhp m Java quy nh. Ta c bn mc truy nhp (access level) v ba t kha tng ng private, protected v public, mc cn li l mc mc nh khng cn t kha. Cc mc truy nhp c lit k theo th t t cht ti lng nh sau: mc private: ch c m bn trong cng mt lp mi c th truy nhp c nhng th private. private y c ngha "ca ring lp" ch khng phi "ca ring i tng". Mt i tng Dog c th sa cc bin private hay gi phng thc private ca mt i tng Dog khc, nhng mt i tng Cat th thm ch khng 'nhn thy' cc th private ca Dog. Cc i tng Dog cng khng th 'nhn thy' cc bin / phng thc private ca cc i tng Animal m n tha k. Vy nn ngi ta ni rng lp con khng tha k cc bin / phng thc private ca lp cha. 117

mc truy nhp mc nh: cc bin/phng thc vi mc truy nhp mc nh ca mt lp ch c th c truy nhp bi m nm bn trong cng mt gi vi lp . mc protected: cc bin/phng thc vi mc protected ca mt lp ch c th c tha k bi cc lp con chu ca lp , k c nu lp con khng nm trong cng mt gi vi lp cha. mc public: m bt c u cng c th truy nhp cc th public (lp, bin thc th, bin lp, phng thc, hm khi to...)

public v private l hai mc c s dng nhiu nht. Mc public thng dng cho cc lp, hng (bin static final, xem chi tit ti Mc 10.6), cc phng thc dnh cho mc ch tng tc vi bn ngoi (v d cc phng thc get v set), v hu ht cc hm khi to. private c dng cho hu ht cc bin thc th v cho cc phng thc m ta khng mun c gi t bn ngoi lp (cc phng thc dnh ring cho cc phng thc public ca lp s dng). Mc mc nh c dng gii hn phm vi trong mt gi (xem thm v gi ti Ph lc B). Ngi ta dng gii hn ny v gi c thit k l mt nhm cc lp cng tc vi nhau nh l mt tp hp gn b vi nhau. Trong khi tt c cc lp bn trong cng mt gi thng cn truy nhp ln nhau, ch c mt nhm trong s cn phi l ra ngoi gi, nhm ny s dng cc mc public hay protected mt cch thch hp. Lu rng nu lp c mc protected, th cc phng thc bn trong n d c thuc mc public th bn ngoi cng khng th 'nhn thy', do khng th nhn thy lp cha cc phng thc . Mc protected gn nh ging ht vi mc mc nh, ch khc ch: n cho php cc lp con tha k cc th protected ca lp cha, k c khi lp con nm ngoi gi cha lp cha. Nh vy, mc ny ch p dng cho quan h tha k. Nu mt lp con nm ngoi gi c mt tham chiu ti mt i tng thuc lp cha, v gi s lp cha ny c mt phng thc protected, lp con cng khng th gi phng thc t tham chiu . Cch duy nht mt lp con c kh nng truy nhp mt phng thc protected l tha k phng thc . Ni cch khc, lp con ngoi gi khng th truy nhp phng thc protected, n ch s hu phng thc qua quan h tha k.

Nhng im quan trng: Lp con chuyn bit ha lp cha ca n. Lp con tha k tt c cc bin thc th v phng thc public ca lp cha, nhng khng tha k cc bin thc th v phng thc private ca lp cha. C th ci cc phng thc c tha k; khng th ci cc bin thc th c tha k (tuy c th gn tr li ti lp con, nhng y l hai vic khc nhau) 118

Dng th nghim IS-A kim tra xem cu trc tha k ca ta c hp l hay khng. Nu X l lp con ca Y th khng nh X IS-A Y phi hp l. Quan h IS-A ch c mt chiu. Con si no cng l ng vt, nhng khng phi con vt no cng l ch si. Khi mt phng thc c ci ti mt lp con, v phng thc c kch hot cho mt i tng ca lp , th phin bn ti lp con s c chy (ci g thp nht th c gi). Nu lp B l lp con ca A, lp C l lp con ca B, th mi i tng B thuc loi A, mi i tng C thuc loi B, v mi i tng C cng thuc loi A. (quan h IS-A) gi phin bn phng thc ca lp cha t trong lp con, s dng t kha super lm tham chiu ti lp cha.

119

Bi tp
1. in t thch hp vo cc ch trng di y a) Cc thnh vin c mc truy nhp _________ ca lp cha c th c truy nhp t trong lp cha v lp con. b) Trong quan h ___________, mt i tng ca mt lp con c th c i x nh mt i tng thuc lp cha. c) Trong quan h ___________ gia hai lp, i tng ca mt lp ny c bin thc th l tham chiu ti i tng thuc lp kia. 2. Cc pht biu sau y ng hay sai: a) Quan h HAS-A c ci t bng c ch tha k. b) Lp t c quan h IS-A i vi cc lp Bnh li v Phanh. c) Khi lp con nh ngha li mt phng thc ca lp cha trong khi gi nguyn danh sch tham s ca phng thc , lp con c gi l ci chng phng thc ca lp cha. d) C th i x vi cc i tng lp cha v cc i tng lp con nh nhau. 3. Hon chnh ci t sau c kt qu hin th nh trong hnh

120

4. Cho chng trnh sau vi mt trng.

Nu in vo cc lnh di y th kt qu ca chng trnh l g? a) b.m1(); c.m2(); a.m3(); b) c.m1(); c.m2(); c.m3(); c) a.m1(); b.m2(); c.m3(); d) a2.m1(); a2.m2(); a2.m3();

121

5. Vit cc lp Person, Employee, Manager nh thit k trong s sau. B sung cc phng thc thch hp nu thy cn. nh ngha li cc phng thc toString() cho ph hp vi d liu ti mi lp.

Vit lp PeopleTest chy th cc lp trn: to mt vi i tng v in thng tin ca chng ra mn hnh. Trong hm main ca lp PeopleTest, to mt mng kiu Person, gn ba i tng trn vo mng, ri dng vng lp in ra thng tin v cc i tng trong mng. c Ph lc B. Tch cc lp Person, Employee vo trong gi peoples. t Manager v PeopleTest gi mc nh (nm ngoi gi peoples). Chnh li cc khai bo quyn truy nhp ti cc lp chng trnh vit trn li chy c.

122

6. Vit cc lp Account, NormalAccount, NickelNDime, Gambler v cc loi ti khon ngn hng theo m t sau: Thng tin v mi ti khon ngn hng gm c s d hin ti (int balance), s giao dch thc hin k t u thng (int transactions). Mi ti khon cn p ng cc thao tc sau: a) Mt hm khi to cho php m mt ti khon mi vi mt s d ban u cho trc; b) Cc phng thc boolean deposit(int) cho php gi tin vo ti khon, boolean withdraw(int) cho php rt tin t ti khon. Cc phng thc ny tr v true nu giao dch thnh cng, nu khng th tr v false, tng t cp nht s m giao dch. c) Phng thc void endMonth() thc hin tt ton, s c m un qun l ti khon (nm ngoi phm vi bi ny) gi nh k vo cc thi im cui thng. Phng thc ny tnh ph hng thng nu c bng cch gi phng thc int endMonthCharge(), tr ph, in thng tin ti khon (s d, s giao dch, ph), v t li s giao dch v 0 sn sng cho thng sau. d) phng thc endMonthCharge() tr v ph ti khon trong thng va qua. Ph ti khon c tnh ty theo tng loi ti khon. Loi NormalAccount tnh ph hng thng l 10.000 ng. Loi NickelNDime tnh ph theo s ln rt tin, ph cho mi ln rt l 2000 ng, cui thng mi thu. Loi Gambler khng tnh ph cui thng nhng thu ph ti tng ln rt tin theo xc sut nh sau: Vi xc sut 49%, ti khon khng b ht i ng no v giao dch thnh cng min ph. Vi xc sut 51%, ph rt tin bng ng s tin rt c. Account l lp cha ca NormalAccount, NickelNDime, v Gambler. Cn thit k sao cho ti s dng v trnh lp code c cng nhiu cng tt.

123

Chng 8.

Lp tru tng v interface

Tha k mi ch l khi u. khai thc c ch a hnh, cc ngn ng lp trnh hng i tng cung cp cc c ch kiu tru tng (abstract type). Cc kiu tru tng c ci t khng y hoc khng c ci t. Nhim v chnh ca chng l gi vai tr kiu tng qut hn ca mt s cc kiu khc. Kiu tru tng khng h c ci t l cc interface (khng phi khi nim giao din ha ngi dng GUI). Kiu tru tng c ci t mt phn l cc lp tru tng. Chng mang li s linh hot v kh nng m rng cho thit k hng i tng. V d cui chng trc v lp Vet c th hot ng vi loi Animal bt k chm vo b mt ca vn . Ta s bn v cc kiu tru tng trong chng ny. 8.1. MT S LP KHNG NN TO THC TH Nh li thit k cy ph h cc loi ng vt m ta lm trong chng trc. l gii php khng ti. Ta thit k sao cho cc on m b trng lp l ti thiu, v ta ci nhng phng thc m ta cho l nn c ci t c th cho cc lp con.

l gii php tt nu nhn t gc a hnh, bi v ta c th thit k cc chng trnh dng Animal vi cc i s kiu Animal (k c khai bo mng Animal), sao cho kiu Animal bt k - k c nhng kiu ta cha bao gi ngh ti c 124

th c truyn vo v s dng ti thi gian chy. Ta t vo Animal giao thc chung cho tt c cc loi Animal (bn phng thc m ta tuyn b rng loi Animal no cng c), v ta sn sng xy dng cc i tng mi loi Lion, Tiger v Hippo. T v d ca cc chng trc, ta quen thuc vi vic to v dng i tng Dog, Cat, Wolf, vic to i tng mi kiu Lion hay Tiger cng khng c g c bit. Nhng nu ta to mt i tng Animal th sao? Mt con ng vt chung chung trng n nh th no? N c hnh g? mu g? to c no? c my chi? my mt? i tng Animal cha cc gi tr g ti cc bin thc th? Ta dng mt i tng Animal cho vic g nu khng th tr li cc cu hi trn? Tuy nhin, ta li cn mt lp Animal cho c ch tha k v a hnh. V ta mun rng cc lp trnh vin ch to cc i tng thuc cc lp con t tru tng hn ca Animal, ch khng bao gi to i tng ca chnh lp Animal. Ta mun cc i tng Tiger, Lion, Dog, Cat, ta khng mun cc i tng Animal. Ta ly mt v d khc. Mt th vin ha cho php v (draw), xa (erase), di chuyn (move) cc hnh ha. Trong th vin c cc lp Circle (hnh trn), Rectangle (hnh ch nht) v c th tn dng quan h tha k v khi cn c th x l ng lot cc thnh phn ca mt bn v chng hn, th vin c thm lp tng qut Shape (hnh) l lp cha chung ca cc hnh ha . Liu c khi no ta cn to mt i tng thuc lp Shape? N c hnh dng nh th no? Lm th no v/xa n? Ta vit ni dung g cho cc phng thc draw v erase ca lp Shape? Chng l trng hoc thng bo g ? L c ai to mt i tng Shape ri gi phng thc m ng ra n khng nn lm g? Mt lp cha khng bao gi c dng to i tng c gi l lp c s tru tng, hay ngn gn l lp tru tng (abstract class). Vi nhng lp thuc din ny, trnh bin dch s bo li bt c on m no nh to thc th ca lp . Tt nhin, ta vn c th dng tham chiu thuc kiu lp tru tng. Thc ra y l mc ch quan trng nht ca vic s dng lp tru tng - c a hnh cho i s, kiu tr v, v mng. Bn cnh l mc ch s dng lp tru tng lm ni t cc phng thc dng chung cc lp con tha k. Khi ta thit k cu trc tha k, ta cn quyt nh lp no tru tng, lp no c th. Cc lp c th (concrete) l cc lp c trng c th to thc th. Trong phm vi lp trnh, mt lp c th c ngha n gin l: ta c php to i tng thuc loi . Cc lp ta vn thy trong cc v d t u cun sch ny u l cc lp c khai bo l lp c th. quy nh mt lp l tru tng, ta t t kha abstract vo u khai bo lp. V d:
abstract class Canine extends Animal { public void roam() { } }

Kt qu l trnh bin dch s khng cho php ta to thc th ca lp na. 125

public class CanineTestDrive { public static void main(String [] args) { Canine c; ok, c th dng tham chiu kiu tru tng c = new Dog(); c = new Canine(); trnh bin dch s bo li, lp Canine tru tng nn khng th c.roam(); to i tng Canine } }

Mt lp tru tng gn nh8 v dng, v gi tr, tr khi n c lp con. 8.2. LP TRU TNG V LP C TH Mt lp khng phi l lp tru tng th n l lp c th Trong cy ph h Animal, nu ta cho Animal, Feline, v Canine l cc lp tru tng, th cn li s l cc lp c th.

Xem qua b th vin chun ca Java, ta s thy c rt nhiu lp tru tng, c bit trong th vin giao din ha GUI. Mt thnh phn giao din ha chung chung (GUI Component) c hnh dng nh th no? Lp Component l lp cha ca cc lp lin quan n giao din ha cho nhng th nh nt bm, ca s son tho, thanh cun, hp hi thoi, v.v..Ta khng mun to mt i tng Component tng qut v t n vo mn hnh, ta mun to nhng th chng hn nh JButton lm mt nt bm. Ni cch khc, ta ch to thc th t cc lp con c th ca Component nhng khng bao gi t chnh Component. Vy khi no mt lp nn l lp tru tng, khi no th nn l lp c th? Bt chc l lp tru tng. Bt bi v Bt my c l cng nn l cc lp tru tng. Vy n khi no th cc lp tr thnh lp c th? Bt my Parker liu c thnh lp c th hay vn l lp tru tng? C v nh Bt my Hng H nt hoa 2008 chc chn l lp c th. Nhng lm th no chc chn?

C mt ngoi l: mt lp tru tng c th c cc thnh vin static hu dng (xem Ch-ng 10)

126

8.3. PHNG THC TRU TNG Khng ch lp, ta cn c th khai bo cc phng thc tru tng. Mt lp tru tng c ngha phi to lp con cho n; cn mt phng thc tru tng c ngha rng n phi c ci . Ta c th quy nh rng mt vi (hoc tt c) cc hnh vi ca mt lp tru tng phi c ci t bi mt lp con c tnh c trng hn, nu khng cc hnh vi l v ngha. Ni cch khc, ta khng th ngh ra mt ci t tng qut no cho phng thc m c th hu ch cho cc lp con. Mt phng thc makeNoise() tng qut s lm g? C php Java quy nh rng phng thc tru tng khng c thn phng thc. Dng khai bo phng thc kt thc ti du chm phy v khng c cp ngoc { }.
public abstract void makeNoise();

Nu ta khai bo mt phng thc l abstract, ta phi nh du lp cng l abstract. Ta khng th t mt phng thc tru tng bn trong mt lp c th. Tuy nhin, ta c th c phng thc khng tru tng bn trong mt lp tru tng. Cc phng thc tru tng phi c ci ti mt lp con. Cc phng thc tru tng khng c ni dung, n tn ti ch phc v c ch a hnh. iu c ngha rng lp c th u tin nm di n trn cy ph h bt buc phi ci tt c cc phng thc tru tng; cc lp con tru tng c th b qua vic ny. V d, nu c Animal v Canine u tru tng v cng c cc phng thc tru tng, lp Canine khng buc phi ci cc phng thc tru tng ca Animal. Nhng ngay khi ta i xung n lp con c th u tin, chng hn Dog, lp s phi ci tt c cc phng thc tru tng tha k t Animal v Canine. Tuy nhin, nh li rng mt lp tru tng c th cha c cc phng thc tru tng cng nh c th, cho nn Canine chng hn c th ci mt phng thc tru tng tha k t Animal, dn ti Dog khng phi lm vic ny na. Cn nu Canine khng ci phng thc tru tng no t Animal, Dog s phi ci tt c cc phng thc tru tng ca Animal cng nhng nhng phng thc tru tng m Canine b sung. Khi ta ni "ci t phng thc tru tng", iu c ngha ta ci phng thc vi mt thn hm c mt phin bn c th ca phng thc (tt nhin phin bn mi khng c t kha abstract trong khai bo). 8.4. V D V A HNH Gi s ta mun vit mt lp danh sch qun l cc i tng Dog m khng dng n cc cu trc danh sch c sn trong th vin Java. Bc u, ta ch cn 127

mt phng thc add() a cc i tng Dog vo danh sch. Ta dng mt mng Dog n gin vi kch thc 5 lu cc i tng Dog c a vo danh sch. Khi trong danh sch 5 i tng, ta vn c th tip tc gi phng thc add() nhng n s khng lm g. Nu cha 5, phng thc add() s gn i tng tip theo vo v tr tip theo cn trng ri tng ch s ca v tr tip theo cn trng (nextIndex) thm 1.

Nhng nu ta cn mun qun l c mo ln ch trong danh sch? C mt vi la chn. Th nht: vit thm lp MyCatList dnh ring cho cc i tng Cat. Th hai: vit mt lp DogAndCatList chung, trong c hai mng, mt dnh cho cc i tng Dog, mt dnh cho cc i tng Cat. Th ba: vit mt lp AnimalList trong c th chp nhn cc i tng thuc lp con bt k ca Animal (phng trng hp c t li thay i yu cu nhn thm cc loi vt khc). La chn th ba gn gng v c kh nng m rng cao nht nn ta s dng cho phin bn th hai. Ta s sa lp MyDogList, tng qut ha n chp nhn cc lp con bt k ca Animal thay v ch Dog. L-gic chng trnh vn gi nguyn nh c, ch c cc thay i c nh m trong on m di y:

128

public class AnimalList { private Animal[] animals = new Animal[5]; private int nextIndex = 0;

AnimalList
Animal[] animals int nextIndex

public void add(Animal a) { add(Animal a) if (nextIndex < animals.length) { animals[nextIndex] = a; System.out.print("Animal added at " + nextIndex); nextIndex++; } } }

public class AnimalTestDrive { public static void main(String [] args) { AnimalList list = new AnimalList(); d = new Dog(); c = new Cat(); list.add(d); % java AnimalTestDrive list.add(c); Animal added at 0 } Animal added at 1 }
Hnh 8.1: V d a hnh vi cc lp Animal.

Ta li ly v d Shape ni n u chng. Lp cha tng qut Shape nn l lp tru tng do ng dng khng cn v khng nn to i tng Shape. Ngoi ra, cc phng thc draw v erase ca lp ny cng nn l phng thc tru tng do ta khng th ngh ra ni dung g hu ch cho chng. Cc lp con c th, Point, Circle, Rectangle, v cc lp m sau ny s b sung vo th vin khi cn, s nh ngha cc phin bn vi ni dung ring c th ph hp vi chnh mnh. Chng hn nh v d trong Hnh 8.2.
Shape
int x int y draw() erase() moveTo(x, y)

Point
draw() erase()

Circle
double radiu s draw() erase()

Rectangle
int height int width draw() erase()

129

abstract public class Shape { protected int x, y; protected Shape (int _x, int _y) { x = _x; y = _y; } abstract public void draw(); abstract public void erase(); public void moveTo(int _x, int _y) { erase(); x = _x; y = _y; draw(); } } public class Circle extends Shape { private double radius; public Circle(int _x, int _y, double _r) { super(_x, _y); radius = _r; } public void draw() { System.out.println("Draw circle"); } public void erase() { System.out.println("Erase circle"); } }
Hnh 8.2: V d a hnh vi cc lp Shape.

Khc vi draw v erase, moveTo li l phng thc c th nh ngha ngay ti lp Shape. Thut ton ba bc cho moveTo l nh nhau cho mi hnh: (1) xa ti v tr hin hnh, (2) sa ta hnh, (3) v ti v tr mi, mc d xa nh th no v v nh th no l ty theo tng loi hnh c th. Hiu ng a hnh cho php moveTo dng n cc phin bn draw v erase khc nhau ty theo n c gi cho i tng thuc loi hnh no. Khi th vin c b sung thm cc lp c t cc loi hnh khc, ta ch phi ci draw v erase cho loi hnh m khng phi lm thm g cho cc phng thc bin i hnh c quy trnh chung c nh ngha sn tng t nh moveTo. V d ny cng minh ha mt mu thit k c tn Template Method (phng thc khun mu). Xem Hnh 8.3. y, Shape l lp tru tng (AbstractClass) nh ngha mt phng thc khun mu moveTo, v quy nh hai thao tc c bn (PrimitiveOperation) l erase v draw m phng thc khun mu dng n. Circle l lp con c th (ConcreteClass), n ci t cc thao tc c bn ny. y l mt trong nhng mu thit k thng dng nht.

130

Hnh 8.3: Mu thit k Template Method.

8.5. LP Object Thm mt bc na, nu ta mun c danh sch lu c c nhng i tng khng phi ng vt th sao? Ta c th tip tc thay i theo kiu sa kiu mng, kiu i s phng thc add() thnh ci g tng qut hn v tru tng hn Animal? Nhng ta khng vit lp cha cho Animal. Thc ra Animal c lp cha. i vi Java, tt c cc lp u l lp con ca lp Object. Object l t tin ca tt c. Ngay t u, ta vit cc lp con ca Object m khng bit, ta vit lp con ca Object m khng cn phi khai bo quan h tha k bng t kha extends. Bt k lp no khng c khai bo tng minh l lp con ca mt lp khc th u c khai bo n l lp con ca Object. Vy nn, ta c Dog khng phi l lp con trc tip ca Object, cn Animal l lp con trc tip ca Object, v tt c Dog, Cat, Canine, Animal... u nm trong cy ph h c gc l Object. Vi tt c cc lp u nm trong cy tha k c Object ti gc, c ch a hnh cho php ta to cc cu trc d liu dnh cho i tng thuc tt c cc lp. Chng hn mt mng kiu Object c th lu i tng thuc loi Animal, Cow, Dog, Cat, PhoneBook, String... Trong th vin chun ca Java c lp ArrayList c nh ngha qun l cc i tng thuc kiu Object. ArrayList c th dng qun l i tng thuc tt c cc kiu. Lp Object cho cc lp khc tha k nhng g? Trong cc phng thc c tha k ca Object c bn phng thc thng dng: boolean equals(Object o) kim tra xem hai i tng hin hnh c 'bng nhau' hay khng, xem thm v ngha ca khi nim 'bng nhau' ny ti Ch-ng 13.

131

Class getClass() tr v lp m i tng hin hnh c to t ,

int hashCode() tr v m bm ca i tng hin hnh, ta tm thi xem m ny nh l mt nh danh ca i tng, v

String toString() tr v biu din dng String ca i tng, ta thng ci phng thc ny tr v biu din String theo mun ca ta thay v tr v chui k t c kt xut mt cch tng qut nh v d bn di.

8.6. I KIU KHI I TNG MT HNH VI CA MNH Rc ri ca vic dng c ch a hnh coi mi th nh l mt Object hay coi cc i tng ng vt nh l mt Animal l i khi cc i tng c v nh nh mt (tm thi) cc c trng ca mnh. Dog c v mt cc c im ca ch. Ta hy xem chuyn g xy ra khi mt phng thc tr v mt tham chiu ti mt i tng Dog nhng khai bo kiu tr v l Animal. Nh li lp AnimalList ta to qun l danh sch cc con vt. Gi s AnimalList c thm phng thc get(int index) tr v tham chiu ti i tng ng ti v tr index trong danh sch.

Ta th nghim bng chng trnh DogTestDrive, trong mt i tng Dog c to v a vo mt danh sch AnimalList. Sau ta gi phng thc get() ca danh sch ly li chnh i tng va a vo. 132

public class DogTestDrive { public static void main(String [] args) { AnimalList list = new AnimalList(); Dog d = new Dog(); list.add(d); li bin dch! d = list.get(0); } % javac DogTestDrive.java } DogTestDrive.java:6: incompatible
found : Animal required: Dog d = list.get(0); ^ 1 error

types

rng phng thc get() gi t list tr v mt tham chiu ti chnh i tng Dog ni trn, nhng di dng mt tham chiu kiu Animal. Vic ny hon ton hp l. Nhng trnh bin dch khng bit rng th c tr v t thc cht ang chiu ti mt i tng Dog, cho nn n khng cho php ta gn gi tr tr v cho mt tham chiu kiu Dog. Nu ta gn gi tr cho mt tham s kiu Animal, chng hn, Animal a = list.get(0), th trnh bin dch s khng phn nn g. Tuy nhin, khi ta s ch c th gi cc phng thc m Dog tha k t Animal, chng hn roam(), ch khng th gi phng thc m ch Dog mi c, nh chaseCats() chng hn.

Ngay c khi ta bit chc chn i tng c hnh vi chaseCats (n thc s l mt i tng Dog!), trnh bin dch ch nhn thy n nh l mt th kiu Animal, m Animal th khng c chaseCats(). Vn y ging nh ta ni n Mc 7.9. xc nh xem ta c th gi mt phng thc no hay khng, trnh bin dch da trn kiu tham chiu ch khng da trn kiu i tng thc t. Vy c ch tha k c bn cht nh th no? Mi i tng cha tt c nhng g n tha k t tt c cc lp cha, ng, t tin ca n, trong c c lp Object. Vy nn n c th c coi l mt thc th ca mi lp cha ng . Ly v d lp Cow n gin. Mt i tng Cow c th c i x khng ch nh mt i tng Cow, n cn c th c xem nh mt Object. Khi ta gi new Cow(), ta c mt i tng ti heap mt i tng Cow nhng 133

i tng c mt ci li l phn Object (ch ci O vit hoa) ca n. Mt tham chiu kiu Cow ti i tng ny c th 'nhn thy' ton b i tng Cow, do c th truy nhp ton b cc phng thc ca Cow, bao gm c cc phng thc c tha k. Trong khi , mt tham chiu kiu Object chiu ti cng mt i tng ch c th 'nhn thy' phn Object ca i tng , do ch c th truy cp phn .

Hnh 8.4: Cu trc lp con v phn c tha k.

Nh vy ta gii thch c ti sao khi dng mt tham chiu kiu lp cha cho i tng thuc lp con th lp con c v nh mt bn sc ring. Nhng ta vn cha gii quyt xong vn ca chng trnh DogTestDrive. i tng m ta ly ra t danh sch list thc s l Dog, vy lm cch no gi c phng thc ca Dog? Ta phi dng mt tham chiu c khai bo kiu Dog. Sao chp tham chiu kiu Animal m ta ang c v p sang kiu Dog ghi vo mt tham chiu kiu Dog. Sau , ta c th dng tham chiu Dog gi phng thc ca Dog nh bnh thng.

Nu hnh ng p kiu ca ta l sai, ngha l i tng ang quan tm thc ra khng phi kiu Dog, th khi chy, chng trnh ca ta s b ngt gia chng do li run-time ClassCastException. Do , trong nhng trng hp m ta khng chc chn v kiu ca i tng, ta c th dng ton t instanceof kim tra.
if (o instance of Dog) { Dog d = (Dog) o;

134

8.7. A THA K V VN HNH THOI Cy tha k ng vt vn c thit k dng cho bi ton gi lp mi trng sng ca ng vt. Nu cn xy dng phn mm dy hc cho mn ng vt hc, ta s ti s dng c cc lp trong cy tha k . Gi s by gi ta mi nhn c yu cu xy dng phn mm PetShop cho ca hng th cnh, v ta mun dng lp Dog cho phn mm mi. Hin ti cc lp ng vt cha c cc hnh vi ca th cnh (Pet) nh play() v beFriendly(). Vi vai tr lp trnh vin cho lp Dog, ta s lm g? Ch vic thm nhng phng thc cn thit? Lm vy ta s khng ph v m ca bt k ai khc v ta khng ng n cc phng thc c sn m m ca ngi khc c th gi cho cc i tng Dog. ng nhng cha . Lu rng y l phn mm cho ca hng th cnh, khng ch c ch, ta s khng ch cn n lp Dog. Vic b sung cc phng thc mi vo Dog, do , c nhng nhc im g? Ta ln lt xt tng phng n: Phng n 1: t cc hnh vi th cnh ti lp Animal. u im: Tt c cc lp ng vt lp tc c cc hnh vi th cnh. Ta khng phi sa cc lp khc, v cc lp con s c to trong tng lai cng c tha k. Lp Animal c th dng lm kiu a hnh trong chng trnh mun i x ng lot cc i tng Animal nh l th cnh. Nhc im: H m, s t, ch si hu nh chc chn khng phi th cnh nn Hippo, Lion, v Wolf khng nn c cc hnh vi th cnh. K c nu ci cc hnh vi th cnh ti cc lp ny chng 'khng lm g' th vn khng n, v khi hp ng ca cc lp Hippo, Lion,... cho nhng i tng khng bao gi l th cnh vn c nhng hnh vi ca th cnh. y l cch tip cn ti. Ta khng nn a vo lp Animal nhng th khng p dng cho tt c cc lp con ca n. Phng n 2: ch t cc hnh vi th cnh ti cc lp cn n n. u im: Khng cn rc ri v chuyn h m lm th cnh. Dog v Cat c th ci cc phng thc v cc lp khc khng b lin ly. Nhc im: Hai vn nghim trng: Th nht, phi c giao thc chung m t nay tr i tt c cc lp trnh vin cho cc lp Animal phi bit. Giao thc bao gm cc phng thc m ta quyt nh rng tt c cc lp th cnh phi c, tn l g, tr v kiu g, i s kiu g. Ni cch khc l hp ng ca th cnh. V ta hin khng c cch g m bo s khng c ai nhm.

135

Th hai, ta khng c a hnh cho cc phng thc th cnh . Khng th dng tham chiu Animal cho cc phng thc th cnh.

Tm li, ta cn g? o t hnh vi th cnh ti cc lp th cnh v ch ti m thi. o m bo rng tt c cc lp th cnh hin c cng nh s c vit s phi c tt c cc phng thc c quy nh (tn, i s, kiu tr v...) m khng phi ngi hy vng rng ai s lm ng. o Tn dng c li th ca a hnh, sao cho c th gi c phng thc ca tt c cc loi th cnh m khng phi dng ring cc kiu i s, kiu tr v, dng tng mng ring cho tng loi mt. C v nh ta cn n HAI lp cha trong cy tha k.

Khi lp con tha k t nhiu hn mt lp cha, ta c tnh trng c gi l "a tha k". Hnh thc a tha k ny c tim nng gy ra mt rc ri nghim trng c gi l Vn Hnh thoi (the Diamond problem) nh v d trong Hnh 8.5. Trong v d , hai lp DVDBurner (thit b ghi a DVD) v CDBurner (thit b ghi a CD) cng l lp con ca DigitalRecorder (u thu k thut s), c hai ci phng thc burn() v cng tha k bin thnh vin i. Gi s bin i c dng ti DVDBurner cng nh CDBurner, nhng vi cc gi tr khc nhau. Chuyn g xy ra nu ComboDrive lp con tha k c hai lp trn cn dng n c hai gi tr i ? Cn na, khi gi phng thc burn() cho mt i tng ComboDrive, phin bn burn() no s c chy?

136

DigitalRecorder
int i burn()

CDBurner
burn()

DVDBurner
burn()

ComboDrive

Hnh 8.5: V d v vn Hnh thoi ca a tha k.

Ngn ng lp trnh no cho php a tha k s phi gii quyt nhng tnh trng ri rm trn, s phi c nhng quy tc c bit x l nhng tnh hung nhp nhng ng ngha c th xy ra. C++ l mt trong nhng ngn ng nh vy. Java c thit k theo tiu ch n gin, nn n khng cho php mt lp c tha k t nhiu hn mt lp cha. Vy ta phi gii quyt bi ton th cnh nh th no vi Java? 8.8. INTERFACE Gii php m Java cung cp l interface. Thut ng interface ca ting Anh thng c dng vi ngha 'giao din', chng hn nh "giao din ngi dng", hay nh trong cu "Cc phng thc public ca mt lp l giao din ca n i vi bn ngoi". Tuy nhin, trong mc ny, ta ni n khi nim interface vi ngha l mt cu trc lp trnh ca Java c nh ngha vi t kha interface (tng t nh cu trc lp c nh ngha vi t kha class). Cu trc interface ny cho php ta gii quyt bi ton a tha k, cho ta hng phn ln cc ch li mang tnh a hnh m a tha k mang li, nhng trnh cho ta cc rc ri nhp nhng ng ngha nh gii thiu trong mc trc. Nguy c nhp nhng ng ngha c trnh bng cch rt n gin: phng thc no cng phi tru tng! Theo , lp con buc phi ci t cc phng thc. Nh vy, khi chng trnh chy, my o Java khng phi bi ri la chn gia hai phin bn m mt i tng c tha k. Mt interface, do , ging nh mt lp thun ty tru tng bao gm ton cc phng thc tru tng v khng c bin thc th. Nhng v c php th interface c khc lp tru tng mt cht. nh ngha mt interface, ta dng t kha interface thay v class nh i vi lp: 137

public interface Pet {...}

i vi mt lp tru tng, ta cn to lp con c th. Cn i vi mt interface, ta to lp ci t cc phng thc tru tng m interface quy nh. Lp c gi l lp ci t interface m ta ang ni n. khai bo rng mt lp ci t mt interface, ta dng t kha implements thay v extends, theo sau l tn ca interface. Mt lp c th ci t mt vi interface v ng thi l lp con ca mt lp khc. Chng hn lp Dog va l lp con ca Canine, va l lp ci t interface Pet:
class Dog extends Canine implements Pet {...}

V d c th v interface Pet v lp Dog ci t Pet c cho trong Hnh 1.1. Cc phng thc ca interface u ngm nh l public v abstract, do ta khng bt buc phi dng hai t kha public abstract khi khai bo cc phng thc. Do l cc phng thc tru tng nn chng khng c thn m ch c mt du chm phy cui dng khai bo. Trong lp Dog c hai loi phng thc: cc phng thc ci t interface Pet, v cc phng thc ci lp cha Canine nh thng thng.

Hnh 8.6: Lp Dog ci t interface Pet.

Nh vy ta c th dng cu trc interface thc hin mt th gn ging a tha k. N khng hn l a tha k ch: khc vi lp tru tng, ta khng th t m ci t ti cc interface. Khi cc phng thc ti interface u tru tng, v do khng th ti s dng, ta c ch li g y? Cu tr li l a hnh v a hnh. Khi ta dng mt interface thay cho cc lp ring bit lm tham s v gi tr tr v ca phng thc, ta c th truyn lp bt k no ci t interface vo v tr ca tham s hay gi tr tr v . Khng ch c vy, cc lp nm trn cc cy tha k khc nhau c th cng ci t mt interface. Trong thc t, i vi a s thit k tt, vic interface khng th cha m ci t khng phi l vn . L do l hu ht cc phng thc ca interface c c im l 138

khng th c ci t mt cch tng qut, ng no cng phi ci cc phng thc ny ngay c nu chng khng b buc phi l phng thc tru tng. Quay tr li vi rng cc lp nm trn cc cy tha k khc nhau c th cng ci t mt interface. Ta c v d sau: Ch my RoboDog l mt loi robot v cng l mt loi th cnh. Lp RoboDog thuc cy tha k Robot ch khng thuc cy Animal. Tuy nhin, n cng c th ci interface Pet nh Cat v Dog.

Khng ch c vy, mi lp cn c th ci t nhiu hn mt interface. S linh hot ca interface l c im v cng quan trng i vi vic s dng Java API. V d, mt lp i tng bt c u trn mt cy tha k c th c lu ra file, ta c th cho lp ci interface Serializable. Khi no nn cho mt lp l lp c lp, lp con, lp tru tng, hay nn bin n thnh interface? Mt lp nn l lp c lp, ngha l n khng tha k lp no (ngoi tr Object) nu n khng tha mn kim tra IS-A i vi bt c loi no khc. Mt lp nn l lp con nu ta cn cho n lm mt phin bn chuyn bit hn ca mt lp khc v cn ci hnh vi c sn hoc b sung hnh vi mi. Mt lp nn l lp cha nu ta mun nh ngha mt khun mu cho mt nhm cc lp con, v ta c mt cht m ci t m tt c cc lp con kia c th s dng. Cho lp lm lp tru tng nu ta mun m bo rng khng ai c to i tng thuc lp . Dng mt interface nu ta mun nh ngha mt vai tr m cc lp khc c th nhn, bt k cc lp thuc cy tha k no.

Nhng im quan trng: Khi mun cm to i tng t mt lp, ta dng t kha abstract ti nh ngha lp tuyn b lp l lp tru tng. Mt lp tru tng c th c cc phng thc tru tng cng nh khng tru tng. Nu mt lp c d ch mt phng thc tru tng, lp buc phi l lp tru tng. 139

Mt phng thc tru tng khng c thn, khai bo phng thc kt thc bng du chm phy. Mt lp c th phi ci t hoc c tha k ci t ca tt c cc phng thc tru tng. Mi lp Java u l lp con trc tip hoc gin tip ca lp Object. Nu ta dng mt tham chiu gi phng thc, tham chiu c khai bo thuc lp g hay interface g th ta ch c gi cc phng thc c trong lp hoc interface , bt k i tng m tham chiu ang chiu ti l i tng thuc lp no. Mt bin tham chiu lp cha c th c gn gi tr l tham chiu kiu lp con bt k m khng cn i kiu. C th dng php i kiu gn gi tr l tham chiu kiu lp cha cho mt bin tham chiu kiu lp con, tuy nhin khi chy chng trnh, php i kiu s tht bi nu i tng ang c chiu ti khng thuc kiu tng thch vi php i kiu. Java khng h tr a tha k do vn Hnh thoi. Java ch cho php mi lp ch c duy nht mt lp cha. Mt interface tng t vi mt lp thun ty tru tng. N ch nh ngha cc phng thc tru tng. Mt lp c th ci t nhiu interface. Lp no ci t mt interface th phi ci tt c cc phng thc ca interface , do tt c cc phng thc interface u l cc phng thc tru tng public.

c thm
Bn c c th tm hiu su hn v cc mu thit k ti ti liu sau: 1. Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley, 1994.

140

Bi tp
1. in t thch hp vo cc ch trng di y a) Nu mt lp cha t nht mt phng thc tru tng th n phi l lp ________ b) Cc lp m t c th to i tng c gi l cc lp _______ c) _______ cho php s dng mt tham chiu kiu lp cha gi phng thc t cc i tng ca lp cha cng nh lp con, cho php ta lp trnh cho trng hp tng qut. d) Cc phng thc khng phi phng thc interface v khng cung cp ci t phng thc phi c khai bo vi t kha _______ 2. Cc pht biu sau y ng hay sai: a) Nu mt lp cha khai bo mt phng thc tru tng th lp con ca n buc phi ci phng thc . b) Mt i tng thuc mt lp ci t mt interface c th c coi l mt i tng thuc kiu interface . 3. Phng thc tru tng l g? Hy m t cc tnh hung m ta nn khai bo mt phng thc l phng thc tru tng. 4. So snh lp tru tng v interface, khi no ta nn dng lp tru tng, khi no nn dng interface? 5. a hnh h tr nh th no cho kh nng m rng cy tha k? 6. Lit k 4 kiu gn tham chiu lp cha v lp con cho cc bin kiu lp cha v lp con, mi kiu c nhng thng tin quan trng g? 7. Gii thch quan im rng a hnh cho php lp trnh tng qut thay v lp trnh cho tng trng hp c th. Dng v d minh ha. Lp trnh tng qut mang li nhng ch li g? 8. Mt lp con c th tha k giao din hay ci t t mt lp cha. Mt cy tha k c thit k cho tha k giao din khc vi cy tha k c dnh cho tha k ci t nh th no? 9. Ci t 03 lp v 02 interface trong s sau. Trong cc lp Numeral (s) v Square (bnh phng) ci t interface Expression (biu thc, cn lp Addition (php cng) ci t interface BinaryExpression (nh thc biu thc c hai ton hng), interface ny li tha k Expression.

141

<<interface>> Expression
+toString:String + evalua te()

Numeral
int: value

<<interface>> BinaryExpression
+ left(): Expression +right() : Expression

Square
Expression: expression

Addition
Expression: left Expression: right

142

Chng 9.

Vng i ca mt i tng

Trong chng ny, ta ni v vng i ca i tng: i tng c to ra nh th no, n nm u, lm th no gi hoc vt b i tng mt cch c hiu qu. C th, chng ny trnh by v cc khi nim b nh heap, b nh stack, phm vi, hm khi to, tham chiu null... 9.1. B NH STACK V B NH HEAP Trc khi ni v chuyn g xy ra khi ta to mt i tng, ta cn ni v hai vng b nh stack v heap v ci g c lu tr u. i vi Java, heap v stack l hai vng b nh m lp trnh vin cn quan tm. Heap l ni ca cc i tng, cn stack l ch ca cc phng thc v bin a phng. My o Java ton quyn qun l hai vng b nh ny. Lp trnh vin khng th v khng cn can thip. u tin, ta hy phn bit r rng bin thc th v bin a phng, chng l ci g v sng u trong stack v heap. Nm vng kin thc ny, ta s d dng hiu r nhng vn nh phm vi ca bin, vic to i tng, qun l b nh, lung, x l ngoi l... nhng iu cn bn m mt lp trnh vin cn nm c (m ta s hc dn trong chng ny v nhng chng sau). Bin thc th c khai bo bn trong mt lp ch khng phi bn trong mt phng thc. Chng i din cho cc trng d liu ca mi i tng (m ta c th in cc d liu khc nhau cho cc thc th khc nhau ca lp ). Cc bin thc th sng bn trong i tng ch ca chng.

Bin a phng, trong c cc tham s, c khai bo bn trong mt phng thc. Chng l cc bin tm thi, chng sng bn trong khung b nh ca phng thc v ch tn ti khi phng thc cn nm trong b nh stack, ngha l khi phng thc ang chy v cha chy n ngoc kt thc (}).

Vy cn cc bin a phng l cc i tng? Nh li rng trong Java mt bin thuc kiu khng c bn thc ra l mt tham chiu ti mt i tng ch khng phi chnh i tng . Do , bin a phng vn nm trong stack, cn i tng m n chiu ti vn nm trong heap. Bt k tham chiu c khai bo u,

143

l bin a phng ca mt phng thc hay l bin thc th ca mt lp, i tng m n chiu ti bao gi cng nm trong heap.
public void foo() { Cow c = new Cow(); }

:Cow c
Cow i tng Cow

stack

heap

Vy bin thc th nm u? Cc bin thc th i km theo tng i tng, chng sng bn trong vng b nh ca i tng ch ti heap. Mi khi ta gi new Cow(), Java cp pht b nh cho i tng Cow ti heap, lng b nh c cp pht ch lu gi tr ca tt c cc bin thc th ca i tng . Nu bin thc th thuc kiu c bn, vng b nh c cp pht cho n c kch thc ty theo kch thc ca kiu d liu n c khai bo. V d mt bin int cn 32 bit. Cn nu bin thc th l i tng th sao? Chng hn, Car HAS-A Engine ( t c mt ng c), ngha l mi i tng Car c mt bin thc th l tham chiu kiu Engine. Java cp pht b nh bn trong i tng Car lu bin tham chiu engine. Cn bn thn bin ny s chiu ti mt i tng Engine nm bn ngoi, ch khng phi bn trong, i tng Car.

Hnh 9.1: i tng c bin thc th kiu tham chiu.

Vy khi no i tng Engine c cp pht b nh trong heap? Khi no lnh new Engine() cho n c chy. Chng hn, trong v d Hnh 9.2, i tng Engine c to mi khi to gi tr cho bin thc th engine, lnh khi to nm ngay trong khai bo lp Car. 144

Hnh 9.2: Bin thc th c khi to khi khai bo.

Cn trong v d Hnh 9.3, khng c i tng Engine no c to khi i tng Car c cp pht b nh, engine khng c khi to. Ta s cn n cc lnh ring bit sau to i tng Engine v gn tr cho engine, chng hn nh c.engine = new Engine(); trong Hnh 9.1.
class Car { Engine engine; }
khng c i tng Engine no c to ra, bin engine cha c khi to bi mt i tng thc

:Car
engine i tng Car

Car c = new Car();

Hnh 9.3: Bin thc th khng c khi to khi khai bo.

By gi ta kin thc nn tng bt u i su vo qu trnh to i tng. 9.2. KHI TO I TNG Nh li rng c ba bc khi mun to mi mt i tng: khai bo mt bin tham chiu, to mt i tng, chiu tham chiu ti i tng . Ta hiu r v hai bc 1 v 3. Mc ny s trnh by k v phn cn li: to mt i tng.

Khi ta chy lnh new Cow(), my o Java s kch hot mt hm c bit c gi l hm khi to (constructor). N khng phi mt phng thc thng thng, n ch chy khi ta khi to mt i tng, v cch duy nht kch hot mt hm khi to cho mt i tng l dng t kha new km theo tn lp to chnh i tng 145

. (Thc ra cn mt cch khc l gi trc tip t bn trong mt hm khi to khc, nhng ta s ni v cch ny sau). Trong cc v d trc, ta cha h vit hm khi to, vy n u ra cho my o gi mi khi ta to i tng mi? Ta c th vit hm khi to, v ta s vit nhiu hm khi to. Nhng nu ta khng vit th trnh bin dch s vit cho ta mt hm khi to mc nh. Hm khi to mc nh ca trnh bin dch dnh cho lp Cow c ni dung nh th ny:

Hm khi to trng ging vi mt phng thc, nhng c cc c im l: khng c kiu tr v (v s khng tr v gi tr g), v c tn hm trng vi tn lp. Hm khi to m trnh bin dch t to c ni dung rng, hm khi to ta t vit s c ni dung trong phn thn hm. c im quan trng ca mt hm khi to l n chy trc khi ta lm c bt c vic g khc i vi i tng c to, chiu mt tham chiu ti n chng hn. Ngha l, ta c c hi a i tng vo trng thi sn sng s dng trc khi n bt u c s dng. Ni cch khc, i tng c c hi t khi to trc khi bt c ai c th iu khin n bng mt ci tham chiu no . Ti hm khi to ca Cow trong v d Hnh 9.4: Hm khi to khng ly i s.Hnh 9.4, ta khng lm iu g nghim trng m ch in thng bo ra mn hnh th hin chui s kin xy ra.

Hnh 9.4: Hm khi to khng ly i s.

Nhiu ngi dng hm khi to khi to trng thi ca i tng, ngha l gn cc gi tr ban u cho cc bin thc th ca i tng, chng hn:
public Cow() {

146

weight = 10.0; }

l la chn tt nu nh ngi vit lp Cow bit c i tng Cow nn c cn nng bao nhiu. Nhng nu nhng lp trnh vin khc ngi vit nhng on m dng n lp Cow mi c thng tin ny th sao? T mc 5.4, ta bit v gii php dng cc phng thc truy nhp. C th y ta c th b sung phng thc setWeight() cho php gn gi tr cho weight t bn ngoi lp Cow. Nhng iu c ngha ngi ta s cn n 2 lnh hon thnh vic khi to mt i tng Cow: mt lnh new Cow() to i tng, mt lnh gi setWeight() khi to weight. V gia hai lnh l khong thi gian m i tng Cow tm thi c weight cha c khi to9.

Hnh 9.5: V d v bin thc th cha c khi to cng i tng.

Vi cch lm nh vy, ta phi tin tng l ngi dng lp Cow s khi to weight v hy vng h s khng lm g k cc trc khi khi to weight. Trng i vo vic ngi khc s lm ng cng tng ng vi vic hy vng iu ri ro s khng xy ra. Tt hn c l ta nn t m bo sao cho nhng tnh hung khng mong mun s khng xy ra. Nu mt i tng khng nn c s dng trc khi n c khi to xong th ta ng cho ai ng n i tng trc khi ta hon thnh vic khi to.

Cc bin thc th c sn gi tr mc nh, weight c sn gi tr 0.0,

147

Hnh 9.6: Hm khi to c tham s.

Cch tt nht hon thnh vic khi to i tng trc khi ai c c mt tham chiu ti i tng l t tt c nhng on m khi to vo bn trong hm khi to. Vn cn li ch l vit mt hm khi to nhn i s ri dng i s truyn vo hm khi to cc thng s cn thit cho vic khi to i tng. Kt qu l sau ng mt li gi hm khi to km i s, i tng c khi to xong v sn sng cho s dng. Xem minh ha ti Hnh 9.6. Tuy nhin, khng phi lc no ngi dng Cow cng bit hoc quan tm n trng lng cn khi to cho i tng Cow mi. Ta nn cho h la chn to mi Cow m khng cn ch r gi tr khi to cho weight. Cch gii quyt l b sung mt hm khi to khng nhn i s v hm ny s t gn cho weight mt gi tr mc nh no .

Hnh 9.7: Hai hm khi to chng.

Ni cch khc l ta c cc hm khi to chng nhau phc v cc la chn khc nhau cho vic to mi i tng. V cng nh cc phng thc chng khc, cc hm khi to chng nhau phi c danh sch tham s khc nhau. 148

Nh vi khai bo lp Cow trong v d Hnh 9.7, ta vit hai hm khi to cho lp Cow, v ngi dng s c hai la chn to mt i tng Cow mi:
Cow c1 = new Cow(12.1);

hoc
Cow c1 = new Cow();

Quay li vn v hm khi to khng nhn i s m trnh bin dch cung cp cho ta. Khng phi lc no ta cng c sn mt hm khi to nh vy. Trnh bin dch ch cung cp cho ta mt hm khi to mc nh nu ta khng vit bt c mt hm khi to no cho lp . Khi ta vit d ch mt hm khi to cho lp , th ta phi t vit c hm khi to khng nhn i s nu cn n n.

Nhng im quan trng: Bin thc th sng bn trong i tng ch ca n. Cc i tng sng trong vng b nh heap. Hm khi to l on m s chy khi ta gi new i vi mt lp i tng Hm khi to mc nh l hm khi to khng ly i s. Nu ta khng vit mt hm khi to no cho mt lp th trnh bin dch s cung cp mt hm khi to mc nh cho lp . Ngc li, ta s phi t vit hm khi to mc nh. Nu c th, nn cung cp hm khi to mc nh to iu kin thun li cho cc lp trnh vin s dng i tng. Hm khi to mc nh khi to cc gi tr mc nh cho cc bin thc th. Ta c th c cc hm khi to khc nhau cho mt lp. l cc hm khi to chng. Cc hm khi to chng nhau phi c danh sch i s khc nhau. Cc bin thc th lun c sn gi tr mc nh, k c khi ta khng t khi to chng. Cc gi tr mc nh l 0/0.0/false cho cc kiu c bn v null cho kiu tham chiu.

9.3. HM KHI TO V VN THA K Nh li Mc 8.6 khi ta ni v cu trc bn trong ca lp con c cha phn c tha k t lp cha, lp Cow bc ra ngoi ci li l phn Object m n c tha k. Ni cch khc, mi i tng lp con khng ch cha cc bin thc th ca chnh n m cn cha mi th c hng t lp cha ca n. Mc ny ni v vic khi to phn c tha k 149

9.3.1. Gi hm khi to ca lp cha Khi mt i tng c to, n c cp pht b nh cho tt c cc bin thc th ca chnh n cng nh nhng th n c tha k t lp cha, lp ng, lp c... cho n lp Object trn nh cy tha k.

Tt c cc hm khi to trn trc tha k ca mt i tng u phi c thc thi khi ta to mi i tng . Mi lp t tin ca mt lp con, k c cc lp tru tng, u c hm khi to. Tt c cc hm khi to c kch hot ln lt mi khi mt i tng ca lp con c to. Ly v d Hippo trong cy tha k Animal. Mt i tng Hippo mi cha trong n phn Animal, phn Animal li cha trong n phn Object. Nu ta mun to mt i tng Hippo, ta cng phi khi to phn Animal ca i tng Hippo n c th s dng c nhng g c tha k t Animal. Tng t, to phn Animal , ta cng phi to phn Object cha trong . Khi mt hm khi to chy, n lp tc gi hm khi to ca lp cha. Khi hm khi to ca lp cha chy, n lp tc gi hm khi to ca lp ng,... c nh th cho n khi gp hm khi to ca Object. Quy trnh c gi l dy chuyn hm khi to (Constructor Chaining).

150

public class Animal { public Animal() { System.out.println("Making an Animal"); } } public class Hippo extends Animal { public Hippo() { System.out.println("Making a Hippo"); } } public class TestHippo { public static void main (String[] args) { System.out.println("Starting..."); Hippo h = new Hippo(); % java TestHippo } Starting... } Making an Animal Making a Hippo
Hnh 9.8: Dy chuyn hm khi to.

Ta minh ha dy chuyn hm khi to bng v d trong Hnh 9.8. Trong v d , m chng trnh TestHippo gi lnh new Hippo() to i tng Hippo mi, lnh ny khi ng mt dy chuyn hm khi to. u tin l Hippo() c kch hot, Hippo() gi hm khi to ca lp cha Animal(), n lt n, Animal gi hm khi to ca lp cha Object(). Sau khi Object() chy xong, hon thnh khi to phn Object trong i tng Hippo, n kt thc v tr quyn iu khin v cho ni gi n hm khi to Animal(). Hm khi to Animal() khi to xong phn Animal ca i tng Hippo ri kt thc, tr quyn iu khin v cho ni gi n hm khi to Hippo(). Hippo() thc hin cng vic ca mnh ri kt thc. i tng Hippo mi c khi to xong. Lu rng mt hm khi to gi hm khi to ca lp cha trc khi thc hin bt k lnh no trong thn hm. Ngha l, Hippo() gi Animal() trc khi thc hin lnh in ra mn hnh. Vy nn ti kt qu ca chng trnh TestHippo, ta thy phn hin th ca Animal() c in ra mn hnh trc phn hin th ca Hippo(). Ta vn ni rng hm khi to ny gi hm khi to kia, nhng trong Hnh 9.8 hon ton khng c lnh gi Animal() t trong m ca Hippo(), khng c lnh gi Object() t trong m ca Animal(). Mt ln na, trnh bin dch lm cng vic ny thay cho lp trnh vin, n t ng in lnh super() vo ngay trc dng u tin ca thn hm khi to. Vic ny xy ra i vi mi hm khi to m ti lp trnh vin khng t vit li gi n hm khi to lp cha. Cn i vi nhng hm khi to m lp trnh vin t gi super, li gi cng phi lnh u tin trong thn hm. Ti sao li gi super() phi l lnh u tin ti mi hm khi to? i tng thuc lp con c th ph thuc vo nhng g n c tha k t lp cha, do 151

nhng g c tha k nn c khi to trc. Cc phn tha k t lp cha phi c xy dng hon chnh trc khi c th xy dng nhng phn ca lp con. Lu rng cch duy nht gi hm khi to lp cha t trong hm khi to lp con l lnh super() ch khng gi ch danh tn hm nh Animal() hay Object().

Lnh gi hm khi to lp cha m trnh bin dch s dng bao gi cng l super() khng c i s. Nhng nu ta t gi th c th dng super() vi i s gi mt hm khi to c th trong cc hm khi to chng nhau ca lp cha. 9.3.2. Truyn i s cho hm khi to lp cha Ta hnh dung tnh hung sau: con vt no cng c mt ci tn, nn i tng Animal c bin thc th name. Lp Animal c mt phng thc getName(), n tr v gi tr ca bin thc th name. Bin thc th c nh du private, nhng lp con Hippo tha k phng thc getName(). Vn y l Hippo c phng thc getName() qua tha k, nhng li khng c bin thc th name. Hippo phi nh phn Animal ca n gi bin name v tr v gi tr ca name khi ai gi getName() t mt i tng Hippo. Vy khi mt i tng Hippo c to, n lm cch no gi cho phn Animal gi tr cn khi to cho name? Cu tr li l: dng gi tr lm i s khi gi hm khi to ca Animal. Ta thy thn hm Hippo(String name) trong v d Hnh 9.9 khng lm g ngoi vic gi phng thc khi to ca lp cha vi danh sch tham s ging ht. C th c ngi c thc mc v sao phi vit hm khi to lp con vi ni dung ch nh vy. Trong khi nu lp con tha k lp cha th lp con khng cn ci li cng nghim nhin c s dng phin bn c tha k ca lp cha vi danh sch tham s ging ht, vic vit phng thc ci ti lp con vi ni dung ch gm li gi ti phin bn c tha k ti lp cha l khng cn thit. Thc ra, tuy cng l cc phng thc khi to v c cng danh sch tham s, nhng phng thc Hippo(String name) v Animal(String name) khc tn. Hippo(String name) khng ci Animal(String name). Tm li, lp con khng tha k phng thc khi to ca lp cha.

152

public class Animal { private String name;

con vt no cng c mt ci tn, k c cc lp con

public String getName() { return name; } public Animal(String n) { name = n; } }


hm to Animal ly tham s n v gn n cho bin thc th name

public class Hippo extends Animal { public Hippo(String name) { super(name); hm to Hippo ly tham s name v } truyn n cho hm to ca Animal } public class TestHippo { public static void main (String[] args) { Hippo h = new Hippo("Hippy"); System.out.println(h.getName()); } % java TestHippo } Hippy gi phng thc Hippo
tha k t Animal

Hnh 9.9: Truyn i s cho hm khi to lp cha.

9.4. HM KHI TO CHNG NHAU Xt trng hp ta c cc hm khi to chng vi hot ng khi to ging nhau v ch khc nhau phn x l cc kiu i s. Ta s khng mun chp i chp li phn m khi to m cc hm khi to u c (v kh bo tr chng hn), nn ta s mun t ton b phn m vo ch mt trong cc hm khi to. V ta mun rng hm khi to no cng u gi n hm khi to kia n hon thnh cng vic khi to. lm vic , ta dng this() gi mt hm khi to t bn trong mt hm khi to khc ca cng mt lp. V d:

Li gi this() ch c th c dng trong hm khi to v phi l lnh u tin trong thn hm. Nh li mc 9.3, yu cu cho li gi super() cng y ht nh vy. V l do , mi hm khi to ch c chn mt trong hai vic: gi super() hoc gi this(), ch khng th gi c hai.

153

9.5. TO BN SAO CA I TNG Ta bit rng khng th dng php gn sao chp ni dung i tng, n ch sao chp ni dung bin tham chiu. Vy lm th no to i tng mi l bn sao ca mt i tng c sn? C hai kiu sao chp ni dung i tng. Sao chp nng (shallow copy) l sao chp tng bit ca cc bin thc th. i tng mi s c cc bin thc th c gi tr bng cc bin tng ng ca i tng c, k c cc bin thc th l tham chiu. Do , nu i tng c c mt tham chiu ti mt i tng khc th i tng mi cng c tham chiu ti chnh i tng . i khi, y l kt qu ng. Chng hn nh khi ta to bn sao ca mt i tng Account (ti khon ngn hng), c hai ti khon mi v c u c chung mt ch s hu ti khon, ngha l bin thc th owner ca hai i tng ny u chiu ti cng mt i tng Customer (khch hng) ngi s hu ti khon. Trong nhng trng hp khc, ta mun to bn sao ca c cc i tng thnh phn. Sao chp su (deep copy) to bn sao hon chnh ca mt i tng c sn. Chng hn, khi thc hin sao chp su i vi mt i tng l danh sch cha cc i tng khc, kt qu l cc i tng thnh phn cng c to bn sao hon chnh. Ta c i tng danh sch mi cha cc i tng thnh phn mi, tch bit hon ton vi danh sch c (thay v tnh trng cc i tng thnh phn ng thi nm trong c hai danh sch c v mi). Ly v d khc: mt cn h c nhiu phng, mi phng c cc c ni tht. Khi to bn sao ca mt cn h, nhm to ra mt cn h khc ging ht cn h ban u, ta phi sao chp c cc phng cng nh tt c c ni tht cha trong . Khng phi tnh trng hai cn h nhng li c chung cc phng v chung ni tht. c c kiu sao chp hon ton ny, lp trnh vin phi t ci t quy trnh sao chp. Java c h tr sao chp nng v sao chp su vi phng thc clone v interface Cloneable. Tuy nhin, nhiu chuyn gia, trong c Joshua Bloch tc gi cun Effective Java [7], khuyn khng nn s dng h tr ny do n c li thit k v hiu lc thc thi khng n nh, thay vo , nn dng hm khi to sao chp. Hm khi to sao chp (copy constructor) l hm khi to vi tham s duy nht l mt tham chiu i tng v hm ny s khi to i tng mi sao cho c ni dung ging ht i tng cho. Chng hn:

154

Trong , ni dung hm khi to Cow(Cow c) lm nhim v sao chp ni dung ca i tng c vo i tng va to, y ch l cc php gn gi tr cho cc bin thc th. Tuy nhin, khi c quan h tha k, tnh hung khng phi lc no cng n gin nh v d . Xt quan h tha k gia Animal v Cat. Ta vit hm khi to sao chp cho c hai lp. Gi s ta cn mt tnh hung a hnh chng hn nh mt on m p dng cho cc loi Animal ni chung, trong c Cat. Trong phng thc ta cn nhn bn cc i tng m khng bit chng thuc lp no trong cy tha k Animal, chng hn:

Liu trong tnh hung ny ta c th dng hm khi to sao chp ca Animal nhn bn cc i tng thuc cc lp con? Ta hy th xem.

155

Hnh 9.10: Hm khi to sao chp v quan h tha k.

V d trong Hnh 9.10 cho thy cu tr li l 'khng th'. Khi ta dng lnh new Animal(tom) gi hm khi to sao chp nhm to mt bn sao ca mo Tom, thc ra ta ang to i tng Animal v dng hm khi to ca lp Animal (nh li rng gia cc hm khi to khng c quan h tha k do cng khng c a hnh). Cho nn kt qu ca thao tc sao chp th hai khng phi l mt i tng mo tn Tom m l mt i tng Animal tn Tom (phin bn makeNoise() chy cho i tng ny in ra "Huh?" y l phin bn ca Animal ch khng phi phin bn ca Cat). Nh vy s dng hm khi to sao chp nh trong tnh hung ny khng cho ta kt qu mong mun. Vy phi lm cch no c hiu ng a hnh khi nhn bn i tng? Cu tr li l s dng phng thc c tnh a hnh. Ta b sung vo ci t ca Animal v Cat trn mt phng thc thc th clone() vi nhim v to v tr v mt i tng mi l bn sao ca i tng ch. Thc ra clone() khng lm g ngoi vic gi v tr v kt qu ca hm khi to sao chp i vi chnh i tng ch. Vn l cc hm khi to sao chp thc hin vic nhn bn i tng, nhng ln ny chng c bc trong cc phin bn ca clone(), m clone() th l phng thc c tnh a hnh nn khi c gi vi i tng loi no th phin bn tng ng s chy. iu ng ngha vi vic hm khi to sao chp tng ng vi loi i tng s c gi. Xem kt qu th nghim trong Hnh 9.11.

156

Hnh 9.11: Gii php nhn bn h tr a hnh.

157

Khi , phng thc cloneAll() cn vit li nh sau:

Gii php nhn bn i tng ni trn cng chnh l mt v d n gin s dng mu thit k Prototype (nguyn mu). i khi vic to mi v xy dng li mt i tng t u l phc tp hoc tn km ti nguyn. Chng hn, mt cng ty cn tng hp d liu t c s d liu vo mt i tng a vo m un phn tch d liu. Cng d liu cn c phn tch c lp ti hai m un phn tch khc nhau. Vic tng hp li d liu to mt i tng th hai c ni dung ging ht i tng th nht tn km hn l nhn bn i tng th nht thnh i tng th hai, th ba Khi , nhn bn mt i tng l gii php nn s dng. Mu thit k Prototype cho php to cc i tng c tinh chnh m khng cn bit chng thuc lp no hay chi tit v vic cn phi to chng nh th no. Vic ny c thc hin bng cch s dng mt i tng mu v to cc i tng mi t vic sao chp ni dung ca mu sang. Ci t mu Prototype c bn bao gm ba loi lp (xem Hnh 9.12). Loi Client to i tng mi bng cch yu cu i tng mu t nhn bn. Loi Prototype nh ngha mt giao din cho nhng lp i tng c th t nhn bn. Cc lp ConcretePrototype (cc bn mu c th) ci t phng thc thc th clone tr v bn sao ca chnh mnh. Trong nhiu trng hp, sao chp nng l dng cho phng thc clone(). Nhng khi nhn bn cc i tng c cu trc phc tp, chng hn nh mt i tng Maze (m cung) hp thnh t cc bc tng, li i, chng ngi vt th sao chp su l cn thit.

158

Client
operation()

Prototype
prototype

clone()

prototype.clone();

ConcretePrototype1
clone()

ConcretePrototype2
clone()

tr v bn sao ca chnh mnh

tr v bn sao ca chnh mnh

Hnh 9.12: Mu thit k Prototype.

9.6. CUC I CA I TNG Cuc i ca mt i tng hon ton ph thuc vo s tn ti ca cc tham chiu chiu ti n. Nu vn cn mt tham chiu, th i tng vn cn sng trong heap. Nu khng cn mt tham chiu no chiu ti n, i tng s cht, hoc t ra cng coi nh cht. Ti sao khi khng cn mt bin tham chiu no chiu ti th i tng s cht? Cu tr li rt n gin: Khng c tham chiu, ta khng th vi ti i tng , khng th ly d liu ca n, khng th yu cu n lm g. Ni cch khc, n tr thnh mt khi bit v dng, s tn ti ca n khng cn c ngha g na. Garbage collector s pht hin ra nhng i tng tnh trng ny v thu dn vng b nh ca chng ti s dng. Nh vy, c th xc nh di cuc i hu dng ca i tng, ta cn bit c di cuc i ca cc bin tham chiu. Ci ny cn ty bin l bin a phng hay bin thc th. Mt bin a phng ch tn ti bn trong phng thc ni n c khai bo, v ch sng t khi phng thc c chy cho n khi phng thc kt thc. Mt bin thc th thuc v mt i tng v sng cng vi i tng . Nu i tng vn cn sng th bin thc th ca n cng vy. C ba cch hy tham chiu ti mt i tng:

159

1. Tham chiu vnh vin ra ngoi phm vi tn ti.

2. Tham chiu c chiu ti mt i tng khc.

3. Tham chiu c gn gi tr null.

160

Bi tp
1. Cc pht biu sau y ng hay sai? a) khi mt i tng thuc lp con c khi to, hm khi to ca lp cha phi c gi mt cch tng minh. b) nu mt lp c khai bo cc hm khi to, trnh bin dch s khng to hm khi to mc nh cho lp . c) lp con c tha k hm khi to ca lp cha. Khi khi to i tng lp con, hm khi to ca lp cha lun lun c gi t ng khi to phn c tha k. 2. T kha new dng lm g? Gii thch chuyn xy ra khi dng t kha ny trong mt ng dng. 3. Hm khi to mc nh l g? Cc bin thc th ca mt i tng c khi to nh th no nu lp khng c hm khi to no do lp trnh vin vit. 4. Tm li bin dch nu c ca cc hm khi to trong ci t sau y ca lp SonOfBoo.

161

5. Cho ci t lp Foo ct bn tri, nu b sung vo v tr A mt trong cc dng m ct bn phi, dng no s lm cho mt i tng b mt du v s b garbage collector thu hi bt c lc no?

162

163

Chng 10.

Thnh vin lp v thnh vin thc th

Ta bit i vi cc bin thc th, mi i tng u c mt bn ring ca mi bin. Chng hn, nu khai bo lp Cow c bin thc th name, th mi i tng Cow u c mt bin name ca ring n nm trong vng b nh c cp pht cho i tng . Hu ht nhng phng thc ta thy trong cc v d u c hot ng chu nh hng ca gi tr cc bin thc th. Ni cch khc, chng c hnh vi ty thuc tng i tng c th. Khi gi cc phng thc, ta cng u phi gi cho cc i tng c th. Ni tm li, l cc phng thc thuc v i tng. Nu ta mun c d liu no ca lp c chia s gia tt c cc i tng thuc mt lp, cc phng thc ca lp hot ng c lp vi cc i tng ca lp , th gii php l cc bin lp v phng thc lp. 10.1. BIN CA LP i khi, ta mun mt lp c nhng bin dng chung cho tt c cc i tng thuc lp . Ta gi cc bin dng chung ny l bin ca lp (class variable), hay gi tt l bin lp. Chng khng gn vi bt c mt i tng no m ch gn vi lp i tng. Chng c dng chung cho tt c cc i tng trong lp . phn bit gia bin thc th v bin lp khi khai bo trong nh ngha lp, ta dng t kha static cho cc bin lp. V t kha nn bin lp thng c gi l bin static. Ly v d trong Hnh 10.1, bn cnh bin thc th name, lp Cow cn c mt bin lp numOfCows vi mc ch ghi li s lng cc i tng Cow c to. Mi i tng Cow c mt bin name ca ring n, nhng numOfCows th ch c ng mt bn dng chung cho tt c cc i tng Cow. numOfCows c khi to bng 0, mi ln mt i tng Cow c to, bin ny c tng thm 1 (ti hm khi to dnh cho i tng ) ghi nhn rng va c thm mt thc th mi ca lp Cow.

164

public class Cow { private String name;

bin thc th, khng c t kha static bin lp, c khai bo vi t kha static

public static int numOfCows = 0; public Cow(String theName) { name = theName; numOfCows++;

mi ln hm to chy (mt i tng mi c to), bn duy nht ca numOfCows c tng thm 1 ghi nhn i tng mi

System.out.println("Cow #"+numOfCows+" created."); } } public class CowTestDrive { public static void main(String[] args) { Cow c1 = new Cow(); % java CowTestDrive Cow c2 = new Cow(); Cow #1 created. } Cow #2 created. }
Hnh 10.1: Bin lp - bin static.

T bn ngoi lp, ta c th dng tn lp truy nhp bin static. Chng hn, dng Cow.numOfCows truy nhp numOfCows:

10.2. PHNG THC CA LP Li xt v d trong Hnh 10.1, gi s ta mun numOfCows l bin private khng cho php ai sa t bn ngoi lp Cow. Nhng ta vn mun cho php c gi tr ca bin ny t bn ngoi (cc chng trnh dng n Cow c th mun bit c bao nhiu i tng Cow c to), nn ta s b sung mt phng thc, chng hn getCount(), tr v gi tr ca bin .
public int getCount() { return numOfCows; }

Nh cc phng thc m ta quen dng, gi getCount(), ngi ta s cn n mt tham chiu kiu Cow v kch hot phng thc cho mt i tng Cow. Cn n mt con b bit c c tt c bao nhiu con b? Nghe c v khng c t nhin lm. V li, gi getCount() t bt c i tng Cow no thc ra cng nh nhau c, v getCount() khng dng n mt c im hay d liu c th no ca 165

mi i tng Cow (n khng truy nhp bin thc th no). Hn na, khi cn cha c mt i tng Cow no c to th khng th gi c getCount()! Phng thc getCount() khng nn b ph thuc vo cc i tng Cow c th nh vy. gii quyt vn ny, ta c th cho getCount() lm mt phng thc ca lp (class method), thng gi tt l phng thc lp hay phng thc static n c th tn ti c lp vi cc i tng v c th c gi thng t lp m khng cn n mt tham chiu i tng no. Ta dng t kha static khi khai bo phng thc lp:
public static int getCount() { return numOfCows; }

Cc phng thc thng thng m ta bit, ngoi tr main(), c gi l cc phng thc ca thc th (instance method) hay cc phng thc khng static. Cc phng thc ny ph thuc vo tng i tng v phi c gi t i tng. Hnh 10.2 l bn sa i ca v d trong Hnh 10.1. Trong b sung phng thc static getCount() v trnh din vic gi phng thc t tn lp cng nh t tham chiu i tng. Ln ny, ta c th truy vn s lng Cow ngay t khi cha c i tng Cow no c to. Lu rng c th gi getCount() t tn lp cng nh t mt tham chiu kiu Cow.

166

public class Cow { private String name; private static int numOfCows = 0; public Cow(String theName) { name = theName; numOfCows++; } public static int getCount() { return numOfCows; } public String getName() { return name; } }

phng thc lp c khai bo bng t kha static, khng ng n bin thc th

trc khi c i tng Cow u tin

% java CountCows 0 1 2

public class CountCows { public static void main(String[] args) { System.out.println(Cow.getCount()); Cow c1 = new Cow(); System.out.println(Cow.getCount()); Cow c2 = new Cow(); System.out.println(c2.getCount()); } }

c th gi t tn lp

hoc gi t tham chiu i tng

Hnh 10.2. Phng thc lp.

c im c lp i vi cc i tng ca phng thc static chnh l l do ta lun lun phi khai bo phng thc main() vi t kha static. main() c kch hot khi ng chng trnh - khi cha c bt c i tng no c to nn n phi c php chy m khng gn vi bt c i tng no. 10.3. GII HN CA PHNG THC LP c im v tnh c lp va l u im va l gii hn cho hot ng ca cc phng thc lp. Khng c gn vi mt i tng no, nn cc phng thc static ca mt lp chy m khng bit mt cht g v bt c i tng c th no ca lp . Nh thy trong v d Hnh 10.2, getCount() chy ngay c khi khng tn ti bt c i tng Cow no. K c khi gi getCount() t tham chiu c2 th getCount() cng vn khng bit g v i tng Cow m c2 ang chiu ti. V khi , trnh bin dch ch dng kiu khai bo ca c2 xc nh nn chy getCount() ca lp no, n khng quan tm c2 ang chiu ti i tng no. Cow.getCount() hay c2.getCount() ch l hai cch gi phng thc, v vi cch no th getCount() cng vn l mt phng thc static. 167

Hnh 10.3: Phng thc lp khng th truy nhp bin thc th.

Nu mt bin thc th c dng n trong mt phng thc lp, trnh bin dch s khng hiu ta ang ni n bin thc th ca i tng no, bt k trong heap ang c 10 hay ch c duy nht mt i tng thuc lp . V d, chng trnh trong Hnh 10.3 b li bin dch v phng thc main() c truy nhp bin name. Do main() l phng thc static, trnh bin dch khng hiu name m main() ang ni n l bin thc th name ca i tng no. Li thng bo li c ni dung: bin thc th name khng th c gi n t mt ng cnh static. Ta d thy rng tham chiu this cng khng th s dng trong mt phng thc lp, bi n khng hiu i tng 'ny' l i tng no. Hiu ng dy chuyn ca vic cc phng thc static khng th dng bin thc th l chng cng khng th gi n cc phng thc thc th (phng thc thng) ca lp . Cc phng thc thc th c quyn dng bin thc th, gi n cc phng thc thc th ng ngha vi vic gin tip s dng bin thc th.

Hnh 10.4: Phng thc lp khng th gi phng thc thc th.

V d trong Hnh 10.4 cng gp li tng t li bin dch trong Hnh 10.3. 168

Nhn qua th c v nh ni dung t u chng n y l mt lot cc quy tc ca ngn ng Java m lp trnh vin cn nh. Nhng thc ra th tt c ch l h qu ca bn cht khi nim: Thnh vin lp thuc v lp v c lp vi tt c cc thc th ca lp . Trong khi , thnh vin thc th gn b cht ch vi tng thc th c th. Tt c cc 'quy tc' u l h qu ca c im bn cht . Mt phng thc thc th c th truy nhp cc bin thc th chng qua v chng thuc v cng mt thc th - i tng ch m tham chiu this chiu ti. V d, lnh return name; trong phng thc getName() ti Hnh 10.2 thc cht l return this.name;. getName() l phng thc thc th nn n c tham chiu this s dng cho vic ny. Mt phng thc lp, tri li, khng th truy nhp thng n bin thc th hay phng thc thc th n gin l v phng thc lp khng h bit n i tng ch ca cc thnh vin thc th kia. V d, khi bin thc th name c truy nhp ti phng thc main ti Hnh 10.3, thc cht Java hiu l this.name. Nhng main l phng thc lp, n khng gn vi i tng no nn khng c tham chiu this c th gi this.name. Tt c quy tc u c dn xut t bn cht ca khi nim. Do , thc ra ta khng cn nh quy tc mt khi nm vng c khi nim. 10.4. KHI TO BIN LP Cc bin static c khi to khi lp c np vo b nh. Mt lp c np khi my o Java quyt nh n lc cn np, chng hn nh khi ai nh to thc th u tin ca lp , hoc dng bin static hoc phng thc static ca lp . C hai m bo v vic khi to cc bin static: (1) cc bin static trong mt lp c khi to trc khi bt c i tng no ca lp c th c to; (2) cc bin static trong mt lp c khi to trc khi bt c phng thc static no ca lp c th chy; Ta c hai cch khi to bin static. Th nht, khi to ngay ti dng khai bo bin, v d nh trong Hnh 10.1:
private static int numOfCows = 0;

Cch th hai: Java cung cp mt c php c bit l khi khi to static (static initialization block) mt khi m c bc trong cp ngoc { } v c tiu l t kha static.
static { numOfCows = 0; }

Mt lp c th c vi khi khi to static t bt c u trong nh ngha lp. Chng c m bo s c kch hot theo ng th t xut hin trong m. V 169

quan trng bc nht l chng c m bo s chy trc khi bt g bin thnh vin no c truy nhp hay phng thc static no c chy. 10.5. MU THIT K SINGLETON Mt ng dng ca cc thnh vin lp l mu thit k Singleton. Mu ny gii quyt bi ton thit k m bo rng mt lp ch c ti a mt thc th, chng hn nh trong mt h thng m ch nn c mt i tng qun l ca s ng dng, mt h thng file, hay ch mt i tng qun l hng i my in (printer spooler). Cc lp singleton thng c dng cho vic qun l tp trung ti nguyn v cung cp mt im truy nhp ton cc duy nht n thc th duy nht ca chng. Mu Singleton bao gm mt lp t chu trch nhim to thc th. Phng thc khi to c t ch private ngn cn vic to thc th t bn ngoi lp. Mt bin lp private gi tham chiu ti thc th duy nht. Lp cung cp im truy nhp ton cc ti thc th ny qua mt phng thc lp public tr v tham chiu ti thc th . Hnh 10.5 m t chi tit v mu Singleton. rng do hm khi to khng th c truy cp t bn ngoi nn phng thc lp getInstance() l cng duy nht cho php ly tham chiu ti i tng Singleton. Phng thc ny m bo rng ch c duy nht mt thc th Singleton c to. T bn ngoi lp Singleton, mi khi mun dng n thc th Singleton ny, ta ch cn thc hin li gi c dng nh sau:
Singleton.getInstance().doSomething();

Ngi c c th tm hiu thm v mu thit k ny v cc ng dng ca n ti cc ti liu sau: 1. Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley, 1994. 2. SingletonPattern | Object Oriented Design, URL: http://www.oodesign.com/singleton-pattern.html

170

Hnh 10.5: Mu thit k Singleton.

10.6. THNH VIN BT BIN final Trong ngn ng Java, t kha final mang ngha "khng th thay i". Ta c th dng t kha ny quy nh v tnh cht khng th thay i cho bin, phng thc, v c lp: 1. Mt bin final l bin khng th sa gi tr. Ni cch khc, bin final l hng. Ta c bin static final l hng ca lp, bin thc th final l hng ca i tng. Bin a phng, tham s cng c th c quy nh l final. Trong v d sau y, 'cow' c ngha l 'b ci' nn IS_FEMALE (l ging ci) l hng mang gi tr true chung cho tt c cc i tng kiu Cow, tng con b khng i mu nn color l mt hng cho tng i tng Cow.

2. Mt phng thc final l phng thc m lp con khng th ci .

171

3. Mt lp final l lp khng th c lp con.

An ton l l do cho vic khai bo final. V d, nu c ai vit lp con ca String v ci cc phng thc, ngi ta c th nh a hnh m dng cc i tng thuc lp mi ny cho cc on m chng trnh vn c vit cho String. y l tnh hung khng c mong mun, do String c t ch final trnh xy ra tnh hung . Nu ta cn da vo ci t c th ca cc phng thc trong mt lp, hy cho lp dng final. Nu ta ch cn c nh ci t ca mt vi phng thc trong mt lp, ta t ch final cho cc phng thc ch khng cn t cho c lp. Tt nhin, nu mt lp l lp final th cc phng thc trong nghim nhin khng th b ci , ta khng cn t ch final cho chng na.

Nhng im quan trng: Phng thc lp hay cn gi l phng thc static khng c gn vi mt i tng c th no v khng ph thuc i tng no, n ch c gn vi lp Nn gi phng thc static t tn lp. Phng thc static c th c gi m khng cn c i tng no ca lp ang trong heap. Do khng c gn vi mt i tng no, phng thc static khng th truy nhp bin thc th hay cc phng thc thc th. Bin lp hay cn gi l bin static l bin dng chung cho tt c cc i tng ca lp. Ch c duy nht mt bn cho c lp, ch khng phi mi i tng c mt bn. Phng thc static c th truy nhp bin static. Bin final ch c gn tr mt ln v khng th b thay i. Phng thc final khng th b . Lp final khng th c lp con.

172

Bi tp
1. in t thch hp vo ch trng a) Bin ____________ i din cho mt thng tin m tt c cc i tng thuc mt lp u dng chung. b) T kha __________ quy nh mt bin khng th sa gi tr. 2. Cc pht biu sau y ng hay sai? a) s dng lp Math, trc ht cn to mt i tng Math. b) C th dng t kha static cho hm khi to c) Cc phng thc static khng th truy nhp cc bin thc th ca i tng hin hnh d) C th dng bin static m s thc th ca mt lp. e) Cc hm khi to c gi trc khi cc bin static c khi to f) MAX_SIZE l mt tn bin tt cho mt bin final static g) Mt khi khi to static chy trc khi hm khi to ca mt lp c chy h) Nu mt lp c khai bo vi t kha final, tt c cc phng thc ca n cng phi khai bo l final. i) Mt phng thc final ch c th b nu lp c lp con. j) Khng c lp bc ngoi cho cc gi tr boolean. k) Lp bc ngoi c dng khi ta mun i x vi mt gi tr kiu c bn nh l mt i tng.

173

Chng 11.

Ngoi l

Li chng trnh l chuyn thng xy ra. Cc tnh hung bt thng cng xy ra. Khng tm thy file. Server b s c. Ngoi l (exception) l thut ng ch tnh trng sai hoc bt thng xy ra khi mt chng trnh ang chy. Ta c th gp v s cc tnh hung nh vy, chng hn nh khi chng trnh thc hin php chia cho 0 (ngoi l tnh ton s hc), c phi mt gi tr khng nguyn trong khi ang ch c mt gi tr kiu int (ngoi l nh dng s), hoc truy cp ti mt phn t khng nm trong mng (ngoi l ch s nm ngoi mng). Cc li v tnh trng bt thng c th xy ra l v s. Mt chng trnh d c thit k tt n u th vn c kh nng xy ra li trong khi thc thi. D c l lp trnh vin gii n u th ta vn khng th kim sot mi th. Trong nhng phng thc c kh nng gp s c, ta cn nhng on m x l s c nu nh chng xy ra. Mt chng trnh c thit k tt cn c nhng on m phng chng li v cc tnh trng bt thng. Phn m ny nn c a vo chng trnh ngay t giai on u ca vic pht trin chng trnh. Nh , n c th gip nhn din cc trc trc trong qu trnh pht trin. Phng php truyn thng cho vic phng chng li l chn vo gia logic chng trnh nhng on lnh pht hin v x l li; dng gi tr tr v ca hm lm phng tin bo li cho ni gi hm. Tuy nhin, phng php ny c nhng nhc im nh: cc on m pht hin v x l li nm ln trong thut ton chnh lm chng trnh ri hn, kh hiu hn, dn ti kh kim sot hn; i khi gi tr tr v phi dnh cho vic thng bo kt qu tnh ton ca hm nn kh c th tm mt gi tr thch hp dnh ring cho vic bo li. Trong ngn ng Java, ngoi l (exception handling) l c ch cho php x l tt cc tnh trng ny. N cho php gii quyt cc ngoi l c th xy ra sao cho chng trnh c th chy tip hoc kt thc mt cch nh nhng, gip lp trnh vin to c cc chng trnh bn b v chu li tt hn. So vi phng php phng chng li truyn thng, c ch ngoi l c lm chng trnh chy chm i mt cht, nhng i li l cu trc chng trnh trong sng hn, d vit v d hiu hn. Chng ny m t c ch s dng ngoi l ca Java. Ta s bt u bng vic so snh cch x l li truyn thng trong chng trnh vi c ch x l ngoi l mc nh ca Java. Tip theo l trnh by v cch ngoi l c nm v bt (x l) trong mt chng trnh, cc quy tc p dng cho cc loi ngoi l khc nhau. Cui cng l ni dung v cch thit k v ci t lp con ca Exception phc v nhu cu v cc loi ngoi l t thit k.

174

11.1. NGOI L L G? 11.1.1. Tnh hung s c u tin, chng ta ly mt v d v ngoi l ca Java. Trong Hnh 11.1 l mt chng trnh n gin trong yu cu ngi dng nhp hai s nguyn ri tnh thng ca chng v in ra mn hnh.
import java.util.*; public class TestException { public static void main (String args[]) { Scanner scanner = new Scanner(System.in); System.out.print( "Numerator: " ); int numerator = scanner.nextInt(); System.out.print( "Denominator: " ); int denominator = scanner.nextInt(); int result = numerator/denominator; System.out.printf("\nResult: %d / %d = %d\n", numerator, denominator, result ); } }
Hnh 11.1: Mt chng trnh cha x l ngoi l.

Chng trnh ny hot ng ng nhng cha h c m x l li. Nu khi chy chng trnh, ta nhp d liu khng phi s nguyn nh yu cu, chng trnh s b dng t ngt vi li bo li c in ra trn ca s lnh, v d nh trong Hnh 11.2. l hu qu ca vic ngoi l cha c x l.

Hnh 11.2: Li run-time do ngoi l khng c x l.

Ta ly thm mt v d khc trong Hnh 11.3. Gi s ta cn ghi mt vi dng vn bn vo mt file. Ta dng n cc lp File v PrintWriter trong gi java.io ca th vin chun Java, File qun l file, PrintWriter cung cp cc tin ch ghi dng vn bn. Chng trnh ch lm cng vic rt n gin l (1) m file, (2) chun b cho vic ghi file, (3) ghi vo file mt dng vn bn, v (4) ng file. Nhng khi bin dch, ta gp 175

thng bo li cho lnh new PrintWriter vi ni dung rng ngoi l FileNotFoundException cha c x l v n phi c bt hoc c tuyn b nm tip.
import java.io.PrintWriter; import java.io.File;
import cc lp cn dng t th vin ca Java

public class FileWriter { public static void write(String fileName, String s) File file = new File(fileName); PrintWriter out = new PrintWriter(file); out.println(s); out.close(); } }

m file v chun b chi vic ghi file

% javac FileWriter.java FileWriter.java:7: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown PrintWriter out = new PrintWriter(file); ^ 1 error

Hnh 11.3: Li bin dch do ngoi l khng c x l.

Hai v d trn, v cc tnh hung c ngoi l khc tng t nhau nhng im sau: 1. Ta gi mt phng thc mt lp m ta khng vit 2. Phng thc c th gp trc trc khi chy 3. Ta cn bit rng phng thc c th gp trc trc 4. Ta cn vit m x l tnh hung s c nu n xy ra. Hai im cui l vic chng ta cha lm v s ni n trong nhng phn tip theo. Cc phng thc Java dng cc ngoi l bo vi phn m gi chng rng "Mt tnh hung khng mong i xy ra. Ti gp s c." C ch x l ngoi l ca Java cho php x l nhng tnh hung bt thng xy ra khi chng trnh ang chy, n cho php ta t tt c nhng on m x l li vo mt ni d c d hiu. C ch ny da trn nguyn tc rng nu ta bit ta c th gp mt ngoi l no ta s c th chun b i ph vi tnh hung pht sinh ngoi l . Trc ht, im s 3, lm th no bit mt phng thc c th nm ngoi l hay khng v n c th nm ci g? Khi bin dch gp li hoc khi chy gp li nh trong hai v d trn, ta bit c mt s ngoi l c th pht sinh. Nhng nh vy cha . Ta cn tm c dng khai bo throws ti dng u tin ca khai bo phng thc, hoc c ti liu c t phng thc xem n tuyn b c th nm ci g. Phng thc no cng phi khai bo sn tt c cc loi ngoi l m n c th nm. 176

Hnh 11.4 l nh chp trang c t hm khi to PrintWriter(File) ti ti liu API ca JavaSE phin bn 6 t ti trang web ca Oracle. Ti , ta c th tra cu c t ca tt c cc lp trong th vin chun Java.

Hnh 11.4: Thng tin v ngoi l ti c t phng thc.

c t ca hm khi to PrintWriter(File) ni rng n c th nm FileNotFoundException, v n s nm nu nh i tng File c cho lm i s khng i din cho mt file ghi c hoc khng th to file vi tn cho, hoc nu xy ra li no khc trong khi m hoc to file. Nh vy, ta bit nu to mt i tng PrintWriter theo cch nh trong Hnh 11.3 th ta phi chun b i ph vi loi ngoi l no trong tnh hung no. 11.1.2. X l ngoi l Tip theo l im s 4, lm th no x l ngoi l sau khi bit thng tin v cc loi ngoi l c th pht sinh t cc phng thc ta dng n trong chng trnh? C hai la chn, mt l gii quyt ti ch, hai l trnh n trch nhim. Thc ra la chn th hai khng hn l n c hon ton, nhng ta s trnh by chi tit v la chn ny sau. Trc ht, ta ni v cch x l ngoi l ti ch. x l cc ngoi l c th c nm ra t mt on m, ta bc on m trong mt khi try/catch. Chng trnh trong Hnh 11.3 sau khi c sa nh trong Hnh 11.5 th bin dch v chy thnh cng.

177

Hnh 11.5: X l ngoi l vi khi try/catch.

Khi try/catch gm mt khi try cha phn m c th pht sinh ngoi l v ngay sau l mt khi catch vi nhim 'bt' ngoi l c nm t trong khi try v x l s c (c th c vi khi catch theo sau mt khi try, ta s ni n vn ny sau). Ni dung ca khi catch ty vo vic ta mun lm g khi loi s c c th xy ra. V d, trong Hnh 11.5, khi catch ch lm mt vic n gin l gi phng thc printStackTrace() ca ngoi l va bt c in ra mn hnh thng tin v du vt ca ngoi l trong ngn xp cc li gi phng thc (stack trace). y l hot ng x l ngoi l thng dng trong khi ang tm li ca chng trnh. 11.1.3. Ngoi l l i tng Ci gi l ngoi l m ni nm ni bt thc cht l ci g trong ngn ng Java? Cng nh nhiu th khc trong chng trnh Java, mi ngoi l l mt i tng ca cy ph h Exception. Nh li kin thc v a hnh, ta lu rng mi i tng ngoi l c th l thc th ca mt lp con ca Exception. Hnh 11.6 m t mt phn ca cy ph h Exception vi FileNotFoundException v ArithmeticException l nhng loi ngoi l ta gp trong cc v d ca chng ny.

178

Hnh 11.6: Mt phn ca cy ph h Exception.

Do mi ngoi l l mt i tng, ci c 'bt' trong mi khi catch l mt i tng, trong i s ca catch l tham chiu ti i tng . Khi catch trong Hnh 11.5 c tham s e l tham chiu c khai bo thuc kiu FileNotFoundException. Mi khi catch khai bo tham s thuc kiu ngoi l no th s bt c cc i tng thuc kiu ngoi l . Cng theo nguyn tc tha k v a hnh rng cc i tng thuc lp con cng c th c coi nh cc i tng thuc kiu lp cha. Do , mt khi catch khai bo tham s kiu lp cha th cng bt c i tng ngoi l thuc cc lp con ca kiu . V d khi catch(Exception e) {} bt c cc i tng thuc cc lp Exception, IOException, cng nh FileNotFoundException (xem quan h tha k trong Hnh 11.6). 11.2. KHI try/catch Mc trc gii thiu v vic dng khi try/catch bt v x l ngoi l. Mc ny trnh by k hn v cu trc v c ch hot ng ca khi try/catch. 11.2.1. Bt nhiu ngoi l Nh ta thy, v d Hnh 11.1 khi chy c th pht sinh hai loi ngoi l InputMismatchException hay ArithmeticException. x l hai ngoi l ny, ta cng dng mt khi try/catch tng t nh lm trong Hnh 11.5. Nhng ln ny ta dng hai khi catch, mi khi dnh x l mt loi ngoi l. Mi khi try/catch ch c mt khi try, tip theo l mt hoc vi khi catch. Hnh 11.7 l v d minh ha n gin cho khi try/catch c nhiu hn mt khi catch.

179

Hnh 11.7: Khi try/catch c nhiu khi catch.

Khi mt ngoi l xy ra, trnh bin dch tm mt khi catch ph hp trong cc khi catch i km. Trnh t tm l ln lt t khi th nht n khi cui cng, khi catch u tin bt c ngoi l s c thc thi. 11.2.2. Hot ng ca khi try/catch Khi ta chy mt lnh/phng thc c th sinh ngoi l, mt trong hai trng hp xy ra: (1) phng thc c gi thnh cng; (2) phng thc c gi nm ngoi l v khi catch bt c ngoi l , v (3) phng thc c gi nm ngoi l nhng khi catch khng bt c ngoi l . Lung iu khin trong khi try/catch trong cc trng hp c th nh sau: (1) Phng thc c gi thnh cng, v khi try c thc thi y cho n lnh cui cng, cn khi catch b b qua v khng c ngoi l no phi x l. Sau khi khi try chy xong, lnh ng sau catch (ngha l nm ngay sau khi try/catch) s chy.

180

(2) Phng thc c gi nm ngoi l v khi catch bt c ngoi l . Cc lnh trong khi try sau lnh pht sinh ngoi l b b qua, iu khin chuyn ti khi catch, sau khi khi catch thc thi xong, phn cn li ca phng thc tip tc chy.

(3) Phng thc c gi nm ngoi l nhng khi catch khng bt c ngoi l . Nu khng dng khi finally m ta ni n mc sau, iu khin s nhy ra khi chng trnh, b qua phn cn li ca phng thc k t sau lnh pht sinh ngoi l v ra khi phng thc hin ti. iu khin s quay v ni gi phng thc hin ti hoc chng trnh dng do li run-time (chi tit s c trnh by Mc 11.4).

Ba trng hp trn c tm gn trong s sau:

181

11.2.3. Khi finally nhng vic d th no cng phi lm Phn try v phn catch trong khi try/catch l nhng phn bt buc phi c. Ngoi ra, ta cn c th lp mt phn c tn finally vo lm phn cui cng ca khi try/catch. Mt khi finally l ni ta t cc on m phi c thc thi bt k ngoi l c xy ra hay khng.

Hnh 11.8: iu khin chng trnh ti khi try/catch.

Ta ly mt v d minh ha. Gi s ta cn luc trng trong l vi sng. Nu c s c xy ra, chng hn trng b n, ta phi tt l. Nu trng luc thnh cng, ta cng tt l. Tm li, d chuyn g xy ra th ta cng u phi tt l.

Nu khng dng khi finally, ta phi gi turnOvenOff() c khi try ln khi catch, nhng kt qu l vn khng thc hin c nhim v ng file nu kt cc li

182

xy ra theo trng hp (3) ni n, khi iu khin chng trnh b qua c khi catch ra ngoi. Vi khi finally, trong bt k tnh hung no, lung iu khin cng phi chy qua khi lnh . Khi ngoi l b nm ra m khng c khi catch no bt c, khi finally cng chy trc khi lung iu kin ra khi phng thc. Ngay c khi c lnh return trong khi try hoc mt khi catch, khi finally cng c thc thi trc khi quay li chy lnh return . Vi c im , khi finally cho php ta t cc on m dn dp ti mt ni thay v phi lp li n ti tt c cc im m iu khin chng trnh c th thot ra khi phng thc.

Hnh 11.9: iu khin chng trnh khi c khi finally.

Lu rng, v mt c php, ta khng th chn m vo gia cc phn try, catch, v finally trong mt khi try/catch; khi try th bt buc phi c, nhng cc khi catch v finally th khng; tuy nhin, sau mt khi try phi c t nht mt khi catch hoc finally. 11.2.4. Th t cho cc khi catch Nh ta trnh by trong Mc 11.1.3, ngoi l cng l cc i tng nn c tnh a hnh, v mt khi catch dnh cho ngoi l lp cha cng bt c ngoi l lp con. V d cc khi catch sau u bt c ngoi l loi InputMismatchException:
catch(InputMismatchException e) {...} ch bt InputMismatchException, catch(IOException e) {...} bt tt c cc IOException, trong c {...} bt tt c cc Exception, trong c cc

InputMismatchException
catch(Exception e)

IOException. 183

C th hnh dung catch(Exception e) l mt ci r to nht v hng c cc loi vt vi nhiu kch thc hnh dng khc nhau, catch(IOException e) l ci r nh hn cht nn hng c t loi vt hn, cn catch (InputMismatchException e) l ci r nh nht v ch hng va mt loi vt. Ta c th ch dng mt ci r to nht khi catch bt loi ngoi l tng qut nht bt tt c cc ngoi l v x l mt th. Tuy nhin, nu ta mun x l ty theo cc ngoi l thuc loi khc nhau th nn dng cc khi catch khc nhau trong mt khi try/catch. Vy cc khi catch nn c theo th t no? Nh li rng khi mt ngoi l c nm ra t bn trong khi try, theo th t t trn xung di, khi catch no bt c ngoi l th s c chy. Do , nu ci r to c th hng trc ci r nh hn, ngha l khi catch cho lp cha c t trc khi catch dnh cho lp con, th ci r to s hng c ngay cn ci r nh hn s khng bao gi n lt mnh hng c ci g. V l do , trnh bin dch yu cu khi catch dnh cho lp ngoi l tng qut hn bao gi cng phi t sau khi catch dnh cho lp ngoi l chuyn bit hn. Trnh bin dch s bo li nu ta khng tun theo quy tc ny. V d, nu ta c ba khi catch vi ba loi tham s Exception, IOException, v InputMismatchException, chng s buc phi theo th t sau:

Xem li v d trong Hnh 11.7. Ti ta c hai khi catch, mt cho InputMismatchException, mt cho ArithmeticException. Gia hai loi ngoi l ny khng c quan h lp cha-lp con. Ni cch khc, khi ny khng th bt ngoi l ca khi kia. Do th t ca hai khi ny khng c ngha g, khi no t trc cng c. 11.3. NM NGOI L Nu m chng trnh ca ta phi bt ngoi l, th m ca ai nm n? Cc v d ta dng t u chng u ni v cc tnh hung m ngoi l c nm t bn trong mt hm trong th vin. Ta gi mt phng thc c khai bo mt loi ngoi l, v phng thc nm ngoi l tr li on chng trnh gi n.

184

Trong thc t, ta c th phi vit c m nm ngoi l cng nh m x l ngoi l. Vn khng phi ch ai vit ci g, m l bit rng phng thc no nm ngoi l v phng thc no bt n. Nu vit mt phng thc c th nm mt ngoi l, ta phi lm hai vic: (1) tuyn b ti dng khai bo phng thc rng n c th nm loi ngoi l (dng t kha throws); (2) to mt ngoi l v nm n (bng lnh throw) ti tnh hung thch hp trong ni dung phng thc. V d:

Hnh 11.10: Nm v bt ngoi l.

11.4. N NGOI L i khi, ta c mt phng thc dng n nhng li gi hm c th pht sinh ngoi l, nhng ta khng mun x l mt ngoi l ti phng thc . Khi , ta c th 'n' bng cch khai bo throws cho loi ngoi l khi vit nh ngha phng thc. Kt qu ca khai bo throws i vi mt loi ngoi l l: nu c mt ngoi l thuc loi c nm ra bi mt lnh nm trong phng thc, n khng c '' m s 'ri' ra ngoi phng thc, ti ni gi phng thc (caller).

185

Hnh 11.11: N ngoi l ni gi x l.

Ta cn nh v d trong Hnh 11.5, ti phng thc write() gi n new PrintWriter() bt v x l ngoi l do new PrintWriter() nm ra. By gi ta khng mun bt v x l ngoi l ngay ti write() m cho ni gi write x l. Ta b khi try/catch ti write() v thay bng khai bo throws, sa FileWriter thnh nh trong Hnh 11.11. Khi , vic bt v x l ngoi l tr thnh trch nim ca ni gi write(), nh phng thc main trong Hnh 11.11. C th hnh dung c ch nm, bt, n nh th ny: Ngoi l nh mt vt c nm ra t phng thc ang chy n nm trn nh ngn xp ca cc li gi phng thc (method call stack). N s ri t trn xung. Trong cc phng thc ang nm trong ngn xp, phng thc no n vi khai bo throws ph hp s ging nh ging ra mt ci l va vi ngoi l n lt qua v ri tip xung di. Phng thc no bt vi khi try/catch ph hp ging nh ging ra mt ci r hng ly ngoi l, n c bt x l ti y nn khng ri xung tip na. Tm li, sau khi mt ngoi l c nm, n ri t trn xung, lt qua cc phng thc c khai bo throws (tnh c phng thc nm n), v b gi li ti phng thc u tin c khai bo catch bt c n. Trong qu trnh ri, nu n ri vo mt phng thc khng c khai bo throws ph hp hay khi try/catch ph hp, ngha l phng thc khng cho n lt qua, cng khng ly r hng, th trnh bin dch s bo li.

186

PrintWriter

PrintWriter

PrintWriter

write

write

write

main

main

main

(1)
PrintWriter() nm ngoi l, n ri xung write()

(2)
write() n ngoi l, n ri xung main()

(3)
main() bt v x l ngoi l

Hnh 11.12: Ngoi l ri ra t bn trong phng thc nm, lt qua phng thc n n, ri ri xung phng thc bt n.

Hnh 11.12 minh ha qu trnh ri ca mt ngoi l FileNotFoundException vi ci t nh trong Hnh 11.11. Trong , i ph vi FileNotFoundException, WriteToFile.main c khi try/catch, FileWriter khai bo throws, v ta cn nh trong Hnh 11.4, hm khi to PrintWriter(File) cng khai bo throws i vi loi ngoi l ny. Vi trnh t main gi write, cn write gi hm khi to PrintWriter, ngoi l c nm ra t trong PrintWriter, lt qua write, ri xung main v c bt ti . Cc phng thc c i din bi hnh ch nht c cnh l nhng ng t on l nhng phng thc kt thc do ngoi l. Vic n ngoi l thc ra ch tr hon vic x l ngoi l ch khng trnh c hon ton. Nu ni cui cng trong chng trnh l hm main cng n, ngoi l s khng c x l bt c khu no. Trong trng hp , tuy trnh bin dch s cho qua, nhng khi chy chng trnh, nu c ngoi l xy ra, my o Java s ngt chng trnh y nh nhng trng hp ngoi l khng c x l khc.

187

PrintWriter

PrintWriter

write

write

main

main

(3)
main() n, ngoi l ri ra ngoi

(4)
my o Java ngt chng trnh

Hnh 11.13: Nu khng c bt th ngoi l ri ra ngoi chng trnh.

Tng kt li, quy tc hnh x mi khi gi mt phng thc c th pht sinh ngoi l l: bt hoc n. Ta bt bng khi try/catch vi khi try bc ngoi on m sinh ngoi l v mt khi catch ph hp vi loi ngoi l. Ta n bng khai bo throws cho loi ngoi l u phng thc. Phng thc write ca FileWriter c hai la chn khi gi new Printer(File): (1) bt ngoi l nh trong Hnh 11.5. (2) n ngoi l y trch nhim cho ni gi n nh trong Hnh 11.11. Trch nhim nay thuc v main ca WriteToFile. Nu mt ngoi l nm ra sm hay mun cng phi c bt v x l, ti sao i khi ta nn tr hon vic ? L do l khng phi lc no ta cng c thng tin c th khc phc s c mt cch thch hp. Gi s ta l ngi vit lp FileWriter cung cp tin ch x l file, v FileWriter c thit k c th dng c cho nhiu ng dng khc nhau. x l s c ghi file ngoi l FileNotFoundException, ta c th lm g ti phng thc write vi chc nng nh cc v d trn? Hin th li thng bo li? Yu cu cung cp tn file khc? Im lng khng lm g c? Lng lng ghi vo mt file mc nh? Tt c cc gii php u khng n. Ta khng th bit hnh ng no th ph hp vi chnh sch ca ng dng ang chy (ni s dng FileWriter ca ta), ta khng c thm quyn t tng tc vi ngi dng (khng r c hay khng) hoc t thay i phng n vi tn file khc. n gin l, ti write, ta khng c thng tin khc phc s c. Vy th ng lm g c, hy trnh sang mt bn cho ni c thng tin x l nhn trch nhim. Ngay c khi la chn bt ngoi l x l, mt phng thc vn c th nm tip chnh ngoi l va bt c sau khi x l mt phn theo kh nng v trch nhim ca mnh. V d:

188

11.5. NGOI L C KIM TRA V KHNG C KIM TRA Nh li cc chng trnh v d c li do khng x l ngoi l trong Hnh 11.1 v Hnh 11.3. V d th nht bin dch thnh cng cn v d th hai c li v ngoi l ngay khi bin dch. Ngoi ra, c l n y bn c gp nhng s c khi chy chng trnh nh NullPointerException (dng tham chiu null truy nhp cc bin thc th hay phng thc thc th), ArrayIndexOutOfBoundException (truy nhp mng vi ch s khng hp l). Ta khng b buc phi bt v x l cc ngoi l . Ti sao li c s khc bit ny? L do l cc kiu ngoi l ca Java c chia thnh hai loi: c kim tra (checked) v khng c kim tra (unchecked) bi trnh bin dch. Loi khng c kim tra bao gm cc i tng thuc lp RuntimeException v cc lp con ca n, chng hn NullPointerException, ArrayIndexOutOfBoundException , InputMismatchException hay ArithmeticException (nh trong v d Hnh 11.1)... Vi nhng ngoi l loi khng c kim tra, trnh bin dch khng quan tm ai tuyn b nm, ai nm, v c ai bt hay khng. Tt c trch nhim thuc v ngi lp trnh. Loi c kim tra bao gm ngoi l thuc tt c cc lp cn li, ngha l cc lp khng thuc loi RuntimeException v cc lp con ca n. Mt v d l ngoi l FileNotFoundException trong Hnh 11.3. Loi c kim tra c trnh bin dch kim tra xem c x l trong m hay cha. Hu ht cc ngoi l thuc loi RuntimeException xut pht t mt vn trong l-gic chng trnh ca ta ch khng phi t mt s c xy ra trong khi chng trnh chy m ta khng th lng trc hoc phng. Ta khng th m bo rng mt file cn m chc chn c ta dng. Ta khng th m bo rng server s chy n nh ng vo lc ta cn. Nhng ta c th m bo rng chng trnh ca ta s khng dng ch s qu ln truy nhp vt ra ngoi mng (mng thuc tnh .length ta kim sot vic ny). Hn na, ta mun rng cc li run-time phi c pht hin v sa cha ngay trong thi gian pht trin v kim th phn mm. Ta khng mun vit thm nhng khi try/catch km theo s tr gi v hiu nng khng cn thit bt nhng li m ng ra khng nn xy ra, ng ra phi c loi b trc khi chng trnh c a vo s dng. 189

Mc ch s dng ca cc khi try/catch l x l cc tnh hung bt thng ch khng phi khc phc li trong m ca lp trnh vin. Hy dng cc khi catch c gng khc phc s c ca cc tnh hung m ta khng th m bo s thnh cng. t nht, ta cng c th in ra mt thng ip cho ngi dng v thng tin v du vt ca ngoi l trong ngn xp cc li gi phng thc (stack trace) ai c th hiu c chuyn g xy ra. 11.6. NH NGHA KIU NGOI L MI Thng thng, khi vit m s dng cc th vin c sn, lp trnh vin cn x l cc ngoi l c sn m cc phng thc trong th vin nm to ra c nhng chng trnh c kh nng chng chu li cao. Cn nu ta vit cc lp cho cc lp trnh vin khc s dng trong chng trnh ca h, ta c th cn nh ngha cc kiu ngoi l c th cho cc s c c th xy ra khi cc lp ny c dng trong cc chng trnh khc. Mt lp ngoi l mi cn phi l lp chuyn bit ha ca mt lp ngoi l c sn loi ngoi l mi c th dng c vi c ch x l ngoi l thng thng. Mt lp ngoi l in hnh ch cha hai hm khi to, mt hm khng ly i s v truyn mt thng bo li mc nh cho hm khi to ca lp cha, mt hm ly mt xu k t l thng bo li ty chn v truyn n cho hm khi to ca lp cha.

Cn trong phn ln cc trng hp, ta ch cn mt lp con rng vi mt ci tn thch hp l . Nn dnh cho mi loi s c nghim trng mt lp ngoi l c t tn thch hp tng tnh trong sng ca chng trnh.

Nn chn lp ngoi l c s l mt lp c lin quan. V d, nu nh to lp ngoi l mi cho s c php chia cho 0, ta c th ly lp cha l lp ngoi l cho tnh ton s hc l ArithmeticException. Nu khng c lp ngoi l c sn no thch hp lm lp cha, ta nn xt n vic ngoi l mi nn thuc loi c kim tra (checked) hay khng (unchecked). Nu cn bt buc chng trnh s dng x l ngoi l, ta dng loi c kim tra, ngha l l lp con ca Exception nhng khng phi lp con ca RuntimeException. Cn nu c th cho php chng trnh ng dng b qua ngoi l ny, ta chn lp cha l RuntimeException.

190

11.7. NGOI L V CC PHNG THC CI Gi s ta vit mt lp con v ci mt phng thc ca lp cha. C nhng rng buc g v vic nm ngoi l t trong phng thc ca lp con? Ta nh li nguyn l "Cc i tng thuc lp con c th c i x nh th chng l cc i tng thuc lp cha". Ni cch khc, on m no chy c vi mt lp cha cng phi chy c vi bt k lp no c dn xut t lp . t trong ng cnh c th hn ca li gi phng thc t tham chiu ti lp cha, ta c quy tc rng phng thc ci ch c nm cc kiu ngoi l c khai bo ti phin bn ca lp cha, hoc ngoi l thuc cc lp con ca cc kiu ni trn, hoc khng nm ngoi l no.

Hnh 11.14: Nm ngoi l t phng thc ci .

Ly v d trong Hnh 11.14. Phng thc blah() vn c vit cho i s thuc kiu A. Khi catch (ExceptionA e) trong bt loi ngoi l m phng thc methodA() ca A c th nm. B l lp con ca A, do c th chy blah() cho kiu B. Nu khi catch ni trn khng th bt c cc loi ngoi l m phin bn methodA() ca B nm, th phng thc blah() khng th c coi l chy c i vi kiu con ca A. Do , kiu ExceptionB m phin bn methodA() ca B tuyn b c th nm phi c nh ngha l mt lp dn xut t lp ExceptionA.

191

Nhng im quan trng: Mt phng thc c th nm ngoi l khi gp s c trong khi ang chy Mt ngoi l l mt i tng thuc kiu Exception hoc lp con ca Exception. Trnh bin dch khng quan tm n cc ngoi l kiu RuntimeException. Cc ngoi l kiu RuntimeException khng bt buc phi c phng thc x l bng khi try/catch hay khai bo throws n. Tt c cc loi ngoi l m trnh bin dch quan tm c gi l cc ngoi l c kim tra. Cc ngoi l cn li (cc loi RuntimeException) c gi l ngoi l khng c kim tra. Mt phng thc nm mt ngoi l bng lnh throw, tip theo l mt i tng ngoi l mi. Cc phng thc c th nm mt ngoi l loi c kim tra phi khai bo ngoi l vi dng throws Exception Nu mt phng thc ca ta gi mt phng thc c nm ngoi l loi c kim tra, phng thc phi m bo rng ngoi l c quan tm x l. Nu mun x l ngoi l pht sinh t mt on m, ta bc on m vo trong mt khi try/catch v t phn m x l ngoi l/khc phc s c vo trong khi catch. Nu khng nh x l ngoi l, ta c th 'n' ngoi l bng khai bo throws. Nu mt lp con ci phng thc ca lp cha th phin bn ca lp con ch c nm cc kiu ngoi l c khai bo ti phin bn ca lp cha, hoc ngoi l thuc cc lp con ca cc kiu ni trn, hoc khng nm ngoi l no.

192

Bi tp
1. Lit k 5 ngoi l thng dng. 2. Nu khng c ngoi l c nm trong mt khi try, iu khin s i ti u khi khi try chy xong? 3. Chuyn g xy ra nu khng c khi catch no bt c i tng ngoi l b nm? 4. Chuyn g xy ra nu nhiu hn mt khi catch c th bt i tng ngoi l b nm? 5. Khi finally dng lm g? 6. Chuyn g xy ra vi mt tham chiu a phng trong mt khi try khi khi nm mt ngoi l? 7. Trong cc pht biu sau u, pht biu no ng/sai? a) Sau mt khi try phi l mt khi catch km theo mt khi finally. b) Nu ta vit mt phng thc c th pht sinh mt ngoi l m trnh bin dch kiu tra, ta phi bc on m vo trong mt khi try/catch. c) Cc khi catch c th mang tnh a hnh. d) Ch c th bt c cc loi ngoi l m trnh bin dch kim tra. e) Nu ta vit mt khi try/catch, c th vit khi finally, c th khng. f) Nu ta vit mt khi try, ta c th vit km mt khi catch hoc mt khi try tng ng, hoc c hai. g) Phng thc main() trong chng trnh phi x l tt c cc ngoi k cha c x l ri xung cho n. h) Mt khi try c th km theo nhiu khi catch. i) Mt phng thc ch c nm mt loi ngoi l, j) Mt khi finally s chy bt k ngoi l c c nm hay khng. k) Mt khi finally c th tn ti m khng cn i km khi try no l) Th t ca cc khi catch khng quan trng. m) Mt phng thc c mt khi try/catch vn c th khai bo c phn throws. n) Cc ngoi l run-time bt buc phi c bt x l hoc c khai bo nm. 8. (Dng lp c s khi bt ngoi l) S dng quan h tha k to mt lp c s ExceptionA v cc lp dn xut ExceptionB v ExceptionC, trong ExceptionB tha k ExceptionA v ExceptionC tha k ExceptionB. Vit mt chng trnh 193

minh ha cho vic khi catch cho loi ExceptionA bt cc ngoi l thuc loi ExceptionB v ExceptionC. 9. (Dng lp Exception khi bt ngoi l) Vit mt chng trnh minh ha vic bt cc ngoi l khc nhau bng khi
catch ( Exception exception )

Gi : u tin, vit lp ExceptionA l lp con ca Exception v ExceptionB l lp con ca ExceptionA. Trong chng trnh, bn hy to khi try nm cc ngoi l thuc cc kiu ExceptionA, ExceptionB, NullPointerException v IOException. Tt c cc ngoi l cn c bt bi cc khi catch c khai bo bt loi Exception. 10. (Th t ca cc khi catch) Vit mt chng trnh cho thy th t ca cc khi catch l quan trng. Nu bn c bt ngoi l lp cha trc khi bt ngoi l lp con, trnh bin dch s sinh li. 11. (S c ti constructor) Vit mt chng trnh demo vic mt hm khi to gi thng tin v mt s c ca hm khi to ti mt on m x l ngoi l. nh ngha lp SomeException, lp ny nm mt i tng Exception t bn trong hm khi to. Chng trnh ca bn cn to mt i tng thuc loi SomeException, v bt ngoi l c nm t bn trong hm khi to. 12. (Nm tip ngoi l) Vit mt chng trnh minh ha vic nm tip mt ngoi l. nh ngha cc phng thc someMethod() v someMethod2(). Phng thc someMethod2() cn nm mt ngoi l. Phng thc someMethod() cn gi someMethod2(), bt ngoi l v nm tip. Gi someMethod() t trong phng thc main v bt ngoi l va c nm tip. Hy in thng tin ln vt (stack trace) ca ngoi l . 13. (Bt ngoi l bn ngoi hm xy ra ngoi l) Vit mt chng trnh minh ha vic mt phng thc vi khi try khng phi bt tt c cc ngoi l c to ra t trong khi try . Mt s ngoi l c th trt qua, ri ra ngoi phng thc v c x l ni khc. 14. Vi cc lp Account, Fee, NickleNDime, Gambler c vit t bi tp cui Ch-ng 7, b sung cc on m nm v x l ngoi l kim sot cc iu kin sau: a) Ti khon khi to mi phi c s tin ban u ln hn 0. b) S tin rt hoc gi phi ln hn 0 v khng c vt qu s tin hin c trong ti khon. Ring ti khon loi Gambler khng c rt qu s tin hin c. To cc lp ngoi l InvalidAmountException (s tin khng hp l) v OverWithdrawException (rt tin qu lng cho php) s dng trong cc trng hp trn. Trong OverWithdrawException l lp con ca InvalidAmountException. 194

Vit chng trnh AccountExceptionTest chy th cc trng hp gy li.

195

Chng 12.

Chui ha i tng v vo ra file

Cc i tng c trng thi v hnh vi. Cc hnh vi lu tr trong lp, cn trng thi nm ti tng i tng. Vy chuyn g xy ra nu ta cn lu trng thi ca mt i tng? Chng hn, trong mt ng dng tr chi, ta cn lu trng thi ca mt vn chi, ri khi ngi chi quay li chi tip vn chi ang d, ta cn np li trng thi lu. Cch lm truyn thng vt v l ly tng gi tr d liu lu trong mi i tng, ri ghi cc gi tr vo mt file theo nh dng m ta t quy nh. Hoc theo phng php hng i tng, ta ch vic l phng, hay p bp, i tng khi lu n, ri thi phng n ln khi cn s dng tr li. Cch truyn thng i khi vn cn n, c bit khi cc file m ng dng ghi s c c bi cc ng dng khng vit bng Java. Chng ny s ni n c hai phng php lu tr i tng. C hai la chn cho vic lu tr d liu: Nu file d liu s c dng bi chnh chng trnh sinh ra n, ta dng phng php chui ha (serialization): chng trnh ghi cc i tng c chui ha vo mt file, ri khi cn th c cc i tng chui ha t file v bin chng tr li thnh cc i tng hot ng trong b nh heap. Nu file d liu s c s dng bi cc chng trnh khc, ta dng file lu tr dng text: Vit mt file dng text vi c php m cc chng trnh khc c th hiu c. V d, dng tab tch gia cc gi tr d liu, dng du xung dng tch gia cc i tng. Tt nhin, khng phi cc la chn duy nht. Ta c th lu d liu theo c php bt k m ta chn. Chng hn, thay v ghi d liu bng cc k t (text), ta c th ghi bng dng byte (nh phn). Hoc ta c th ghi d liu kiu c bn theo cch Java tr gip ghi kiu d liu c cc phng thc ring ghi cc gi tr kiu int, long, boolean, v.v.. Nhng bt k ta dng phng php no, cc k thut vo ra d liu c bn u gn nh khng i: ghi d liu vo ci g , thng l mt file trn a hoc mt kt ni mng; c d liu l quy trnh ngc li: c t file hoc mt kt ni mng. Ta ly mt v d. Gi s ta c mt chng trnh tr chi ko di nhiu bi. Trong tr chi, cc nhn vt khe ln hoc yu i, thu thp, s dng, nh mt mt s loi v kh. Ngi chi khng th chi lin tc t bi 1 cho n khi 'ph o'10 m phi ngng gia chng cho cc hot ng khc trong cuc sng. Mi khi ngi chi tm dng, chng trnh cn lu trng thi ca cc nhn vt tr chi khi phc li
10

'Ph o' c ngha l chi xong bi cui cng ca tr chi in t c nhiu bi chi ln lt.

196

trng thi tr chi khi ngi chi tip tc. C th, ta hin c ba nhn vt / i tng: xc sng (zombie), sng u (pea shooter), v nm thn (magic mushroom).

Hnh 12.1: Hai cch ghi i tng ra file.

Nu dng la chn 1, ta ghi dng chui ha ba i tng trn vo mt file. File s dng nh phn, nu ta th c theo dng text th kh c th hiu c ni dung. Nu dng la chn 2, ta c th to mt file v ghi vo ba dng text, mi dng dnh cho mt i tng, cc trng d liu ca mi i tng c tch nhau bi du phy. Xem minh ha ti Hnh 12.1. File cha cc i tng chui ha kh c i vi con ngi. Tuy nhin i vi vic chng trnh khi phc li ba i tng t file, biu din chui ha li l dng d hiu v an ton hn l dng text. Chng hn, i vi file text, do li l-gic ca lp trnh vin m chng trnh c th c nhm th t cc trng d liu, kt qu l i tng zombie b khi phc thnh nhn vt loi hands v c cc v kh l zombie v teeth. 12.1. QUY TRNH GHI I TNG Cch ghi i tng chui ha s c trnh by mt cch chi tit sau. Tm thi, ta ch gii thiu cc bc c bn:

197

FileOutputStream fileStream = new FileOutputStream("game.dat");

ObjectOutputStream os = new ObjectOutputStream(fileStream); 3. Ghi cc i tng os.writeObject(zombie); os.writeObject(peaShooter); os.writeObject(mushroom); 4. ng dng ObjectOutputStream os.close()

Bc 1 to mt dng ra dng file, FileOutputStream, i tng dng ra ny kt ni vi file c tn 'game.dat', nu cha c file vi tn th n s to mi mt file nh vy. Bc 2 to mt i tng kiu ObjectOutputStream dng ra cho d liu dng i tng. N cho php ghi i tng nhng n li khng th kt ni trc tip vi mt file. Vy nn ta ni n vi i tng dng ra dng file 'gip ' n trong vic ghi ra file. Bc 3 chui ha cc i tng m zombie, peaShooter, v mushroom chiu ti, ri ghi n ra file qua dng ra os. Bc 4 ng dng ra dng i tng. Khi ng mt dng ra, dng m n ni ti, y l FileOutputStream, s c ng t ng. Vic ghi d liu n y kt thc. Chng ta ni n cc dng, vy bn cht chng l ci g? C th hnh dung dng (stream) nh mt ng ng m d liu di chuyn trong i t ni ny sang ni khc. Th vin vo ra d liu ca Java c cc dng kt ni (connection stream) i din cho cc kt ni ti cc ch v cc ngun nh cc file hay socket mng, v cc dng ni tip (chain stream) khng th kt ni vi cc ch v ngun m ch c th chy c nu c ni vi cc dng khc. Thng thng, lm vic g , ta cn dng t nht hai dng ni vi nhau: mt dng i din cho kt ni vi ngun hay ch ca d liu, dng kia cung cp tin ch c/ghi. L do l dng kt ni thng h tr mc qu thp. V d, dng kt ni FileOutputStream ch cung cp cc phng thc ghi byte. Cn ta khng mun ghi tng byte hoc chui byte. Ta mun ghi i tng, do ta cn mt dng ni tip mc cao hn, chng hn ObjectOutputStream l dng ni tip cho php ghi i tng. Vy ti sao th vin khng c mt dng m mnh n lm c chnh xc nhng g ta cn, pha trn th cho ta phng thc ghi i tng cn pha di th bin i ra chui byte v ra file? Vi t tng hng i tng, mi lp ch nn lm mt nhim v. FileOutputStream ghi byte ra file, cn ObjectOutputStream bin i tng thnh dng d liu c th ghi c vo mt dng. Th cho nn, ta to mt FileOutputStream c th ghi ra file, v ta ni mt ObjectOutputStream vo u kia. V khi ta gi writeObject() t ObjectOutputStream, i tng c bm vo 198

dng, chuyn thnh chui byte, v di chuyn ti FileOutputStream, ni n c ghi vo mt file.

Kh nng lp ghp cc t hp khc nhau ca cc dng kt ni v cc dng ni tip mang li cho ta kh nng linh hot. Ta c th t lp ghp mt chui cc dng theo nhu cu ca ta ch khng phi i nhng ngi pht trin th vin Java xy dng cho ta mt dng cha tt c nhng g ta mun. 12.2. CHUI HA I TNG Chuyn g xy ra khi mt i tng b chui ha? Cc i tng ti heap c trng thi l gi tr ca cc bin thc th ca i tng. Cc gi tr ny to nn s khc bit gia cc thc th khc nhau ca cng mt lp. i tng b chui ha lu li cc gi tr ca cc bin thc th, sau ny c th khi phc li mt i tng ging ht ti heap. V d, mt i tng b kiu Box c hai bin thc th thuc kiu c bn width = 37 v height = 70. Khi gi lnh os.writeObject(b), cc gi tr c ly ra v bm vo dng, km theo mt s thng tin khc, chng hn nh tn lp, m sau ny my o Java s cn n khi phc i tng. Tt c c ghi vo file dng nh phn. i vi cc bin thc th kiu c bn th ch n gin nh vy, cn cc bin thc th kiu tham chiu i tng th sao? Nu nh mt i tng c bin thc th l tham chiu ti mt i tng khc, v chnh i tng li c cc bin thc th? Khi mt i tng c chui ha, tt c cc i tng c chiu ti t cc bin thc th ca n cng c chui ha. V tt c cc i tng m cc i tng chiu ti cng c chui ha, ... Ton b cng vic quy ny c thc hin mt cch t ng. V d, mt i tng ContactList (danh b in thoi) c mt tham chiu ti mt i tng mng Contact[]. i tng kiu Contact[] lu cc tham chiu ti hai i tng Contact. Mi i tng Contact c tham chiu ti mt String v mt i tng PhoneNumber. i tng String c mt lot cc k t v i tng PhoneNumber c mt s kiu long. Khi ta lu i tng ContactList, tt c cc i tng trong th tham chiu ni trn u c lu. C nh vy th sau ny mi c th khi phc i tng ContactList v ng trng thi ny.

199

Hnh 12.2: th tham chiu ca i tng ContactList.

Ta ni v khi nim v l thuyt ca vic chui ha i tng. Vy v mt vit m th nh th no? Khng phi i tng thuc lp no cng nghim nhin chui ha c. Nu ta mun cc i tng thuc mt lp no c th chui ha c, ta phi cho lp ci t interface Serializable. Serializable l mt interface thuc loi dng nh du (dng marker hoc tag). Cc interface loi ny khng c phng thc no ci. Mc ch duy nht ca Serializable l tuyn b rng lp ci n c th chui ha c. Ni cch khc l c th dng c ch chui ha lu cc i tng thuc loi . Nu mt lp chui ha c th tt c cc lp con chu ca n u t ng chui ha c m khng cn phi khai bo implements Serializable. (Ta cn nh ngha ca quan h IS-A.) Nu mt lp khng thuc loi chui ha c, chng trnh no gi phng thc writeObject cho i tng thuc lp c th bin dch khng li nhng khi chy n lnh s gp ngoi l NonSerializableException.

200

Nh ni trn, khi lu mt i tng, ton b cc i tng trong th tham chiu ca n cng c lu. Do , tt c cc lp u phi thuc loi Serializable. Nh trong v d Hnh 12.2 th cc lp ContactList, Contact, PhoneNumber, String u phi thuc loi chui ha c nu khng mun xy ra ngoi l NonSerializableException khi chng trnh chy. Ta i n tnh hung khi trong mt i tng cn lu li c mt bin thc th l tham chiu ti i tng thuc lp khng chui ha c. V ta khng th sa ci t lp cho n chui ha c, chng hn khi lp do ngi khc vit. Gii php l khai bo bin thc th vi t kha transient. T kha ny c tc dng tuyn b rng "hy b qua bin ny khi chui ha".

Bn cnh tnh hung bin thc th thuc loi khng th chui ha, ta cn cn n khai bo transient trong nhng trng hp khc. Chng hn nh khi ngi thit k lp qun khng cho lp kh nng chui ha. Hoc v i tng ph thuc vo thng tin c th cho tng ln chy chng trnh m thng tin khng th lu c. V d v dng i tng l cc i tng lung (thread), kt ni mng, hoc file trong th vin Java. Chng thay i ty theo tng ln chy ca chng 201

trnh, tng platform c th, tng my o Java c th. Mt khi chng trnh tt, khng c cch g khi phc chng mt cch hu ch, chng phi c to li t u mi ln cn dng n. 12.3. KHI PHC I TNG Mc ch ca vic chui ha mt i tng l ta c th khi phc n v trng thi c vo mt thi im khc, ti mt ln chy khc ca my o Java (thm ch ti my o khc). Vic khi phc i tng (deserialization) gn nh l qu trnh ngc li ca chui ha.

Bc 1 to mt dng vo dng file, FileInputStream, i tng dng vo ny kt ni vi file c tn 'game.dat', nu khng tm thy file vi tn th ta s nhn c mt ngoi l. Bc 2 to mt i tng dng vo dng i tng, ObjectInputStream. N cho php c i tng nhng n li khng th kt ni trc tip vi mt file. N cn c ni vi mt i tng kt ni, y l FileInputStream, c th ghi ra file. Bc 3, mi ln gi readObject(), ta s ly c i tng tip theo t trong dng ObjectInputStream. Do , ta s c cc i tng theo ng th t m chng c ghi. Ta s nhn c ngoi l nu c c nhiu hn s i tng c ghi vo file. Bc 4, gi tr tr v ca readObject() l tham chiu kiu Object, do ta cn p kiu cho n tr li kiu thc s ca i tng m ta bit. Bc 4 ng ObjectInputStream. Khi ng mt dng vo, cc dng m n ni ti, y l FileInputStream, s c ng t ng. Vic c d liu n y kt thc. Qu trnh khi phc i tng din ra theo cc bc nh sau:

202

1. i tng c c t dng vo di dng mt chui byte. 2. My o Java xc nh xem i tng thuc lp g, qua thng tin lu tr ti i tng c chui ha. 3. My o tm v np lp . Nu khng tm thy hoc khng np c, my o s nm mt ngoi l v qu trnh khi phc tht bi. 4. Mt i tng mi c cp pht b nh ti heap, nhng hm khi to ca i tng khng chy. Nu chy th n s khi to v trng thi ban u nh kt qu ca lnh new. Ta mun i tng c khi phc v trng thi khi n c chui ha, ch khng phi trng thi khi n mi c sinh ra. 5. Nu i tng c mt lp t tin thuc loi khng chui ha c, hm khi to cho lp s c chy cng vi cc hm khi to ca cc lp bn trn n trn cy ph h. 6. Cc bin thc th ca i tng c gn gi tr t trng thi c chui ha. Cc bin transient c gn gi tr mc nh: null cho tham chiu v 0/false/ cho kiu c bn.

203

Hnh 12.3: Ghi i tng vo file v c t file.

204

Hnh 12.4: Ci t cc lp chui ha c.

Tng kt li, ta ci t hon chnh v d ghi v c cc i tng nhn vt tr chi trong Hnh 12.3. Phin bn ci t ti thiu ca GameCharacter v cc lp cn thit c cho trong Hnh 12.4. Lu rng ch l ni dung c bn phc v mc ch th nghim c v ghi i tng ch khng phi dnh cho mt chng trnh tr chi thc s. 12.4. GHI CHUI K T RA TP VN BN S dng c ch chui ha cho vic lu tr i tng l cch d dng nht lu tr v khi phc d liu gia cc ln chy ca mt chng trnh Java. Nhng i khi, ta cng cn lu d liu vo mt file vn bn, chng hn khi file cho mt chng trnh khc (c th khng vit bng Java) c. Vic ghi mt chui k t ra file vn bn tng t vi vic ghi mt i tng, ch khc ch ta ghi mt i tng String thay v mt i tng chung chung, v ta dng cc dng khc thay cho FileOutputStream v ObjectOutputStream.

205

Hnh 12.5: Ghi file vn bn.

Hnh 12.5 l v d c bn nht minh ha vic ghi file vn bn. Java cho ta nhiu cch tinh chnh chui cc dng ra dng cho vic ghi file. 12.4.1. Lp File i tng thuc lp java.io.File i din cho mt file hoc mt th mc. Lp ny khng c cc tin ch ghi c file, nhng n l i din an ton cho file hn l chui k t tn file. Hu ht cc lp ly tn file lm tham s cho hm khi to, chng hn FileWriter hay FileInputStream, cng cung cp hm khi to ly mt i tng File. Ta c th to mt i tng File, kim tra xem ng dn c hp l hay khng, v.v.. ri chuyn i tng File cho FileWriter hay FileInputStream. Vi mt i tng File, ta c th lm mt s vic hu ch nh: 1. To mt i tng File i din cho mt file ang tn ti:
File f = new File("foo.txt");

2. To mt th mc mi:
File dir = new File("Books"); dir.mkdir();

3. Lit k ni dung ca mt th mc:


if (dir.isDirectory()) { String[] dirContents = dir.list(); for (int i = 0; i < dirContents; i++) System.out.println(dirContents[i]); }

4. Ly ng dn tuyt i ca file hoc th mc:


System.out.println(dir.getAbsolutePath());

5. Xa file hoc th mc (tr v true nu thnh cng):


boolean isDeleted = f.delete();

206

12.4.2. B nh m B nh m (buffer) cho ta mt ni lu tr tm thi tng hiu qu ca thao tc c/ghi d liu. Cch s dng BufferWriter nh sau:
BufferWriter writer = new BufferWriter(new FileWriter(aFile);

Sau lnh trn th ta ch cn lm vic vi BufferWriter m khng cn n i tng FileWriter va to na. Li ch ca vic s dng BufferWriter c gii thch nh sau: Nu ch dng FileWriter, mi ln ta yu cu FileWriter ghi mt chui d liu no , chui lp tc c vo file. Chi ph v thi gian x l cho mi ln ghi file l rt ln so vi chi ph cho cc thao tc trong b nh. Khi ni mt dng BufferWriter vi mt FileWriter, BufferWriter s gi nhng g ta ghi vo n cho n khi y. Ch khi b nh m BufferWriter y th FileWriter mi c lnh ghi d liu ra a. Nh vy, ta tng c hiu qu v mt thi gian ca vic ghi d liu do gim s ln ghi a cng. Nu ta mun d liu ra a trc khi b nh m y, ta c th gi writer.flush() lp tc x ton b ni dung trong b nh m. 12.5. C TP VN BN c t file vn bn l cng vic c quy trnh tng t ghi file, ch khc l gi ta dng mt i tng FileReader trc tip thc hin cng vic c file v mt i tng BufferReader ni vi n tng hiu qu c. Hnh 12.6 l v d n gin v vic c mt file vn bn. Trong , mt i tng FileReader mt dng kt ni cho dng k t c ni vi mt file c trc tip. Tip theo l mt i tng BufferReader c ni vi FileReader tng hiu qu c. Vng while lp i lp li vic c mt dng t BufferReader cho n khi dng c c l rng (tham chiu null), l khi khng cn g c na - chm n cui file.

207

Hnh 12.6: c file vn bn.

Nh vy vi cch c ny, ta c c d liu di dng cc dng vn bn. tch cc gi tr d liu ti mi dng, ta cn x l chui theo nh dng m d liu gc c ghi. Chng hn, nu d liu l cc chui k t cch nhau bi du phy th ta s phi tm v tr ca cc du phy tch cc gi tr d liu ra. Phng thc split ca lp String cho php ta lm iu ny. V d s dng phng thc split c cho trong Hnh 12.7. C th tra cu chi tit v phng thc ny ti ti liu Java API.

208

Hnh 12.7: V d s dng phng thc split.

12.6. CC DNG VO/RA TRONG Java API Mc ny trnh by li mt cch c h thng cc kin thc v th vin vo ra d liu ca Java m ta ni n ri rc cc mc trc. Ni dung mc ny ch mc gii thiu s qua v mt s dng vo ra quan trng. Cc chi tit cn c tra cu ti liu Java API. Java coi mi file nh l mt dng tun t cc byte. Mi dng nh vy c th c hiu l thuc v mt trong hai dng: dng k t (character-based stream) dnh cho vo ra d liu dng k t v dng byte (byte-based stream) dnh cho d liu dng nh phn. V d, nu 5 c lu vi dng byte, n s c lu tr dng nh phn ca gi tr s 5, hay chui bit 101. Cn nu lu bng dng k t, n s c lu tr dng nh phn ca k t 5, hay chui bit 00000000 00110101 (dng nh phn ca gi tr 53, l m Unicode ca k t 5). File c to bng dng byte l file nh phn, cn file c to bng dng k t l file vn bn. Con ngi c th c ni dung file vn bn bng cc trnh son tho vn bn, cn cc file nh phn c c bi cc chng trnh bin i d liu nh phn ra nh dng con ngi c c. trao i d liu vi mt file hay mt thit b, chng trnh Java to mt dng kt ni v ni vi file hay thit b . V d, ta c sn ba dng: System.in l dng vo chun (thng ni vi bn phm), System.out l dng ra chun (thng ni vi ca s lnh), v System.err l dng bo li chun (lun ni vi ca s lnh). Cc dng dnh cho vic x l d liu nh phn nm trong hai cy ph h: cc dng c t tin l InputStream c d liu, cn cc dng c t tin l OutputStream ghi d liu. Cc dng c s InputStream/OutputStream ch cung cp cc phng thc cho php c/ghi d liu th dng byte. Cc lp con ca chng cho php c/ghi cc gi tr thuc cc kiu d liu phc tp hn hoc cho php kt ni vi cc loi thit b c th. Mt s dng quan trng trong gm c: 209

FileInputStream/FileOutputStream: dng kt ni ni trc tip vi file nh phn cn c/ghi theo dng tun t. ObjectInputStream/ObjectOutputStream: dng ni tip, c th ni vi mt InputStream/OutputStream khc. Cc dng ny cho php c/ghi tng i tng thuc loi chui ha c. DataInputStream/DataOutputStream: dng ni tip, c th ni vi mt InputStream/OutputStream khc, cho php c/ghi cc gi tr thuc cc kiu c bn nh int, long, boolean, ... (xem v d trong Hnh 12.8)

Hnh 12.8: c v ghi d liu kiu c bn.

Cc dng dnh cho vic x l d liu vn bn nm trong hai cy ph h: cc dng c t tin l Reader c d liu, cn cc dng c t tin l Writer ghi d liu. Cc dng c s Reader/Writer ch cung cp cc phng thc cho php c/ghi d liu dng char hoc chui char. Cc lp con ca chng cho php c/ghi vi hiu 210

qu cao hn v cung cp cc tin ch b sung. Mt s dng quan trng trong gm c: FileReader/FileWriter: dng kt ni ni trc tip vi file cn c/ghi d liu vn bn theo dng tun t. FileReader cho php c String t file. FileWriter cho php ghi String ra file. BufferedReader/BufferedWriter: dng ni tip, c th ni vi mt Reader/Writer khc c/ghi vn bn vi b nh m nhm tng tc x l. InputStreamReader/OutputStreamWriter : dng ni tip, l cu ni t dng k t ti dng byte, c th ni vi mt InputStream/OutputStream. N cho php c/ghi d liu dng k t c m ha trong mt dng byte theo mt b m cho trc. PrintWriter: cho php ghi d liu c nh dng ra dng k t, c th kt ni trc tip vi File, String, hoc ni tip vi mt Writer hay OutputStream. V d v InputStreamReader c cho trong Hnh 12.9. Trong , kt ni Internet l ngun d liu dng byte. u tin, ngun vo c ni vi mt InputStream c th c d liu byte th. Sau , n c ni vi mt InputStreamReader chuyn t d liu byte sang d liu vn bn. Cui dng, ta ni mt BufferReader vo InputStreamReader c th c vn bn vi tc cao hn.

211

Hnh 12.9: c d liu vn bn t kt ni Internet.

V d v s dng dng PrintWriter c cho trong Hnh 12.10. Dng ny cung cp cc phng thc ghi d liu ra tng t nh ta quen dng vi dng System.out.

Hnh 12.10: Dng PrintWriter.

212

c thm
Chng ny ni v cc nt c bn v nguyn l s dng ca dng vo ra d liu, ch dng li vic gii thiu s lc ch khng i su vo vic s dng vo ra d liu s dng th vin chun Java. tm hiu su hn v h tr ca Java cho vic qun l v vo ra d liu file, ngi c c th c thm ti cc ti liu i su vo ni dung lp trnh Java nh: 1. Basic I/O, The JavaTM Tutorials, http://docs.oracle.com/javase/tutorial/essential/io/index.html 2. Chng 14, Deitel & Deitel, Java How to Program, 6th edition, Prentice Hall, 2005. Mt ch kh lin quan n vo ra d liu l lp trnh mng. Ngi c c th c thm v ch ny ti cc ti liu nh: 1. Networking Basics, The JavaTM Tutorials, http://docs.oracle.com/javase/tutorial/networking/overview/networking.html 2. Chng 15, Sierra, Bert Bates, Head First Java, 2nd edition, O'Reilly, 2008.

213

Bi tp
1. ng hay sai? a) Chui ha l phng php thch hp khi lu d liu cho cc chng trnh khng c vit bng Java s dng. b) Chui ha l cch duy nht lu trng thi ca i tng c) C th dng ObjectOutputStream lu cc i tng c chui ha. d) Cc dng ni tip c th c dng ring hoc kt hp vi cc dng kt ni. e) C th dng mt li gi ti writeObject() c th lu nhiu i tng. f) Mc nh, tt c cc lp u thuc din chui ha c. g) T kha transient nh du cc bin thc th chui ha c h) nu mt lp cha khng chui ha c th lp con ca n cng khng th chui ha c. i) Khi mt i tng c khi phc (kh chui ha), hm khi to ca n khng chy. j) Khi cc i tng c khi phc (kh chui ha), chng c c theo th t "ghi sau - c trc". k) C hai vic chui ha i tng v lu ra file vn bn u c th nm ngoi l. l) BufferedWriter c th ni vi FileWriter. m) Cc i tng File i din cho file ch khng i din cho th mc n) Ta khng th buc mt buffer gi d liu ca n nu n cha y. o) Thay i bt k i vi mt lp s ph hng cc i tng ca lp c chui ha t trc. 2. Vit lp Contact m t mt mc trong danh b in thoi, cc trng d liu gm: tn, a ch, s in thoi; lp ContactList qun l danh b in thoi, l mt danh sch cc i tng Contact. Lp ContactList cn cung cp cc phng thc cho php thm mc mi, xa mc c trong danh b, lu danh b ra file v np t file. Dng c ch ci chng cho php s dng c hai c ch chui ha i tng v dng file vn bn.

214

Chng 13.

Lp trnh tng qut v cc lp collection

Ta th hnh dung mt phng thc sort sp xp mt lot cc gi tr kiu int, mt phng thc sort khc dnh cho cc i tng String, mt phng thc sort dnh cho cc i tng kiu Complex (s phc). M ci t cc phng thc hu nh l ging ht nhau, ch khc kiu d liu ti cc dng khai bo bin. Hnh dung mt lp IntegerStack (ngn xp) lu tr cc i tng Integer, mt lp AnimalStack lu tr cc i tng Animal, mt lp StringStack lu tr cc i tng String, v.v.. M ci t cc lp ny cng hu nh l ging ht nhau. Nu nh ta c th vit duy nht mt phng thc sort dng c cho c int, String, Complex, mt lp Stack dng to c c ngn xp Integer, ngn xp Animal, ngn xp String, th l lp trnh tng qut. Lp trnh tng qut cho php xy dng cc phng thc tng qut v cc lp tng qut, m nh c c mt tp cc phng thc tng t nhau t ch mt ci t phng thc, mt tp cc kiu d liu tng t nhau t ch mt ci t lp Trc phin bn 5.0 ca Java API, ta c th dng quan h tha k v lp Object c cc cu trc d liu tng qut. Chng hn, ta to mt lp MyStack l ngn xp dnh cho kiu Object:

215

Hnh 13.1: Cu trc d liu cha Object.

Do Object l lp t tin ca tt c cc lp khc, nn ta c th dng i tng MyStack lm ngn xp cho cc i tng kiu Integer, hay cho cc i tng String (xem Hnh 13.1). Tuy nhin, nhc im ca cch lm ny l khi ly d liu ra khi cu trc, ta cn phi p kiu tr li kiu ban u, do cc phng thc ca MyStack ch bit lm vic vi tham chiu kiu Object. Ngoi ra, cng v MyStack coi tt c cc phn t nh l cc Object, nn trnh bin dch khng kim tra kiu m bo mt i tng MyStack ch cha cc i tng thuc cng mt loi, ch ton Integer hoc ch ton String. Cc i tng Integer, hay String, hay thm ch Cow th cng u l Object c. Cc i tng ngn xp c tim nng tr thnh hn n v s d sinh li trong qu trnh chy. khng phi l s linh hot m ta mong mun.

216

Hnh 13.2: Cu trc d liu tng qut.

K t phin bn 5.0, Java h tr mt c ch khc ca lp trnh tng qut, khc phc c hai nhc im trn. V d nh trong Hnh 13.2. T y, ta c th to cc collection c tnh an ton kiu cao hn, cc vn v kiu c pht hin khi bin dch thay v ti thi gian chy. Chng ny ni v c ch lp trnh tng qut . 13.1. LP TNG QUT Lp tng qut l lp m trong khai bo c t nht mt tham s kiu. Lp ArrayList m ta gp cc chng trc l mt v d v lp tng qut trong th vin chun ca Java. Mt i tng ArrayList v bn cht l mt mng ng cha cc tham chiu kiu Object. Do lp no cng l lp con ca Object nn ArrayList c th lu tr mi th. Khng ch vy, ArrayList cn s dng mt khi nim ca Java l "tham s kiu", nh ArrayList<String>, gii hn cc gi tr c th c lu trong phm vi mt kiu d liu nht nh. Ta s dng ArrayList lm v d ni v vic s dng cc lp collection ny. Khi tm hiu v mt lp tng qut, c hai im quan trng: 1. dng khai bo lp, 2. cc phng thc cho php chn cc phn t vo i tng collection. C th i vi ArrayList, dng khai bo lp m ta c th thy trong ti liu API nh sau:

Dng khai bo trn cho bit cc thng tin sau: "E" i din cho kiu ca cc phn t ta mun lu tr trong ArrayList, l kiu d liu c dng to mt i tng 217

ArrayList. Ta hnh dung tt c cc ln xut hin ca "E" trong khai bo lp ArrayList c thay bng tn kiu d liu . Ln xut hin th hai ca E, Abstract<E>, cho bit kiu d liu c ch nh cho ArrayList s c t ng tr thnh kiu d liu c ch nh cho AbstractList lp cha ca ArrayList. Ln xut hin th ba, List<E>, cho bit kiu d liu c ch nh cho ArrayList cng t ng c ch nh cho kiu ca interface List. Ln xut hin th t, add(E o), cho bit kiu m E i din l kiu d liu ta c php chn vo i tng ArrayList. Ni cch khc, khi to mt i tng ArrayList, ta thay th "E" bng tn kiu d liu thc (kin tham s) m ta s dng. Vy nn phng thc add(E o) khng cho ta chn thm vo ArrayList bt c ci g ngoi cc i tng thuc kiu tng thc vi "E". V d, lnh khai bo vi tham s kiu Cow:
ArrayList<Cow> list = new ArrayList<Cow>();

c tc dng lm cho on khai bo ArrayList trn c hiu thnh:

Hnh 13.3 l v d y v mt lp tng qut vi hai tham s kiu T v U, v mt on m s dng lp . Pair l lp i din cho cc i tng cha mt cp d liu thuc hai kiu d liu no . T i din cho kiu d liu ca bin thc th th nht, U i din cho kiu d liu ca bin thc th th hai.

Hnh 13.3: Lp Pair vi hai tham s kiu.

Khi ta khai bo mt i tng kiu Pair, ta cn ch r gi tr ca hai tham s kiu T v U. Trong v d, ta to i tng kiu Pair<String, Integer>, c ngha T c quy 218

nh l kiu String, U l kiu Integer. Dn n vic ta c th hnh dung nh th tt c cc ln xut hin ca T trong nh ngha lp Pair c hiu l String, v tt c cc ln xut hin ca U c hiu l Integer. T v U l hai tham s kiu khc nhau, nn ta c th to Pair vi hai kiu d liu bt k, c th khc nhau nhng cng c th ging nhau, chng hn Pair<Cow, Cow>. Cc tn T v U thc ra c th l bt c ci tn no theo quy tc t tn bin ca Java, nhng theo quy c chung, ngi ta dng cc k t vit ha cho tn cc tham s kiu. Nh vy, v c bn, ta bit cch to i tng ca mt lp tng qut. Ta cng bit c cch vit mt lp tng qut. Tuy nhin, ta khng ch trng vo vic vit lp tng qut v Java API cung cp Collection Framework vi cc cu trc d liu a dng tha mn nhu cu ca cc ng dng ni chung. (Ta s ni n cc cu trc trong chng ny.) Cc lp trnh vin hu nh khng cn phi vit thm cc lp tng qut mi s dng. 13.2. PHNG THC TNG QUT Phng thc tng qut l phng thc m ti khai bo c s dng t nht mt tham s kiu. Ta c th dng tham s kiu ca phng thc theo nhng cch khc nhau: Dng tham s kiu c quy nh sn ti khai bo lp. Chng hn, tham s E ca phng thc add(E o) trong lp ArrayList<E> l tham s kiu ca lp. Trong trng hp ny, kiu c khai bo ti tham s phng thc c thay th bi kiu m ta dng khi to thc th ca lp. Nu ta to i tng ArrayList<String> th add s tr thnh add(String o). Dng kiu tham s khng c quy nh ti khai bo lp. Nu bn thn lp khng dng tham s kiu, ta vn c th cho phng thc dng tham s kiu bng cch khai bo n ti khong trng trc kiu tr v. V d, phng thc fancyPrint in tt c cc phn t trong mt ArrayList dnh cho kiu T. T c khai bo trc t kha void ti khai bo phng thc

219

public <T> void fancyPrint (ArrayList<T> list)

Hnh 13.4: Ci t v s dng phng thc tng qut.

Phng thc tng qut vi chc nng ly phn t ng gia ca mt mng chung chung c th c ci t v s dng nh trong Hnh 13.4. Trong MyUtil khng phi mt lp tng qut, n khng khai bo tham s kiu. Nhng hm getMiddle li khai bo tham s kiu T, l kiu d liu ca mng m getMiddle x l. Khi gi phng thc getMiddle, ta phi cung cp gi tr cho tham s kiu, chng hn <String>, ti li gi phng thc. Tn kiu c th s c thay vo tt c cc ln xut hin T ti khai bo phng thc getMiddle. 13.3. CC CU TRC D LIU TNG QUT TRONG JAVA API ArrayList ch l mt trong nhiu lp thuc th vin chun Java c dng cho lp trnh tng qut. Bn cnh cn c nhng lp thng dng khc biu din cc cu trc d liu quan trng. V d, LinkedList l danh sch lin kt, TreeSet l cu trc tp hp lun gi tnh trng cc phn t khng trng lp v c sp th t, HashMap cho php lu tr d liu dng cc cp kha-gi tr, HashSet l cu trc tp hp cho php tra cu nhanh, v.v... Mc ny trnh by v cch s dng b cc cu trc tng qut ny ca Java. Cc cu trc d liu tng qut ca Java c th c chia thnh hai th loi: cc lp collection v cc lp map. Mt collection l mt b cc i tng. Mt map lin kt cc i tng thuc mt tp hp vi cc i tng thuc mt tp hp khc, tng t nh mt t in l mt lot cc lin kt gia cc nh ngha v cc t, hay danh b in thoi lin kt cc s in thoi vi cc ci tn. C th coi mt map nh 220

l mt danh sch lin kt (association list). Cc lp collection v cc lp map c i din bi hai interface c tham s kiu: Collection<T> v Map<T,S>. Trong , T v S c th i din cho bt c kiu d liu no ngoi tr cc kiu c bn. C hai loi collection: List v Set. List (danh sch) l loi collection m trong cc i tng c xp thnh mt chui tuyn tnh. Mt danh sch c phn t th nht, th hai, v.v.. Vi mi phn t trong danh sch, tr phn t cui cng, u c mt phn t ng sau n. Set (tp hp) l loi collection m trong khng c i tng no xut hin nhiu hn mt ln. Cc lp loi List v Set c i din bi hai interface List<T> v Set<T>, chng l cc interface con ca interface Collection<T>.

Hnh 13.5: Cc lp v interface tng qut.

Hnh 13.5 m t quan h gia cc lp v interface ca Collection API. Hnh ny khng lit k y cc lp trong Collection API m ch lit k mt s lp/interface quan trng. Lu rng Map (nh x) khng tha k t Collection, nhng Map vn c coi l mt phn ca Collection API. Do , ta vn coi mi i tng kiu Map l mt collection. Mi i tng collection, danh sch hay tp hp, phi thuc v mt lp c th ci t interface tng ng. Chng hn, lp ArrayList<T> ci t interface List<T>, v do ci t c Collection<T>. Interface Collection<T> c t cc phng thc thc hin mt s chc nng c bn i vi collection bt k. Do collection l mt khi nim rt chung chung, cc chc nng cng tng qut c th p dng cho nhiu kiu collection cha cc loi i tng khc nhau. Mt s chc nng chnh: size() tr v s i tng hin c trong collection isEmpty() kiu tra xem collection c rng khng clear() xa rng collection 221

add(), addAll() thm i tng vo collection remove(), removeAll() xa i tng khi collection contains(), containsAll() kim tra xem mt/vi i tng c nm trong collection hay khng toArray() tr v mt mng Object cha tt c cc i tng cha trong collection. 13.4. ITERATOR V VNG LP FOR EACH i khi, ta cn t ci mt s thut ton tng qut, chng hn nh in ra tng phn t trong mt collection. lm c vic mt cch tng qut, ta cn c cch no duyt qua mt collection ty , ln lt truy nhp tng phn t ca collection . Ta bit cch lm vic ny i vi cc cu trc d liu c th, chng hn dng vng for duyt qua tt c cc ch s ca mng. i vi danh sch lin kt, ta c th dng vng while y dn mt con tr dc theo danh sch. Cc lp collection c th c ci bng kiu mng, danh sch lin kt, hay mt cu trc d liu no khc. Mi loi s dng nhng c ch duyt khc nhau. Ta lm cch no c c mt phng thc tng qut chy c cho cc collection c lu tr theo cc kiu khc nhau? Gii php y l cc iterator. Mt iterator l mt i tng dng duyt mt collection. Cc loi collection khc nhau c iterator c ci theo cc cch khc nhau, nhng tt c cc iterator u c s dng theo cng mt cch. Mt thut ton dng iterator duyt mt collection l thut ton tng qut, v n c th dng cho kiu collection bt k. i vi ngi mi lm quen vi lp trnh tng qut, iterator c v kh k quc, nhng n thc ra l mt gii php p cho mt vn rc ri. Collection<T> quy nh mt phng thc tr v mt iterator cho mt collection bt k. Nu coll l mt collection, coll.iterator() tr v mt iterator c th dng duyt collection . Ta c th coi iterator l mt dng tng qut ha ca con tr, n xut pht t im u ca collection v c th di chuyn t phn t ny sang phn t khc cho n khi i ht collection. Iterator c nh ngha trong interface c tham s kiu Iterator<T>. Nu coll ci interface Collection<T> vi kiu T c th no , th coll.iterator() tr v mt iterator ci interface Iterator<T> vi cng kiu T . Iterator<T> quy nh ba phng thc:
next() tr v phn t tip theo (gi tr kiu T) v tin iterator mt bc. Nu

phng thc ny c gi khi iterator i n ht collection, n s nm ngoi l NoSuchElementException.


hasNext() tr v true nu iterator cha i ht collection v vn cn phn t x

l, tr v false trong tnh hung ngc li. Ta thng gi phng thc ny kim tra trc khi gi next()

222

remove() xa khi collection phn t va c next() tr v, ni cch khc l phn

t hin ang c iterator hin hnh chiu ti. Phng thc ny c th nm UnsupportOperationException nu collection ny khng cho php xa phn t. Vi iterator, ta c th vit m x l ln lt tt c cc phn t trong mt collection bt k. Chng hn, v d trong Hnh 13.6 in tt c cc xu k t nm trong mt collection cha String (collection thuc loi Collection<String>):

Hnh 13.6: V d s dng iterator.

Cc quy trnh cn n vic duyt collection u tng t nh v d trn. Chng hn, xa tt c cc s 0 ra khi mt collection thuc loi Collection<Integer>, ta lm nh sau:

Lu rng khi Collection<T>, Iterator<T>, hay bt k kiu c tham s no khc, c dng trong m thc s, chng lun c dng vi cc kiu d liu thc s chng hn nh String, Integer hay Cow thay cho v tr ca tham s kiu T. Mt iterator kiu Iterator<String> c dng duyt qua mt collection gm cc String; mt iterator kiu Iterator<Cow> c dng duyt qua mt collection gm cc i tng Cow, v.v.. Mt iteration thng c dng p dng cng mt thao tc cho tt c cc phn t ca mt collection. Trong nhiu trng hp, c th trnh dng iterator cho mc ch bng cch s dng vng lp for-each. Vi coll thuc loi Collection<T>, vng for-each c dng nh sau:

223

Trong , for (T x : coll) c ngha rng: vi mi i tng x thuc kiu T nm trong coll. on m nm trong ngoc thc hin vi x thao tc cn lm cho tt c cc phn t ca coll. V d, vng while trong Hnh 13.6 c th thay bng on sau:

13.5. SO SNH NI DUNG I TNG Trong interface Collection c quy nh mt s phng thc kim tra cc i tng c bng nhau hay khng. V d, contain(object) v remove(object) tm trong collection mt phn t c gi tr bng i tng i s. Tuy nhin, php so snh bng khng phi vn n gin. Php so snh bng (==) khng dng c cho so snh i tng do n thc cht ch kim tra xem hai i tng c cng mt ch trong b nh hay khng. Cn y, ta coi hai i tng l bng nhau nu chng biu din cng mt gi tr. Hai i tng kiu Date c coi l bng nhau nu chng biu din cng mt thi im. Php so snh ln hn, nh hn cng cn thit cho mt s cng vic nh sp xp, chng hn phng thc tng qut Collections.sort(list) trong Java API yu cu d liu phi cung cp thao tc ny. Trong khi , cc php ton < v > khng dng c cho cc i tng. Mc ny ni v vic cung cp cc phng thc so snh cn thit cho cc kiu d liu m ta mun s dng trong cc cu trc collection. 13.5.1. So snh bng Lp Object nh ngha phng thc equals(Object) tr v gi tr boolean kim tra xem hai i tng c bng nhau hay khng. Do c im tng qut ca Object, ci t ca phng thc ny ti Object khng dng c cho hu ht cc lp con. Do , lp no cn dng n phng thc ny u cn ci li. Chng hn, lp String ci phng thc equals s.equals(obj) tr v true nu s v obj cha chui k t ging ht nhau. Cc phng thc remove() v contains() ni trn ca Collection gi n phng thc equals() ca tng phn t so snh cc i tng. Do c ch a hnh, Object l lp cha ca tt c cc lp khc, nn phin bn ci ca cc lp con s c s dng. 224

i vi cc lp t vit, ta c th cn nh ngha mt phng thc equals() trong cc lp c c hnh vi ng khi i tng thuc cc lp c so snh vi nhau. Nu equals khng hot ng ng th cc phng thc ca Collection nh remove hay contains cng khng hot ng nh mong i. Ta ly mt v d. Hai qun bi c coi l ging nhau nu ging nhau v gi tr (value: t, 2, 3,.. J, Q, K) v cng cht (suit: c, r, pic, tp). M ha t, 2,..., J, Q, K thnh cc gi tr nguyn t 1 n 13, bn cht c, r, pic, tp thnh cc gi tr t 0 n 3.

Hnh 13.7: Phng thc equals.

Ta c ci t n gin ca lp Card vi phng thc equals nh trong Hnh 13.7. Do l phin bn ci phng thc ca Object nn kiu tham s ca equals phi gi nguyn nh bn c l Object. Nu ta s dng cc cu trc tp hp (kiu Set), ta cn cn phi ci thm mt phng thc khc, l hashCode(), mt trong cc phng thc c tha k t Object vi hnh vi mc nh ca phin bn tha k t Object l cho mi i tng mt gi tr bm khc nhau. Khi cn kim tra xem hai i tng c trng nhau hay khng, mt cu trc HashSet s gi n phng thc hashCode() ca hai i tng ly gi tr bm ca chng. Nu hai i tng c gi tr bm khc nhau, HashSet s khng nh chng l hai i tng khc nhau. Cn nu gi tr bm trng nhau (d liu khc nhau c th c gi tr bm trng nhau), HashSet s dng n phng thc equals() kim tra tip xem hai i tng c thc s bng nhau hay khng. Do , ta cn ci hashCode() hai i tng bng nhau s cho gi tr bm trng nhau, nh qua c bc kim tra u tin.

225

Hnh 13.8: Ci equals() v hashCode().

Ta ly v d vi lp Contact - a ch lin lc. Gi s, ta quy c hai Contact c cho l ca mt ngi nu c trng name (tn) trng nhau. Khi , c th ci hai phng thc equals() v hashCode() nh trong Hnh 13.8, trong ta tn dng cc phin bn sn c ca equals() v hashCode() cho lp String. 13.5.2. So snh ln hn/nh hn Tng t vi so snh bng l vn so snh ln hn, nh hn. Gi s ta cn mt cu trc contactList l danh sch cc a ch lin lc lp Contact nh ci mc trc, v i khi ta cn danh sch c sp xp theo tn. C mt s cch lm vic ny vi cc lp c sn trong Collection framework. Ta c th dng phng thc Collections.sort() i vi danh b dng mt i tng List, hoc dng mt cu trc t ng sp xp chng hn nh TreeSet lu danh b. C hai cch u cn phi so snh hai i tng Contact bit i tng no "ln hn" hay "nh hn".

226

Hnh 13.9: Li run-time khi s dng TreeSet cho Contact.

Tng t nh tnh hung so snh bng, TreeSet, hay Collections khng th t bit cch so snh cc i tng thuc cc lp m lp trnh vin t xy dng. Chng trnh nh trong Hnh 13.9 bin dch khng c li do add() khng yu cu tham s kiu Comparable, nhng khi chy th gp li run-time i vi lnh u tin gi n phng thc . Tm li, cc phn t ca cu trc danh b phi thuc lp i tng c cung cp phng tin so snh. Ta c th chn mt trong hai cch sau gii quyt vn : 1. Cc phn t danh sch phi thuc mt lp c ci interface Comparable. Ta sa lp Contact b sung phn in m trong Hnh 13.10, chng trnh trong Hnh 13.9, sau s chy khng c li.

Hnh 13.10: Ci interface Comparable.

2. S dng phng thc chng c ly tham s kiu Comparator. Ta vit thm lp ContactCompare theo interface Comparator v dng n trong chng trnh TestTreeSet nh nhng dng in m trong Hnh 13.11. Theo , ContactCompare l mt loi Comparator c tha ring dnh cho vic so snh cc i tng Contact. Cn danh b l i tng TreeSet c to km vi loi Comparator c bit 227

n bit cch i x vi cc phn t trong danh b (cContact l i s khi gi hm khi to TreeSet).

Hnh 13.11: S dng Comparator.

C hai cch trn u p dng c cho phng thc sort() ca Collection cng nh cc tin ch tng qut tng t trong th vin Java. 13.6. K T I DIN TRONG KHAI BO THAM S KIU Quan h tha k gia hai lp khng c nh hng g n quan h gia cc cu trc tng qut dng cho hai lp . Chng hn, Dog v Cat l cc lp con ca Animal, ta c th a cc i tng Dog v Cat vo mt ArrayList<Animal>, v tnh cht a hnh gia Dog, Cat, v Animal vn hot ng nh bnh thng (xem v d trong Hnh 13.12). Tuy nhin, ArrayList<Dog>, ArrayList<Cat> li khng c quan h g vi ArrayList<Animal>. Vy cho nn, nu dng mt ArrayList<Dog> lm i s cho phng thc yu cu i s kiu ArrayList<Animal>, nh v d trong Hnh 13.13, trnh bin dch s bo li sai kiu d liu.

228

Hnh 13.12: a hnh bn trong mi cu trc tng qut.

Hnh 13.13: Khng c a hnh gia cc cu trc tng qut.

Tm li, nu ta khai bo mt phng thc ly i s kiu ArrayList<Animal>, n s ch c th ly i s kiu ArrayList<Animal> ch khng th ly kiu ArrayList<Dog> hay ArrayList<Cat>. Ta khng hi lng vi lm vi vic tha hip, ngha l dng ArrayList<Animal> thay v ArrayList<Dog> cho danh sch ch c cha ton Dog. V nu vy trnh bin dch s khng kim tra kiu d liu ngn chn nhng tnh hung chng hn nh trong danh sch ch nghip v ca lnh cu ha li c mt con mo. 229

Hnh 13.14: Nguy c cho mo vo danh sch ch.

Vy lm th no lm cho mt phng thc c th nhn i s thuc kiu ArrayList<Dog>, ArrayList<Cat>,ngha l ArrayList dnh cho kiu bt k l lp con ca Animal? Gii php l s dng k t i din (wildcard). Ta sa phng thc makeASymphony() nh sau, v chng trnh trong Hnh 13.13 s chy c v chy ng.

? extends Animal c ngha l kiu g thuc loi Animal. Nh rng t kha extends y c ngha "l lp con ca" hoc "ci t", ty vo vic theo sau t kha extends l tn mt lp hay tn mt interface. Vy nn nu mun makeASymphony() ly i s l mt ArrayList ca loi no ci interface Pet, ta khai bo n nh sau:

Nhng ArrayList<? extends Animal> th khc g vi ArrayList<Animal>? makeASymphony() th an ton v n khng thm/sa danh sch m tham s a chiu ti. Nhng liu c trnh c chuyn cho mo vo danh sch ch mt phng thc khc hay khng? Cu tr li l C. Khi ta dng k t i din <?> ti khai bo, trnh bin dch s khng cho ta thm ci g vo trong danh sch m tham s ca phng thc chiu ti. Ta c th gi phng thc ca cc phn t trong danh sch, nhng ta khng th thm phn t mi vo danh sch. Do , ta c th yn tm khi chng trnh chy. V d, makeASymphony() vi ni dung trn th khng gp li bin dch, nhng takeAnimals() vi ni dung nh trong Hnh 13.14 s khng bin dch c.

230

Hai c php sau l tng ng:


public void foo( ArrayList<? extends Animal> a) public <T extends Animal> void foo( ArrayList<T> a)

Cch th hai, dng "T", thng c s dng khi ta cn mun T xut hin cc v tr khc. V d, cch vit sau qu di:
public void bar( ArrayList<? extends Animal> a1, ArrayList<? extends Animal> a2)

thay vo , ta vit:
public <T extends Animal> void bar(ArrayList<T> a1 , ArrayList<T> a2)

231

Bi tp
1. Cc pht biu di y ng hay sai? nu sai, hy gii thch. a) Mt phng thc generic khng th trng tn vi mt phng thc khng generic. b) C th chng mt phng thc generic bng mt phng thc generic khc trng tn nhng khc danh sch tham s c) Mt tham s kiu c th c khai bo ng mt ln ti phn tham s kiu nhng c th xut hin nhiu ln ti danh sch tham s ca phng thc generic d) Cc tham s kiu ca cc phng thc generic khc nhau phi khng c trng nhau. 2. Trong cc dng khai bo sau y, dng no c li bin dch?

3. Vit mt phng thc generic sumArray vi tham s l mt mng gm cc phn t thuc mt kiu tng qut, phng thc ny tnh tng cc phn t ca mng ri tr v kt qu bng lnh return. Vit mt on code ngn minh ha cch s dng hm sumArray

232

Ph lc A.

Dch chng trnh bng JDK

Ph lc ny hng dn nhng bc c bn nht trong vic bin dch v chy mt chng trnh Java n gin bng cng c JDK ti mi trng Windows. A.1. Son tho m ngun chng trnh

C th chn mt chng trnh son tho vn bn n gin, chng hn nh Notepad. Hoc thun tin, ta c th chn mt chng trnh c tnh nng t ng hin th mu theo c php nhng vn n gin, chng hn nh Notepad++. M ngun chng trnh cn c lu vo file c tn trng tn lp (chnh xc c ch hoa v ch thng) v phn m rng .java. Chng hn lp HelloWorld c lu trong file c tn HelloWorld.java. A.2. Bin dch m ngun thnh file .class

M mt ca s lnh (console) bng cch ln lt chn Start menu, Run..., ri g lnh cmd. Ca s hin ra s c dng nh trong Hnh 13.15.

Hnh 13.15: Ca s lnh

Ti ca s lnh, du nhc cho bit th mc hin ti. dch file m ngun, ta cn thay i th mc hin ti v th mc ni ta lu file . V d, nu th mc m ngun ca ta l C:\java, ta g lnh sau ti du nhc v nhn Enter
cd C:\java

Kt qu l du nhc s chuyn thnh C:\java>. Khi chy lnh dir ti du nhc, ta s thy danh sch cc file m ngun t ti th mc hin ti nh trong Hnh 13.16.

233

Hnh 13.16: Danh sch cc file m ngun.

dch chng trnh HelloWorld, ta g lnh sau ti du nhc:


javac HelloWorld.java

Nu thnh cng, trnh bin dch s sinh ra mt file bytecode c tn HelloWorld.class. Khi dng lnh dir ln na, ta s thy file c lit k trn mn hnh nh hnh di y. Chng trnh c dch xong v sn sng chy.

Hnh 13.17: File . class kt qu ca bin dch.

Nu khng thnh cng, ta c th gp mt trong nhng tnh hung sau y: 1. Li c php: da theo thng bo li c trnh bin dch hin th ra mn hnh, ta cn quay li trnh son tho sa li trc khi chy lnh javac ln na dch li. 2. Thng bo li 'javac' is not recognized as an internal or external command, operable program or batch file. Nguyn nhn l Windows khng tm thy chng trnh javac. Cch gii quyt th nht cho tnh hung th hai l: khi gi javac ta cn g y ng dn ti chng trnh ny, chng hn:
"C:\Program Files\Java\jdk1.6.0_26\bin\javac" HelloWorld.java

234

Ch rng ng dn trn c cha du trng (Program Files) nn ta cn c cp nhy kp bc u cui. Cch gii quyt th hai l sa bin mi trng ca h iu hnh t ng dn ti javac. Hng dn ci t JDK cho mi h iu hnh u c hng dn chi tit cch lm. A.3. Chy chng trnh

Ngay ti th mc cha m ngun, ta g lnh sau ti du nhc (ch khng km ui .class):


java HelloWorld

Kt qu l chng trnh chy nh trong hnh di y:

Hnh 13.18: Kt qu chy chng trnh.

235

Ph lc B.

Package t chc gi ca java

Mi lp trong th vin Java API thuc v mt gi (package) trong cha mt nhm cc lp c lin quan vi nhau. Khi cc ng dng tr nn ngy cng phc tp, vic t chc chng trnh thnh cc gi gip lp trnh vin qun l c cc thnh phn ca ng dng. Cc gi cn h tr vic ti s dng phn mm bng cch cho php chng trnh import lp t cc gi khc (nh ta vn lm hu ht cc chng trnh v d). Mt li ch khc ca t chc gi l c ch t tn lp khng trng nhau. iu ny gip trnh xung t tn lp. Ph lc ny gii thiu cch to gi ca chnh mnh. Cc bc khai bo mt lp ti s dng c: 1. Khai bo public cho lp . Nu khng, n s ch c s dng bi cc lp trong cng mt gi. 2. Chn mt tn gi v t khai bo gi vo u file m ngun ca lp. Trong mi file m ngun ch c ti a mt khai bo gi v n phi c t trc tt c cc lnh khc. 3. Dch lp sao cho n c t vo ng ch trong cu trc th mc ca gi Sau ba bc trn, lp sn sng cho vic import v s dng trong mt chng trnh. Sau y l chi tit v cch bin dch cc lp trong mt gi. Ng cnh: Hng dn ny vit cho mi trng Windows v dng mt trnh bin dch tng ng vi javac, c th d dng chuyn i sang ni dung tng ng cho mi trng Unix/Linux. Gi s ta c hai gi, com.mycompanypackage cha cc lp CompanyApp v BusinessLogic; v org.mypersonalpackages.util cha cc lp Semaphore v HandyBits. BusinessLogic cn truy nhp ti HandyBits Vit m v bin dch Vic u tin: t chc m ngun. Ta cn chn mt th mc "gc" cho cy th mc cha m ngun ca mnh. (T y ta s gi n n gin l gc.) Ta s dng c:\java cho cc v d y. Ta cn c 4 file m ngun sau: c:\java\com\mycompanypackage\CompanyApp.java c:\java\com\mycompanypackage\BusinessLogic.java c:\java\org\mypersonalpacakges\util\Semaphore.java 236

c:\java\org\mypersonalpacakges\util\HandyUtil.java Lu rng cc file m ngun c t chc ging nh cu trc gi. iu ny rt quan trng, n gip trnh bin dch tm thy cc file ngun - n cng gip ta trong hon cnh y ht. Ti u mi file ngun (trc tt c cc lnh import hay bt c g khng phi ch thch), ta cn c mt dng khai bo gi. V d, CompanyApp.java s bt u bng:
package com.mycompanypackage;

Nu lp ca ta cn import g t cc gi khc, cc dng import c th t sau . V d, BusinessLogic.java c th bt u bng:


package com.mycompanypackage; import org.mypersonalpackages.util.*;

hoc
package com.mycompanypackage; import org.mypersonalpackages.util.HandyUtil;

Mt s ngi thch dng import-on-demand (cch u), ngi khc th khng. Tht ra y ch yu ch l vn li bing. Ta hiu rng cch ny c th gy ra cc s bt tng thch nu sau ny cc class b trng tn, nhng bn trong cc gi chun ca Java m ta s dng, chuyn him khi xy ra. (Mt phn l v ta khng dng GUI my. Nu dng cc gi java.awt v java.util trong cng mt class, ta s phi thn trng hn.) n lc bin dch cc class. Ta thng bin dch tt c cc file, chc chn l mnh lun dng phin bn mi nht ca tt c cc class. Trong Java c mt s s ph thuc khng d thy, chng hn nh cc hng i tng thuc mt class c nhng trong mt class khc (chng hn nu HandyUtil tham chiu ti Semaphore.SOME_CONSTANT - mt hng String loi static final, gi tr ca n s c nhng vo trong HandyUtil.class.) C hai cch bin dch tt c. Hoc l dng lnh mt cch tng minh:
c:\java> javac -d . com\mycompanypackage\*.java org\mypersonalpackage\util\*.java

hoc to mt danh sch cc file v chuyn n cho javac:


c:\java> dir /s /b *.java > srcfiles.txt c:\java> javac -d . @srcfiles.txt

Lu rng ta bin dch n t th mc gc, v ta dng ty chn -d . bo trnh bin dch xp cc file .class vo mt cu trc gi xut pht t gc (du chm theo sau c ngha rng th mc gc l th mc hin ti). Mt s ngi khng thch cc file .class v cc file ngun cng mt ch - trong trng hp , ta c th dng ty chn -d classes, nhng ta phi to th mc classes t trc. (Ta cng s cn hoc l ln no cng dch tt c hoc t classes vo phn classpath cho trnh bin dch bng ty chn -classpath.) Nu cha thc s thnh tho, ta nn lm theo cch u v kim tra 237

chc chn l ta khng t classpath . Nu v l do no m ta nht nh phi dng mt classpath, hy m bo l . (th mc hin hnh) nm trong classpath.

Chy ng dng Nhiu ngi "tnh c" t c cc file .class ca mnh vo ng ch, do may mn chng hn, nhng ri li gp phi nhng li nh: java.lang.NoClassDefFoundError: MyCompanyApp (wrong name: com/mycompanypackage/MyCompanyApp. Tnh hung xy ra nu ta c chy chng trnh bng mt lnh kiu nh:
c:\java\com\mycompanypackage> java MyCompanyApp

y l cch trnh: Hy ng yn th mc "gc" ca mnh, v d c:\java Lun lun dng tn y ca class. V d:


c:\java> java com.mycompanypackage.MyCompanyApp

My o Java bit cch tm file .class trong th mc com\mycompanypackage (lu , y l mt quy c ca my o, hu ht cc my o dng cch ny - khng c ch no trong c t ngn ng ni rng gi phi c lu tr theo kiu ; my o Java n gin l phi bit cch tm v np mt class), nhng trong file .class c ghi tn y ca n - v my o dng thng tin kim tra xem ci class m n c yu cu np c phi ci m n tm thy hay khng.

238

Ph lc C.

Bng thut ng anh vit

Ting Anh abstract class abstract method abstraction aggregation argument association attribute behavior chain stream class class variable / class attribute class method composition concrete class connection stream constructor copy constructor encapsulation exception information hiding inheritance instance instance variable message

Ting Vit lp tru tng phng thc tru tng tru tng ha quan h t hp i s quan h kt hp thuc tnh hnh vi dng ni tip lp, lp i tng

Cc cch dch khc

quan h kt tp tham s thc s

bin lp, bin ca lp, bin static thuc tnh ca lp phng thc ca lp quan h hp thnh lp c th dng kt ni hm khi to hm khi to sao chp ng gi ngoi l che giu thng tin tha k thc th th hin hm to, cu t hm to sao chp, cu t sao chp phng thc static

bin thc th, bin ca trng, thnh vin thc th d liu thng ip 239

method / member function object object serialization overload override package parameter pass-by-value polymorphism reference state stream subclass / derived class superclass / base class top-down programming variable virtual machine

phng thc, hm

hm thnh vin

i tng chui ha i tng ci chng ci gi tham s truyn bng gi tr a hnh tham chiu trng thi dng lp con, lp dn xut tham s hnh thc hm trng tn ghi , nh ngha li

lp cha, lp c s

lp trnh t trn xung bin my o

240

Ti liu tham kho

[1]. [2].

Deitel & Deitel, Java How to Program, 9th edition, Prentice Hall, 2012. Kathy Sierra, Bert Bates, Head First Java, 2nd edition, O'Reilly, 2008.

[3]. Oracle, JavaTM Platform Standard Ed.6, URL: http://docs.oracle.com/javase/6/docs/api/ [4]. Oracle, JavaTM Platform Standard Ed.7, URL: http://docs.oracle.com/javase/7/docs/api/ [5]. Oracle, The JavaTM Tutorials, URL: http://docs.oracle.com/javase/tutorial/

[6]. Ralph Morelli, Ralph Walde, Java, Java, Java Object-Oriented Problem Solving, th 3 edition, Prentice Hall, 2005. [7]. Joshua Bloch, Effective Java, 2nd edition, Addison-Wesley, 2008.

241

You might also like