You are on page 1of 261

HC VIN CNG NGH BU CHNH VIN THNG C S TI TP.

H CH MINH

Bi ging:

LP TRNH HNG I TNG


Ti liu dng cho h i hc ngnh Cng Ngh Thng Tin c Hi ng khoa hc khoa Thng qua ngy 18/09/2010

Bin son :Ths. Bi Cng Giao

LU HNH NI B Tp. H Ch Minh Nm 2010

Li ni u
Lp trnh l mt k nng rt cn thit cho sinh vin ngnh Cng ngh thng tin. Sau khi hc qua lp trnh cn bn vi ngn ng C, sinh vin s c tip cn vi mt phng php lp trnh theo t duy mi, gn vi th gii thc hn, ph hp vi cc d n phn mm ln, l lp trnh hng i tng. Ni dung mn hc ny bao gm nhng khi nim, m hnh v i tng v phng php lp trnh hng i tng bng ngn ng lp trnh Java. Cc c trng quan trng ca lp trnh hng i tng nh ng gi, k tha, a hnhv cc quan h lp; x l vo/ra, x l ngoi l, lp trnh lung x l v giao din s c th hin trong Java. Bi ging ny c bin son ch yu da vo hai quyn sch : Beginning Java Objects: From Concepts to Code, Second Edition, Apress, 2005 ca Jacquie Barker v Bi ging Lp trnh Hng i tng, Hc vin Cng ngh Bu chnh Vin thng ca Trn nh Qu v Nguyn Mnh Hng, Ngi son chn thnh cm n cc tc gi trn.

Mc lc
Chng 1. Tng quan v lp trnh hng i tng ................... 1

1.1 Phng php tip cn ca lp trnh truyn thng ......................... 1


1.1.1 Lp trnh tuyn tnh............................................................................. 1 1.1.2 Lp trnh cu trc ................................................................................ 1

1.2 Phng php tip cn lp trnh hng i tng .......................... 3 1.3 Cc c trng ca lp trnh hng i tng ................................ 3
1.3.1 Tnh ng gi d liu.................................................................................. 3 1.3.2 Tnh k tha ................................................................................................ 4 1.3.3 Tnh a hnh ................................................................................................ 4

1.4 Tru tng ha ................................................................................. 4


1.4.1 T chc tru tng theo s phn cp lp ......................................... 4 1.4.2 Tru tng ha c s ca pht trin phn mm ........................... 5

1.5 Xu hng pht trin ca lp trnh hng i tng ..................... 6


1.5.1 Lp trnh hng thnh phn (Component-oriented programmingCOP) ................................................................................................................ 6 1.5.2 Lp trnh hng tc nhn ................................................................... 7 1.5.3 Lp trnh hng kha cnh ................................................................. 7

Chng 2.

C bn ngn ng lp trnh Java ................................. 9

2.1 c trng ca ngn ng Java .......................................................... 9 2.2 Kin trc chng trnh v c ch thc thi ca Java .................... 14 2.3 Cc kiu d liu c bn v bin ..................................................... 18
2.3.1 Kiu d liu c bn ............................................................................ 18 2.3.2 Bin ...................................................................................................... 19
2.3.2.1 Khai bo bin .........................................................................................19 2.3.2.2 Phm vi hot ng ca bin ..................................................................20 2.3.2.3 Khi to bin ..........................................................................................20 2.3.2.4 p kiu ....................................................................................................20

2.4 Cc ton t v biu thc................................................................. 21


2.4.1 Cc ton t .......................................................................................... 21

2.4.2 Biu thc ............................................................................................. 25

2.5 Cc cu trc lnh ............................................................................ 26


2.5.1 Lnh if-else .......................................................................................... 26 2.5.2 Lnh switch-case ................................................................................ 27 2.5.3 Vng lp while .................................................................................... 28 2.5.4 Vng lp do-while............................................................................... 29 2.5.5 Vng lp for ........................................................................................ 29

2.6 Phong cch lp trnh ....................................................................... 31 2.7 Case Study ....................................................................................... 33

Chng 3.

i tng v lp ......................................................... 38

3.1 Phn r phn mm theo cch tip cn hng i tng ............. 38 3.2 Khi nim i tng ....................................................................... 39 3.3 Khi nim lp .................................................................................. 42 3.4 Khi nim ng gi ......................................................................... 43 3.5 Bin tham chiu ............................................................................... 44 3.6 Khi to i tng .......................................................................... 45

Chng 4.

Tng tc gia cc i tng.................................... 50

4.1 Cng tc gia cc i tng ........................................................... 50 4.2 Thuc tnh........................................................................................ 51 4.3 Phng thc .................................................................................... 52
4.3.1 Khai bo phng thc ....................................................................... 52 4.3.2 Bin this ............................................................................................... 53 4.3.3 Gi phng thc ................................................................................ 53 4.3.4 Np chng phng thc .................................................................... 54 4.3.5 Phng thc xy dng....................................................................... 54 4.3.6 Che du thng tin ............................................................................... 56

4.4 Truyn thng ip gia cc i tng .......................................... 57

Chng 5.

Quan h gia cc i tng....................................... 61

5.1 Kt hp v lin kt .......................................................................... 61 5.2 K tha ............................................................................................ 63 5.3 a hnh ............................................................................................. 64

5.4 Lp tru tng ............................................................................... 70 5.5 Giao tip ........................................................................................... 73 5.6 Tnh cht tnh .................................................................................. 76 5.7 Kiu lit k ....................................................................................... 78 5.8 Case Study ....................................................................................... 83

Chng 6.

Tp i tng ............................................................. 95

6.1 Khi nim tp i tng................................................................. 95 6.2 Ba kiu tp i tng c bn ......................................................... 95 6.3 Mng ................................................................................................ 97 6.4 Cc loi tp i tng thng gp .............................................. 100
6.4.1 LinkedList ......................................................................................... 100 6.4.2 HashMap ........................................................................................... 102 6.4.3 TreeMap ............................................................................................ 104 6.4.4 HashSet.............................................................................................. 106 6.4.5 TreeSet .............................................................................................. 107

6.5 To kiu tp hp ........................................................................... 108 6.6 Phng thc tr v kiu tp hp ................................................. 110

Chng 7.

X l ngoi l ............................................................ 113

7.1 Gii thiu ngoi l ......................................................................... 113 7.2 C ch x l ngoi l ..................................................................... 115
7.2.1 Khi try ............................................................................................. 115 7.2.2 Khi catch ......................................................................................... 115 7.2.3 Khi finally ....................................................................................... 119

7.3 Bt cc ngoi l .............................................................................. 121 7.4 Phn cp lp ngoi l .................................................................... 126 7.5 Cc im cn lu thm v ngoi l ........................................... 129
7.5.1 Bt ngoi l tng qut ...................................................................... 129 7.5.2 Trnh bin dch Java yu cu phi c x l ngoi l..................... 129 7.5.3 Tn dng x l ngoi l lm r li pht sinh ............................ 131 7.5.4 try/catch lng nhau .......................................................................... 131 7.5.5 Kiu ngoi l do ngi dng nh ngha ........................................ 132

7.5.6 Nm nhiu kiu ngoi l .................................................................. 134

7.6 Case Study ..................................................................................... 134

Chng 8.

X l vo/ra .............................................................. 137

8.1 Lung vo/ra ................................................................................. 137


8.1.1 Gii thiu lung vo/ra .................................................................... 137 8.1.2 Lung byte ........................................................................................ 138 8.1.3 Lung k t ....................................................................................... 140 8.1.4 Lung b m ................................................................................... 141

8.2 Scanning v Formatting ............................................................... 143


8.2.1 Scanning ............................................................................................ 143 8.2.2 Formatting ........................................................................................ 146

8.3 Vo ra t ch dng lnh .......................................................... 148


8.3.1 Vo ra qua lung chun .................................................................. 148 8.3.2 Vo ra qua Console .......................................................................... 154

8.4 Lm vic vi CSDL ....................................................................... 157


8.4.1 JDBC ................................................................................................. 157
8.4.1.1 Gii thiu JDBC ..................................................................................157 8.4.1.2 Kin trc JDBC ...................................................................................157

8.4.2 MySQL v Java ................................................................................ 158


8.4.2.1 Ci t Connector/J - JDBC Driver ca MySQL ............................158 8.4.2.2 Kim tra Connector/J..........................................................................159 8.4.2.3 Thc hin cc cu truy vn.................................................................160

Chng 9.

Lp trnh giao din................................................... 166

9.1 Giao din vi cc i tng c bn ............................................. 166


9.1.1 Cc i tng container c bn ...................................................... 166
9.1.1.1 Frame ....................................................................................................166 9.1.1.2 Panel ......................................................................................................167 9.1.1.3 Dialog ....................................................................................................168

9.1.2 Cc i tng component c bn ................................................... 169


9.1.2.1 Label .....................................................................................................169 9.1.2.2 TextField v TextArea ........................................................................170 9.1.2.3 Button ...................................................................................................172

9.1.3 X l s kin ..................................................................................... 173

9.2 Giao din vi cc i tng Multimedia ..................................... 180


9.2.1 nh du v nt chn .................................................................. 180 9.2.2 La chn ........................................................................................... 182 9.2.3 Danh sch .......................................................................................... 184

9.3 Cc k thut trnh by.................................................................. 186


9.3.1 Trnh by Flow Layout .................................................................... 186 9.3.2 Trnh by Grid Layout .................................................................... 187 9.3.3 Trnh by Border Layout ................................................................ 189 9.3.4 Trnh by GridBag Layout ............................................................. 190 9.3.5 Trnh by Null Layout ..................................................................... 192

9.4 Applet ............................................................................................. 193


9.4.1 Cu trc ca mt Applet ................................................................. 194 9.4.2 S dng Applet ................................................................................. 195 9.4.3 Truyn tham s cho Applet ............................................................. 199

9.5 SWING........................................................................................... 200


9.5.1 M rng cc i tng component................................................. 201 9.5.2 M rng cc i tng container ................................................... 203

9.6 Case Study ..................................................................................... 210

Chng 10. Lung x l .............................................................. 219


10.1 Gii thiu lung ........................................................................... 219 10.2 To v qun l lung .................................................................. 220
10.2.1 To lung ........................................................................................ 220 10.2.2 Phng thc ca lp lung ........................................................... 223 10.2.3 Quyn u tin ca lung................................................................ 225 10.2.4 Lung ngm .................................................................................... 226 10.2.5 a lung vi Applet ....................................................................... 227

10.3 Nhm lung ................................................................................. 229


10.3.1 Gii thiu nhm lung ................................................................... 229 10.3.2 S ng b lung ............................................................................ 234 10.3.3 M ng b ..................................................................................... 234 10.3.4 S dng khi ng b .................................................................... 236

10.3.5 K thut i thng bo ............................................................... 238 10.3.6 S b tt .......................................................................................... 241

10.4 Thu rc ......................................................................................... 243

Tham kho ...................................................................................... 248

Danh sch hnh


Hnh 1.1 S phn cp tru tng ca cc i tng t nhin. .................................. 5 Hnh 2.1 Cch bin dch truyn thng .......................................................................... 10 Hnh 2.2 Dch chng trnh Java.................................................................................. 11 Hnh 2.3 My o Java thc hin m bytecode c lp mi trng hot ng ............. 12 Hnh 2.4 Cng m bytecode c th c hiu bi hai my o..................................... 13 Hnh 2.5 Phn tch mt chng trnh Java n gin .................................................... 14 Hnh 3.1 Phn r ng dng t trn xung. ................................................................... 38 Hnh 3.2 Gn ng dng t di ln. ............................................................................. 39 Hnh 3.3 S dng mt bin tham chiu ch ti i tng trong b nh. ................. 45 Hnh 3.4 Hai i tng cng tham chiu ti cng mt i tng. .............................. 46 Hnh 3.5 Chuyn y tham chiu ti Student th hai. ..................................................... 46 Hnh 3.6 Chuyn x tham chiu ti Student th hai. ..................................................... 47 Hnh 3.7 i tng Student m ci. ............................................................................. 47 Hnh 4.1 Cc i tng trong h thng phi cng tc vi nhau hon tt s mnh SRS ............................................................................................................................... 51 Hnh 4.2 Thng ip c truyn qua li gia cc i tng Course v Student ....... 58 Hnh 4.3 Ngi yu cu ch thy chi tit bn ngoi ca vic trao i thng ip. ...... 58 Hnh 5.1 Kt hp ba ngi ............................................................................................. 62 Hnh 5.2 Mt th hin tng ng bng ba kt hp hai ngi .................................... 62 Hnh 6.1 Hu ht tp hp t ng co li khi mt phn t b ly ra .............................. 96 Hnh 6.2 Dng kho truy cp trc tip i tng trong tp hp t in ................. 96 Hnh 6.3 Cc tp hp khng phi l b cho php nhiu tham chiu ti cng mt i tng. ............................................................................................................................ 97 Hnh 7.1 Khi my o Java nm mt ngoi l, nh pht ra mt pho thng bo cho ng dng mt vn pht sinh................................................................................... 114 Hnh 7.2 Nu khng c ngoi l c nm ra trong khi try, tt c cc khi catch c b qua. ........................................................................................................................ 117 Hnh 7.3 Nu mt ngoi l pht sinh, khi catch u tin chn bt, nu c, c thc thi, v phn cn li c b qua. ................................................................................ 118 Hnh 7.4 My o Java theo di vic th t cc phng thc c gi bng cch to chng gi (call stack).................................................................................................. 123 Hnh 7.5 Khi mt phng thc chm dt, n b ly ra khi chng. .......................... 123

Hnh 7.6 Khi lnh try/catch trong trong phng thc methodY nhn bit ngoi l trong mc hin hnh ca chng gi. .......................................................................... 123 Hnh 7.7 Ngoi l thot khi p.methodY() v chuyn xung s.methodX() x l ...... 124 Hnh 7.8 NullPointerException thng qua chng gi c chuyn ti phng thc main. ........................................................................................................................... 125 Hnh 7.9 Nu ng dng b qua x l ngoi l, my o Java chm dt ng dng v bo co ngoi l ti ca ca s dng lnh cho ngi s dng quan st. ..................... 126 Hnh 7.10 Lp java.lang.Exception c nhiu lp con ................................................ 127 Hnh 7.11 Cy tha k ca kiu ngoi l java.sql.DataTruncation ............................ 127 Hnh 7.12 Kt qu demo ca NumberOfDigits.java .................................................. 135 Hnh 8.1 c d liu vo chng trnh. ..................................................................... 137 Hnh 8.2 Vit d liu t chng trnh. ....................................................................... 138 Hnh 8.3 Lung byte vo ra n gin ......................................................................... 139 Hnh 8.4 Cc thnh phn c t qui cch. .................................................................. 148 Hnh 9.1 Kt qu demo Frame ................................................................................... 167 Hnh 9.2 Kt qu demo Panel ..................................................................................... 168 Hnh 9.3 Kt qu demo Dialog ................................................................................... 169 Hnh 9.4 Kt qu demo Label..................................................................................... 170 Hnh 9.5 Kt qu demo Text ...................................................................................... 172 Hnh 9.6 Kt qu demo Button ................................................................................... 173 Hnh 9.7 Kt qu demo s kin .................................................................................. 179 Hnh 9.8 Kt qu demo Radio Button ........................................................................ 182 Hnh 9.9 Kt qu demo Choice Button ...................................................................... 184 Hnh 9.10 Kt qu demo Listbox ............................................................................... 186 Hnh 9.11 Kt qu demo Flow layout ........................................................................ 187 Hnh 9.12 Kt qu demo Grid layout ......................................................................... 188 Hnh 9.13 Kt qu demo Border layout..................................................................... 190 Hnh 9.14 Kt qu demo Gridbag layout.................................................................... 192 Hnh 9.15 Kt qu demo Null layout.......................................................................... 193 Hnh 9.16 Kt qu demo Applet ................................................................................. 195 Hnh 9.17 Kt qu demo Applet bng tnh ................................................................. 198 Hnh 9.18 Kt qu demo Applet c tham s .............................................................. 200 Hnh 9.19 Kt qu demo JButton ............................................................................... 202 Hnh 9.20 Kt qu demo gn cc i tng vo cc tng .......................................... 205 Hnh 9.21 Kt qu demo JMenu ................................................................................. 210

Hnh 9.22 Kt qu demo Case Study.......................................................................... 217 Hnh 10.1 Vng i ca lung ................................................................................... 220 Hnh 10.2 a lung vi Applet .................................................................................. 228

Danh sch bng


Bng 2.1 Cc ton t s hc ......................................................................................... 22 Bng 2.2 Cc ton t bit ............................................................................................... 23 Bng 2.3 Cc ton t quan h. ...................................................................................... 24 Bng 2.4 Cc ton t logic ........................................................................................... 24 Bng 2.5 Th t u tin cc ton t ............................................................................. 25 Bng 4.1 Phm vi truy cp ca cc thnh vin ca lp ................................................ 52 Bng 7.1 Danh sch mt s ngoi l .......................................................................... 128 Bng 10.1 Cc phng thc ca mt lp lung ......................................................... 224

Thut ng vit tt
API CSDL CTDL GUI JDBC JFC JVM LIFO ODBC RDBMS SRS Application Programming Interface C s d liu Cu trc d liu Graphic User Interface Java DataBase Connectivity Java Foundation Class Java Virtual Machine Last in, First out Open Database Connectivity Relational Database Management Systems Student Registration System

Chng 1: Tng quan v lp trnh hng i tng

Chng 1.

Tng quan v lp trnh hng i tng

Ni dung chng ny nhm gii thiu mt cch tng quan v cch tip cn hng i tng. Ni dung trnh by bao gm: Gii thiu v cch tip cn ca lp trnh truyn thng. Gii thiu cch tip cn ca lp trnh hng i tng. S tru tng ha l c s ca pht trin phn mm hng i tng. Nu cc c trng ca lp trnh hng i tng. Xu hng hin nay ca lp trnh hng i tng.

1.1 Phng php tip cn ca lp trnh truyn thng


Lp trnh truyn thng tri qua hai giai on: Giai on s khai, khi khi nim lp trnh mi ra i, l lp trnh tuyn tnh. Giai on tip theo, l lp trnh hng cu trc.

1.1.1 Lp trnh tuyn tnh


c trng c bn ca lp trnh tuyn tnh l t duy theo li tun t. Chng trnh s c thc hin tun t t u n cui, lnh ny k tip lnh kia cho n khi kt thc chng trnh. c trng Lp trnh tuyn tnh c hai c trng: n gin: chng trnh c tin hnh n gin theo li tun t, khng phc tp. n lung: ch c mt lung (thread) cng vic duy nht, v cc cng vic c thc hin tun t trong lung . Tnh cht u im: Do tnh n gin, lp trnh tuyn tnh c u im l chng trnh n gin, d hiu. Lp trnh tuyn tnh c ng dng cho cc chng trnh n gin. Nhc im: Vi cc ng dng phc tp, ngi ta khng th dng lp trnh tuyn tnh gii quyt. Ngy nay, lp trnh tuyn tnh ch tn ti trong phm vi cc m un nh nht ca cc phng php lp trnh khc. V d trong mt chng trnh con ca lp trnh cu trc, cc lnh cng c thc hin theo tun t t u n cui chng trnh con. 1.1.2 Lp trnh cu trc Trong lp trnh hng cu trc, chng trnh chnh c chia nh thnh cc chng trnh con v mi chng trnh con thc hin mt cng vic xc nh. Chng trnh

Bin son : Bi Cng Giao --------------------------------------- 1 --------------------------------------

Chng 1: Tng quan v lp trnh hng i tng

chnh s gi n chng trnh con theo mt gii thut, hoc mt cu trc c xc nh trong chng trnh chnh. Cc ngn ng lp trnh cu trc ph bin l Pascal, C v C++. Ring C++ ngoi vic c c trng ca lp trnh cu trc do k tha t C, cn c c trng ca lp trnh hng i tng. Cho nn C++ cn c gi l ngn ng lp trnh na cu trc, na hng i tng. c trng c trng c bn nht ca lp trnh cu trc th hin mi quan h: Chng trnh = CTDL + Gii thut Trong : CTDL l cch t chc d liu, cch m t bi ton di dng ngn ng lp trnh Gii thut l mt quy trnh thc hin mt cng vic xc nh Mt CTDL ch ph hp vi mt s hn ch cc gii thut. Nu thay i CTDL th phi thay i gii thut cho ph hp. Mt gii thut thng phi i km vi mt CTDL nht nh. Trong chng trnh, gii thut c quan h ph thuc vo CTDL:

Tnh cht Mi chng trnh con c th c gi thc hin nhiu ln trong mt chng trnh chnh. Cc chng trnh con c th c gi n thc hin theo mt th t bt k, tu thuc vo gii thut trong chng trnh chnh m khng ph thuc vo th t khai bo ca cc chng trnh con. Cc ngn ng lp trnh cu trc cung cp mt s cu trc lnh iu khin chng trnh. u im Chng trnh sng sa, d hiu, d theo di. T duy gii thut r rng.

Nhc im Lp trnh cu trc khng h tr vic s dng li m ngun: Gii thut lun ph thuc cht ch vo CTDL, do , khi thay i CTDL, phi thay i gii thut, ngha l phi vit li chng trnh. Khng ph hp vi cc phn mm ln: t duy cu trc vi cc gii thut ch ph hp vi cc bi ton nh, nm trong phm vi mt m un ca chng trnh. Vi d n phn mm ln, lp trnh cu trc t ra khng hiu qu trong vic gii quyt mi quan h v m gia cc m un ca phn mm.

Bin son : Bi Cng Giao --------------------------------------- 2 --------------------------------------

Chng 1: Tng quan v lp trnh hng i tng

Vn Vn c bn ca lp trnh cu trc l bng cch no phn chia chng trnh chnh thnh cc chng trnh con cho ph hp vi yu cu, chc nng v mc ch ca mi bi ton.

1.2 Phng php tip cn lp trnh hng i tng


Xut pht t hai hn ch chnh ca phng php lp trnh cu trc: Khng qun l c s thay i d liu khi c nhiu chng trnh cng thay i mt bin chung. Vn ny c bit nghim trng khi cc ng dng ngy cng ln, ngi ta khng th kim sot c s truy nhp n cc bin d liu chung. Khng tit kim c ti nguyn con ngi: Gii thut gn lin vi CTDL, nu thay i CTDL, s phi thay i gii thut, v do , phi vit li m chng trnh t u. khc phc c hai hn ch ny khi gii quyt cc bi ton ln, ngi ta xy dng mt phng php tip cn mi, l phng php lp trnh hng i tng, vi hai mc ch chnh: ng gi d liu hn ch s truy nhp t do vo d liu, khng qun l c. Cho php s dng li m ngun, hn ch vic phi vit li m t u cho cc chng trnh. Ngn ng lp trnh hng i tng ph bin hin nay l Java v C++. Tuy nhin, C++ mc d cng c nhng c trng c bn ca lp trnh hng i tng nhng vn khng phi l ngn ng lp trnh thun hng i tng. Java tht s l mt ngn ng lp trnh thun hng i tng.

1.3 Cc c trng ca lp trnh hng i tng


1.3.1 Tnh ng gi d liu
D liu lun c t chc thnh cc thuc tnh ca lp i tng. Vic truy nhp n d liu phi thng qua cc phng thc ca i tng lp. Trong mt i tng, d liu hay thao tc hay c hai c th l ring (private) hoc chung (public) ca i tng . Thao tc hay d liu ring l thuc v i tng ch c truy cp bi cc thnh phn ca i tng, iu ny ngha l thao tc hay d liu ring khng th truy cp bi cc phn khc ca chng trnh tn ti ngoi i tng. Khi thao tc hay d liu l chung, cc phn khc ca chng trnh c th truy cp n mc d n c nh ngha trong mt i tng. Cc thnh phn chung ca mt i tng dng cung cp mt giao din c iu khin cho cc thnh thnh ring ca i tng. C ch ng gi (encapsulation) l phng thc tt thc hin c ch che du thng tin so vi cc ngn ng lp trnh cu trc.

Bin son : Bi Cng Giao --------------------------------------- 3 --------------------------------------

Chng 1: Tng quan v lp trnh hng i tng

1.3.2 Tnh k tha


Cho php s dng li m ngun. Cc lp i tng c th k tha (inheritance) t cc lp i tng khc. Khi , trong cc lp k tha, c th s dng cc phng thc hot ng ca cc lp b k tha, m khng cn phi nh ngha li. Vic cho php s dng li m ngun c thc hin thng qua c ch k tha trong lp trnh hng i tng. Theo : Cc lp c th c k tha nhau tn dng cc thuc tnh, cc phng thc ca nhau. Trong lp dn xut (lp k tha) c th s dng li cc phng thc ca lp c s (lp b lp khc k tha) m khng cn thit phi ci t li m ngun. Ngay c khi lp dn xut nh ngha li cc phng thc cho mnh, lp c s cng khng b nh hng v khng phi sa li bt k mt on m ngun no.

1.3.3 Tnh a hnh


Kh nng cho mt thng ip c th thay i cch thc hin ca n theo lp c th ca i tng nhn thng ip. Khi mt lp dn xut c to ra, n c th thay i cch thc hin cc phng thc no m n tha hng t lp c s ca n. Mt thng ip khi c gi n mt i tng ca lp c s, s dng phng thc nh ngha cho n trong lp c s. Nu mt lp dn xut nh ngha li mt phng thc tha hng t lp c s ca n th mt thng ip c cng tn vi phng thc ny, khi c gi ti mt i tng ca lp dn xut s gi phng thc nh ngha cho lp dn xut. Nh vy a hnh (polymorphism) l kh nng cho php gi cng mt thng ip n nhng i tng khc nhau c cng chung mt c im, ni cch khc thng ip c gi i khng cn bit thc th nhn thuc lp no, ch bit rng tp hp cc thc th nhn c chung mt tnh cht no . Chng hn, thng ip v hnh c gi n c hai i tng hnh hp v hnh trn. Trong hai i tng ny u c chung phng thc v hnh, tuy nhin tu theo thi im m i tng nhn thng ip, hnh tng ng s c v ln.

1.4 Tru tng ha


1.4.1 T chc tru tng theo s phn cp lp
Thm ch mc d no con ngi gii s tru tng cc khi nim nh bn ng i v cnh quan, vn cn s lng rt ln cc cng vic tru tng ho ring l m chng ta thng gp trong cuc sng. i ph s phc tp ny con ngi phi sp xp thng tin mt cch c h thng theo cc tiu chun no ; X l ny gi l s phn lp (classification). V d nh khoa hc phn cp theo lp tt c i tng t nhin thuc v ng vt, hoc cy, hoc khong sn. c phn l ng vt, n phi tho iu kin sau:

Bin son : Bi Cng Giao --------------------------------------- 4 --------------------------------------

Chng 1: Tng quan v lp trnh hng i tng

Vt th sng. T di chuyn. Phn ng khi b kch thch. Vt th sng (nh ng vt). Khng c h thn kinh. C mn cellulose.

Qui lut cho mt i tng l cy th hi khc:

Sau khi phn lp n gin nh trn ta c th thm vi qui lut c cc loi ng vt c th hn cho n khi c mt s phn cp theo s tru tng t cao (nh) xung thp (y). S phn cp tru tng ca cc i tng t nhin c th hin nh hnh 1.1. Cc i tng t nhin

Cy

ng vt

Khong sn

ng vt c v

Chim

B st

Lng c

Cn trng

Ch

Kh

Hnh 1.1 S phn cp tru tng ca cc i tng t nhin.

1.4.2 Tru tng ha c s ca pht trin phn mm


Khi ghi nhn cc yu cu cho mt d n phn mm, chng ta thng bt u bng cch thu thp thng tin chi tit v tnh hnh thc t m trn h thng s hot ng. Nhng chi tit ny thng l mt s tng hp ca Thng tin t nhng ngi s dng h thng c chng ta phng vn. Nhng hot ng m chng ta quan st t nghip v hng ngy ca ngi s dng h thng. K n chng ta phi chn lc ra nhng chi tit no lin quan ti mc ch s dng h thng. Vic ny l cn thit v chng ta khng th t ng ho tt c h thng nghip v bng phn mm! Vic bao gm qu nhiu chi tit s lm h thng phc tp v kh

Bin son : Bi Cng Giao --------------------------------------- 5 --------------------------------------

Chng 1: Tng quan v lp trnh hng i tng

khn hn trong vic thit k, kim tra chng trnh, d li, to su liu, bo tr v m rng chng trnh sau ny. S tru tng ho s gip ngi phn tch h thng c c cc nt c trng ca h thng trong min (domain) bi ton, tp trung vo vn ca h thng d nh pht trin. Nh khi th hin mt ngi trong chng trnh, mu mt ca h c quan trng khng? V gien ? Lng ? S thch ? Cu tr li l bt k c tnh no ca ngi c th lin quan hay khng lin quan tu thuc vo h thng m ta nh pht trin l Chng trnh tnh lng Chng trnh tip th theo tui tc CSDL bnh nhn nhn khoa H thng theo di nhng k b truy n

Mt khi xc nh cc c trng quan trng ca mt tnh hung, ta cn chun b mt m hnh ho cho n. M hnh ho l x l nhm pht trin mt khun mu to ra mt th g ; v d nh bn thit k ngi nh, s mch in, mt khun bnh. Mt m hnh i tng ca h thng phn mm l mt mu nh vy. M hnh ho v tru tng ho lun i vi nhau v mt m hnh l s m t ho hay vt l ca tru tng; Trc khi m hnh vt g mt cch c hiu qu, ta phi xc nh cc chi tit cn thit ca ch th cn c m hnh.

1.5 Xu hng pht trin ca lp trnh hng i tng


1.5.1 Lp trnh hng thnh phn (Component-oriented programming-COP)
Xut pht t lp trnh hng i tng, t duy lp trnh hng thnh phn theo tng: Gii quyt bi ton bng cch xy dng mt tp cc thnh phn (component) c tnh c lp tng i vi nhau. Mi thnh phn m nhim mt phn cng vic nht nh. Sau , ngi ta ghp cc thnh phn vi nhau thu c mt phn mm tho mn mt tp cc yu cu xc nh. Vi lp trnh hng thnh phn, ngi ta c th tin hnh lp trnh theo phng php sau: Xy dng mt th vin cc thnh phn, mi thnh phn thc hin mt cng vic xc nh. Khi cn pht trin mt phn mm c th, ngi ta ch cn chn nhng thnh phn c sn trong th vin ghp li vi nhau. Ngi lp trnh ch phi pht trin thm cc thnh phn mnh cn m cha c trong th vin.

Bin son : Bi Cng Giao --------------------------------------- 6 --------------------------------------

Chng 1: Tng quan v lp trnh hng i tng

Phng php ny c nhng u im rt ln: Lp trnh vin c th chia s vi nhau nhng thnh phn mnh xy dng cho nhiu ngi khc dng chung. Khi cn, lp trnh vin c th lp ghp cc thnh phn c sn khc nhau to thnh cc chng trnh c chc nng khc nhau. Tt c ch cn da trn cng ngh lp ghp thnh phn, tit kim c rt nhiu cng sc lp trnh. Trong xu hng lp trnh hng thnh phn, mt s phng php lp trnh khc ny sinh v ang pht trin mnh m: Lp trnh hng tc nhn (Agent-Oriented Programming) Lp trnh hng kha cnh (Aspect-Oriented Programming-AOP)

1.5.2 Lp trnh hng tc nhn


Lp trnh hng agent c th xem l mt mc tru tng cao hn ca lp trnh hng thnh phn. Trong , cc agent l cc thnh phn c kh nng hot ng c lp, t ch hon thnh cng vic ca mnh. Hn na, cc agent c kh nng ch ng lin lc vi cc agent khc c th phi hp, cng tc hay cnh tranh nhau hon thnh nhim v. Lp trnh hng agent c hai c trng c bn: Th nht l kh nng t ch ca mi agent hon thnh nhim v ring ca n. Th hai l tnh t chc x hi gia cc agent, cho php cc agent phi hp, cng tc, cnh tranh nhau hon thnh nhim v chung ca ton h thng.

1.5.3 Lp trnh hng kha cnh


Phng php lp trnh hng kha cnh l phng php lp trnh pht trin t duy tch bit cc mi quan tm khc nhau thnh cc m un khc nhau. y, mt mi quan tm thng khng phi mt chc nng nghip v c th v c th ng gi m l mt kha cnh (thuc tnh) chung m nhiu m un phn mm trong cng h thng nn c, v d lu vt thao tc v li (error logging). Vi AOP, chng ta c th ci t cc mi quan tm chung ct ngang h thng bng cc m un c bit gi l aspect thay v dn tri chng trn cc m un nghip v lin quan. Cc aspect sau c t kt hp vi cc m un nghip v khc bng qu trnh gi l an (weaving) bng b bin dch c bit. AspectJ l mt cng c AOP cho ngn ng lp trnh Java. Trnh bin dch AspectJ s an xen chng trnh Java chnh vi cc aspect thnh cc tp tin bytecode chy trn my o Java. TNG KT CHNG 1 Ni dung chng 1 trnh by cc vn tng quan lin quan n phng php tip cn hng i tng trong lp trnh:

Bin son : Bi Cng Giao --------------------------------------- 7 --------------------------------------

Chng 1: Tng quan v lp trnh hng i tng

Cc phng php tip cn truyn thng: lp trnh tuyn tnh v lp trnh cu trc. Phng php tip cn hng i tng vi cc c trng c bn: ng gi d liu, tnh a hnh v s dng li m ngun. Lp trnh hng i tng trn nn tng l tru tng ho l c s lp trnh hin i. Hin nay, lp trnh hng thnh phn, lp trnh hng agent v lp trnh hng aspect tin ho t lp trnh hng i tng ang l xu hng pht trin mnh m.

BI TP
1. V mt s phn cp lp cho cc lp sau y: to, chui, tht b, nc gii khc, ph mt, th c th n, sn phm b sa, n, tri cy, u xanh, tht, sa, tht heo, rau mung, rau. 2. Nhng c im no ca tivi m chng cn thit c tru tng t gc nhn ca Mt khch hng? Mt k s thit k? Ngi bn? Nh sn xut?

3. Chn mt bi ton m bn mun m hnh ho t cch tip cn hng i tng.

Bn nn chn cc lnh vc m bn quan tm hay bn thng gp trong cng vic hng ngy. Gi s bn s vit mt chng trnh t ng vi chc nng ca bi ton. u tin vit mt trang giy m t yu cu ca chng trnh. on vn u tin m t tng qut h thng d nh. K n nu r yu cu chc nng m ngi s dng bnh thng m t h thng, trnh dng cc t k thut nh, H thng ny phi chy trn mi trng Windows NT, v dng giao thc TCP/IP . . .

Bin son : Bi Cng Giao --------------------------------------- 8 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java

Chng 2.

C bn ngn ng lp trnh Java

Trc khi tm hiu ngn ng Java ngi c cn bit v lch s hnh thnh ngn ng lp trnh ny. Java c khi u bi James Gosling v bn ng nghip Sun Microsystems nm 1991. Ban u ngn ng ny c gi l Oak (c ngha l cy si; do bn ngoi c quan ca ng Gosling c trng nhiu loi cy ny), h d nh ngn ng thay cho C++. Java c s dng ch yu trn mi trng mng, Internet v lp trnh Game trn thit b di ng. Khng nn ln ln Java vi JavaScript, hai ngn ng ch ging tn v loi c php nh C. Cng ty Sun Microsystems ang gi bn quyn v pht trin Java thng xuyn. Phin bn Java mi nht vo thng 08/2010: JDK 6.21. Phin bn d kin tip theo: Java SE 7 (cn gi l Dolphin), c bt u t thng 8 nm 2006 v d kin cng b vo nm 2010. Java c tm hiu trong chng ny nh sau: Kin trc tng qut mt chng trnh xy dng trn Java Cc ton t v cc CTDL c bn trn Java Cc cu trc lnh ca Java

2.1 c trng ca ngn ng Java


Java c nhng c trng c bn sau: n gin Hng i tng c lp phn cng v h iu hnh Mnh m Bo mt Phn tn a lung Linh ng n gin Nhng ngi thit k mong mun pht trin mt ngn ng d hc v quen thuc vi a s ngi lp trnh. Do vy Java loi b cc c trng phc tp ca C v C++ nh: Loi b thao tc con tr, thao tc nh ngha chng ton t (operator overloading)

Bin son : Bi Cng Giao --------------------------------------- 9 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java

Khng cho php a k tha (multi-inheritance) m s dng cc giao din (interface) Khng s dng lnh goto cng nh file header (.h). Loi b cu trc struct v union. Hng i tng Java l ngn ng lp trnh hon ton hng i tng: Mi thc th trong h thng u c coi l mt i tng, tc l mt th hin c th ca mt lp xc nh. Tt c cc chng trnh u phi nm trong mt lp nht nh. Khng th dng Java vit mt chc nng m khng thuc vo bt k mt lp no. Tc l Java khng cho php nh ngha d liu v hm t do trong chng trnh.
// Chng trnh C #include <stdio.h> main() { printf(Hello!); }

M ngun vit trn C ph thuc mi trng hot ng.

Trnh bin dch C cho Solaris

Trnh bin dch C cho Windows

Trnh bin dch C cho Linux

to ra

M nh phn ph thuc mi trng hot ng. Phin bn Solaris Phin bn Windows Phin bn Linux

Hnh 2.1 Cch bin dch truyn thng

Bin son : Bi Cng Giao --------------------------------------- 10 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java

c lp phn cng v h iu hnh i vi cc ngn ng lp trnh truyn thng nh C/C++, phng php bin dch c thc hin nh sau (Hnh 2.1): vi mi mt nn phn cng khc nhau, c mt trnh bin dch khc nhau bin dch m ngun chng trnh cho ph hp vi nn phn cng y. Do vy, khi chy trn mt nn phn cng khc, bt buc phi bin dch li m ngun.
// Chng trnh Java public class Hello { public static void main( String[ ] args) { System.out.println(Hello!); } }

M ngun Java c lp mi trng hot ng.

Trnh bin dch Java cho Solaris

Trnh bin dch Java cho Windows

Trnh bin dch Java cho Linux

to ra

M bytecode c lp mi trng hot ng. Hnh 2.2 Dch chng trnh Java i cc chng trnh vit bng Java, trnh bin dch javac s bin dch m ngun thnh dng m bytecode. Sau , khi chy chng trnh trn cc nn phn cng khc nhau, my o Java (JVM) dng trnh thng dch Java chuyn m bytecode thnh dng chy c trn cc mi trng tng ng. Do vy, khi thay i mi trng (phn cng hoc h iu hnh), khng phi bin dch li m bytecode. Hnh 2.2 minh ho qu trnh bin dch m ngun Java. My o Java l mt chng trnh c bit thng dch v thc hin m ngun Java. Khi chng trnh Java chy n s nm di s qun l ca my o ny, v my o th chu s qun l ca h iu hnh ca mt loi my tnh c th. Mo o s thng dch m bytecode thnh ngn ng my m my tnh c th hiu c. Nh vy s c nhiu

Bin son : Bi Cng Giao --------------------------------------- 11 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java

my o Java cho tng mi trng c th. Hnh 2.3 minh ho qu trnh thc thi ca m ngun Java. Do chng trnh Java phi chy di my o nn tc thc hin ca n hi chm hn cc chng trnh c bin dch v chy trc tip trn h iu hnh. Tuy nhin tc my tnh ngy cng cao th s chnh lch v tc khng ng k. Khi chuyn m bytecode t mi trng ny sang mi trng khc nh t Windows sang Linux th ta khng cn phi bin dch li chng trnh. Hnh 2.4 minh ho iu ny. M nh phn c bin dch vit bng C hay C++ chy trc tip trn mt kin trc phn cng c th (di s qun l ca h iu hnh)

My o Java chy trn mt kin trc phn cng c th (di s qun l ca h iu hnh)

M bytecode c lp mi trng hot ng chy di s qun l ca my o

Hnh 2.3 My o Java thc hin m bytecode c lp mi trng hot ng Mnh m Java l ngn ng yu cu cht ch v kiu d liu: Kiu d liu phi c khai bo tng minh. Java khng s dng con tr v cc php ton con tr. Java kim tra vic truy nhp n mng, chui khi thc thi m bo rng cc truy nhp khng ra ngoi gii hn kch thc mng.

Bin son : Bi Cng Giao --------------------------------------- 12 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java

Qu trnh cp pht, gii phng b nh cho bin c thc hin t ng, nh dch v thu rc nhng i tng khng cn s dng na. C ch by li ca Java gip n gin ha qu trnh x l li v hi phc sau li.

My o Java ph thuc mi trng hot ng A

My o Java ph thuc mi trng hot ng B

Hnh 2.4 Cng m bytecode c th c hiu bi hai my o Bo mt Java cung cp mt mi trng qun l thc thi chng trnh vi nhiu mc kim sot tnh an ton: mc th nht, d liu v cc phng thc c ng gi bn trong lp. Chng ch c truy xut thng qua cc giao din m lp cung cp. mc th hai, trnh bin dch kim sot m bo m l an ton, v tun theo cc nguyn tc ca Java. Mc th ba c m bo bi trnh thng dch. Chng kim tra xem m bytecode c m bo cc qui tc an ton trc khi thc thi. Mc th t kim sot vic np cc lp vo b nh gim st vic vi phm gii hn truy xut trc khi np vo h thng.

Bin son : Bi Cng Giao --------------------------------------- 13 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java

Phn tn Java c thit k h tr cc ng dng chy trn mng bng cc lp mng (java.net). Hn na, Java h tr nhiu nn chy khc nhau nn chng c s dng rng ri nh l cng c pht trin trn Internet, ni s dng nhiu nn khc nhau. a lung Chng trnh Java cung cp gii php a lung (multi threading) thc thi cc cng vic cng ng thi v ng b gia cc lung. Linh ng Java c thit k nh mt ngn ng ng p ng cho nhng mi trng m. Cc chng trnh Java cha rt nhiu thng tin thc thi nhm kim sot v truy nhp i tng lc chy. iu ny cho php kh nng lin kt ng m.

2.2 Kin trc chng trnh v c ch thc thi ca Java


Dng c bn ca mt tp tin m ngun Java c cu trc nh hnh 2.5 sau : y l dng ghi ch
// Mt chng trnh Java n gin package packageName; import java.awt.*; class ClassName { int i; // khai bo thuc tnh

Khai bo tn gi, nu c Khai bo tn th vin sn c, nu cn dng Khai bo phng thc

Khai bo lp

public void methodName() { statements; // lnh thc hin } }

Hnh 2.5 Phn tch mt chng trnh Java n gin Mt tp tin cha m ngun Java c th c ba phn chnh: o Phn khai bo tn gi (khi) bng t kho package. o Phn khai bo th vin tham kho bng t kho import. o Phn khai bo ni dung lp bng t kho class. Khai bo package Package c dng ng gi cc lp trong chng trnh li vi nhau thnh mt khi. y l mt cch hu hiu lu tr cc lp gn ging nhau hoc c cng mt m un thnh mt khi thng nht. C php khai bo tn gi bng t kho package:
package <Tn gi>;

Bin son : Bi Cng Giao --------------------------------------- 14 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java

u im ca package: Cho php nhm cc lp vo vi nhau thnh cc n v nh hn. Vic thao tc trn cc n v khi s gn hn thao tc trn mt tp cc lp. Trnh vic xung t khi t tn lp. V cc lp khng cng gi c th t tn trng nhau. Khi s lng lp ca chng trnh qu ln ta c th trnh phi t tn khc nhau cho cc lp bng cch t chng vo cc gi khc nhau. Cho php bo v cc lp. Khi chng trnh ln, vic chia nh chng trnh thnh cc gi s thun li hn cho vic qun l v pht trin. Tn gi cn c dng nh danh lp trong ng dng. Lu : Dng lnh khai bo tn gi phi c t u tin trong tp tin m chng trnh. Ch c khai bo ti a mt tn gi i vi mi tp m ngun Java. Cc tp tin ca cc lp nm cng gi ng dng phi c lu trong cng mt th mc (tn th mc l tn gi) theo cu trc ca d n. Tn gi nn t theo ch thng v tn gi s l tn th mc tng ng trong a, trnh nhm ln vi tn cc tp tin l tn cc lp ca chng trnh. Khi khng nhm cc lp trong gi (do chng trnh n gin), th khng cn thit phi khai bo tn gi u tp tin. Khi lp gi mc nh khng c tn. Khai bo th vin Khai bo th vin ch ra nhng th vin c nh ngha sn m chng trnh s tham kho ti. C php khai bo th vin vi t kho import nh sau:
import <Tn th vin>;

Java chun cung cp mt s th vin nh sau: java.lang: cung cp cc hm thao tc trn cc kiu d liu c bn, x l li v ngoi l, x l vo ra trn cc thit b chun nh bn phm v mn hnh. java.applet: cung cp cc hm cho xy dng cc applet (s trnh by trong Chng 9). java.awt: cung cp cc hm cho xy dng cc ng dng ho vi cc thnh phn giao din multimedia (s trnh by trong Chng 9). java.io: cung cp cc hm x l vo/ra trn cc thit b chun v cc thit b ngoi vi (s trnh by trong Chng 8). java.util: cung cp cc hm tin ch trong x l lin quan n cc kiu d liu c cu trc nh ArrayList, HashMap, TreeMap, (s trnh by trong Chng 6)

Bin son : Bi Cng Giao --------------------------------------- 15 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java

Lu : Nu mun khai bo tham kho nhiu th vin, phi khai bo tham kho mi th vin vi mt t kho import. Nu ch tham kho mt vi lp trong mt th vin, nn ch r tham kho lp no, thay v phi khai bo tham kho c gi (bng k hiu *) v tham kho c gi s tng kch c tp tin class sau khi bin dch. Nu khng tham kho th vin no, khng cn thit phi khai bo cc tham kho vi t kho import. Khai bo lp Phn ny lun bt buc phi c i vi mt tp tin Java. Phn ny c dng nh sau:
<tnh cht> class <Tn lp> { }

Trong Java tn lp thng t theo kiu Pascal (cc k t u tin ca t l ch in) nh SimpleProgram, FirstClass,.. Lp c ba tnh cht c trng bi ba t kho: public: lp c th c truy cp t cc gi khc. Nu khng khai bo public th ngm nh lp ch c th c truy xut trong cng mt gi. final: khai bo lp hng, lp ny khng th to dn xut; Tc l khng c lp no k tha c t cc lp c tnh cht final. abstract: khai bo lp tru tng, lp ny cha cc phng thc tru tng. Khng th to cc th hin ca cc lp tru tng bng ton t new nh cc lp thng thng. Lu : Ch c tnh cht public hoc khng khai bo tnh cht (package) c th s dng cho lp. v lp ny c cng tn tp tin. V d nu tp tin l Xyz.java th phi c lp Xyz trong tp tin ny. Nu c nhiu hn mt lp public trong mt tp tin, trnh bin dch s bo li. s dng lp t mt gi khc, ta phi vit tn gi trc tn lp. V d chuong2.LopMinhHoa Ngoi ba phn c bn ca mt tp tin Java nh trn, c nhng iu ta cn phi bit nh sau: Ghi ch Java h tr ba kiu ghi ch: truyn thng, kt thc dng, v ghi ch su liu Java (Java documentation comments) Ghi ch truyn thng: ghi ch bt u bng /* kt thc l */ nh /* Gii phng trnh bc hai

Bin son : Bi Cng Giao --------------------------------------- 16 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java

ax2+bx+c=0 */ Ghi ch kt thc dng: ghi ch bt u bng // nh // Gii phng trnh bc hai // ax2+bx+c=0 Ghi ch su liu Java : ghi ch c to ra bi tin ch javadoc Phng thc main bt buc phi c vi mi chng trnh Java v l im bt u thc hin chng trnh, c php ca phng thc ny:
public static void main( String [ ] args) { // cc cu lnh }

y l phng thc chnh, t y chng trnh bt u vic thc thi ca mnh. Tt c cc ng dng Java u s dng mt phng thc main ny. T kho public l mt ch nh truy xut. N cho bit thnh vin ca lp c th c truy xut t bt c u trong chng trnh. T kho static cho php main c gi ti m khng cn to ra mt th hin (instance) ca lp. N khng ph thuc vo cc th hin ca lp c to ra. T kho void thng bo cho my tnh bit rng phng thc s khng tr li bt c gi tr no khi thc thi chng trnh. args l danh sch tham s cho chng trnh. V d sau minh ho cch s dng tham s
class PassArgument { public static void main(String args[ ]) { System.out.println(Danh sch tham s phng thc main nhn c:); System.out.println(args[0]); System.out.println(args[1]); System.out.println(args[2]); } }

Phng thc in ra mn hnh c th s dng System.out.println (in xong xung dng) v System.out.print(in khng xung dng) Thc thi ca Java Chng trnh Java c c son tho bng notepad trong Windows, vi trong Linux hay cc IDE nh eclipse, Netbean, Jcreator Pro, Jbuilder Nu chy trong ca s dng lnh ca Windows, ta c th bin dch chng trnh Java ra m bytecode nh sau: javac sourcecode_filename

Bin son : Bi Cng Giao --------------------------------------- 17 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java

v d: javac PassArgument.java javac Foo.java Bar.java Another.java hoc s dng *: javac *.java Nu bin dch thnh cng cc tp tin .class cha m bytecode chy m bytecode dng lnh sau: java bytecode_filename (b qua ui tp tin.class) v d java PassArgument s cho kt qu nh sau: y l danh sch tham s phng thc main nhn c A 123 B1 Ch khi chy trong mt IDE, vic bin dch v chy chng trnh Java c thc hin bng cch chn lnh trong menu.

2.3 Cc kiu d liu c bn v bin


2.3.1 Kiu d liu c bn
byte: Dng lu d liu kiu s nguyn c kch thc mt byte (8 bit). Phm vi biu din gi tr t -128 n 127. Gi tr mc nh l 0. char: Dng lu d liu kiu k t hoc s nguyn khng m c kch thc 2 byte (16 bit). Phm vi biu din gi tr t \u0000 n \uFFFF. Gi tr mc nh l 0. boolean: Dng lu d liu ch c hai trng thi ng hoc sai ( ln ch c 1 bit). Phm vi biu din gi tr l true, false. Gi tr mc nh l false. short: Dng lu d liu c kiu s nguyn, kch c 2 byte (16 bit). Phm vi biu din gi tr t - 32768 n 32767. Gi tr mc nh l 0. int: Dng lu d liu c kiu s nguyn, kch c 4 byte (32 bit). Phm vi biu din gi tr t -2,147,483,648 n 2,147,483,647. Gi tr mc nh l 0. float: Dng lu d liu c kiu s thc, kch c 4 byte (32 bit). Gi tr mc nh l 0.0f. double: Dng lu d liu c kiu s thc c kch thc ln n 8 byte. Gi tr mc nh l 0.00d. long: Dng lu d liu c kiu s nguyn c kch thc ln n 8 byte. Gi tr mc nh l 0l.

Bin son : Bi Cng Giao --------------------------------------- 18 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java

2.3.2 Bin
2.3.2.1 Khai bo bin C php khai bo bin:
dataType varName;

Trong , dataType l kiu d liu ca bin, varName l tn bin. Trong Java, vic t tn bin phi tun theo cc quy tc sau: Ch c bt u bng mt k t (ch), hoc mt du gch di, hoc mt k t $ Khng c khong trng gia tn Bt u t k t th hai, c th dng cc k t (ch), ch s, du $, du gch di Khng trng vi cc t kho Dng lnh sau khng bin dch v public l mt t kho Java:
int public;

Trnh bin dch s bo li on lnh sau: not a statement int public; ^ ';' expected int public; ^ C phn bit ch hoa ch thng Cch t tn bin nn theo kiu camel (k t u tin l ch thng, cc k t u tin ca t k tip l ch in) nh
int grade; double averageGrade; String myPetRat; boolean weAreFinished;

Cc bin sau y l hp l:
int simple; int _under; int more$money_is_2much;

Cc bin sau y khng hp l:


int 1bad; int number#sign;

Bin son : Bi Cng Giao --------------------------------------- 19 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java int foo-bar; int plus+sign; int x@y; int dot.notation;

2.3.2.2 Phm vi hot ng ca bin Mt bin c phm vi hot ng trong ton b khi lnh m n c khai bo. Mt khi lnh bt u bng du { v kt thc bng du } Nu bin c khai bo trong mt cu trc lnh iu khin, bin c phm vi hot ng trong khi lnh tng ng. Nu bin c khai bo trong mt phng thc (khng nm trong khi lnh no), bin c phm vi hot ng trong phng thc tng ng: c th c s dng trong tt c cc khi lnh ca phng thc. Nu bin c khai bo trong mt lp (khng nm trong trong mt phng thc no), bin c phm vi hot ng trong ton b lp tng ng: c th c s dng trong tt c cc phng thc ca lp. 2.3.2.3 Khi to bin Khng nht thit phi gn gi tr cho bin khi n va c khai bo, nhng bin phi c gi tr xc nh khi chng ln u c s dng. V d sau hai bin nguyn c khai bo, bin foo c gn gi tr, bin bar th khng.
int foo; int bar; foo = 3; foo = foo + bar; // Dng lnh ny khng bin dch.

Trnh bin dch s bo li on lnh sau: variable bar might not have been initialized foo = foo + bar; ^ 2.3.2.4 p kiu V d, nhiu khi gp tnh hung cn cng mt bin c dng int vi mt bin c dng float. x l tnh hung ny, Java s dng tnh nng p kiu (type casting) ca C/C++. on m sau y thc hin php cng mt gi tr du phy ng vi mt gi tr nguyn.
float c = 35.8f; int b = (int)c + 1;

u tin gi tr du phy ng c c i thnh gi tr nguyn 35. Sau n c cng vi 1 v kt qu l gi tr 36 c lu vo b.

Bin son : Bi Cng Giao --------------------------------------- 20 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java

Trong Java c hai loi p kiu d liu: Ni rng (widening): qu trnh lm trn s t kiu d liu c kch thc nh hn sang kiu c kch thc ln hn. Kiu bin i ny khng lm mt thng tin. V d chuyn t int sang float. Chuyn kiu loi ny c th c thc hin ngm nh bi trnh bin dch. Thu hp (narrowwing): qu trnh lm trn s t kiu d liu c kch thc ln hn sang kiu c kch thc nh hn. Kiu bin i ny c th lm mt thng tin nh v d trn. Chuyn kiu loi ny khng th thc hin ngm nh bi trnh bin dch, ngi dng phi thc hin chuyn kiu tng minh. 2.3.2.5 Kiu String Kiu chui trong Java l String. Nu khai bo
string s = "foo"; // bo li.

Thng bo li cannot find symbol symbol: string ghp chui vi nhau hay chui vi s i nhau dng ton t + V d:
String x = "foo"; String y = "bar"; int no = 33; String z = x + y + "!" + no; // z c gn gi tr "foobar! 33" (gi tr ca x v y khng i)

gn chui rng
String s = "";

gn gi tr null (cha c gn gi tr ln no)


String s = null;

2.4 Cc ton t v biu thc


2.4.1 Cc ton t
Java cung cp cc dng ton t sau: Ton t s hc Ton t bit Ton t quan h Ton t logic Ton t iu kin

Bin son : Bi Cng Giao --------------------------------------- 21 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java

Ton t gn Ton t s hc Cc ton hng ca cc ton t s hc phi dng s. Cc ton hng kiu boolean khng s dng c, song cc ton hng k t cho php s dng loi ton t ny. Mt vi kiu ton t c lit k trong bng di y. Ton t + * / % ++ -+= M t Cng Tr Nhn Chia Ly s chia d, v d 10%3=1 Tng gi tr bin ln 1 Gim gi tr bin ln 1 Cng v gn gi tr Cng cc gi tr ca ton hng bn tri vo ton hng bn phi v gn gi tr tr v vo ton hng bn tri. V d c += a tng ng c = c + a -= Tr v gn gi tr Tr cc gi tr ca ton hng bn tri vo ton ton hng bn phi v gn gi tr tr v vo ton hng bn tri. V d c -= a tng ng vi c=c-a *= Nhn v gn Nhn cc gi tr ca ton hng bn tri vi ton ton hng bn phi v gn gi tr tr v vo ton hng bn tri. V d c *= a tng ng vi c = c*a /= Chia v gn Chia gi tr ca ton hng bn tri cho ton ton hng bn phi v gn gi tr tr v vo ton hng bn tri. V d c /= a tng ng vi c = c/a %= Ly s d v gn Chia gi tr ca ton hng bn tri cho ton ton hng bn phi v gn gi tr s d vo ton hng bn tri. V d c %= a tng ng vi c = c%a Bng 2.1 Cc ton t s hc Ton t Bit Cc ton t dng bit cho php ta thao tc trn tng bit ring bit trong cc kiu d liu nguyn thu.

Bin son : Bi Cng Giao --------------------------------------- 22 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java

Ton t ~ & |

M t Ph nh bit (NOT) Tr v gi tr ph nh ca mt bit. Ton t AND bit Tr v gi tr l 1 nu cc ton hng l 1 v 0 trong cc trng hp khc. Ton t OR bit Tr v gi tr l 1 nu mt trong cc ton hng l 1 v 0 trong cc trng hp khc.

Ton t Exclusive OR bit Tr v gi tr l 1 nu ch mt trong cc ton hng l 1 v tr v 0 trong cc trng hp khc.

>>

Dch sang phi bit Chuyn ton b cc bit cu mt s sang phi mt v tr, gi nguyn du ca s m. Ton hng bn tri l s b dch cn s bn phi ch s v tr m cc bit cn dch.

<<

Dch sang tri bit Chuyn ton b cc bit cu mt s sang tri mt v tr, gi nguyn du cu s m. Ton hng bn tri l s b dch cn s bn phi ch s v tr m cc bit cn dch. Bng 2.2 Cc ton t bit

Cc ton t quan h Cc ton t quan h kim tra mi quan h gia hai ton hng. Kt qu ca mt biu thc c dng cc ton t quan h l nhng gi tr boolean (true hoc false). Cc ton t quan h c s dng trong cc cu trc iu khin. Ton t == != > M t So snh bng Ton t ny kim tra s tng ng ca hai ton hng So snh khc Kim tra s khc nhau ca hai ton hng. Ln hn Kim tra gi tr ca ton hng bn phi ln hn ton hng bn tri hay khng < Nh hn Kim tra gi tr ca ton hng bn phi c nh hn ton hng bn tri hay khng >= Ln hn hoc bng

Bin son : Bi Cng Giao --------------------------------------- 23 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java

Kim tra gi tr ca ton hng bn phi c ln hn hoc bng ton hng bn tri hay khng <= Nh hn hoc bng Kim tra gi tr ca ton hng bn phi c nh hn hoc bng ton hng bn tri hay khng. Bng 2.3 Cc ton t quan h. Cc ton t logic Cc ton t logic lm vic vi cc ton hng Boolean. Mt vi ton t kiu ny c ch ra di y Ton t && || ^ M t V (AND) Tr v mt gi tr true nu ch khi c hai ton t c gi tr true Hoc (OR) Tr v gi tr true nu t nht mt gi tr l true. XOR Tr v gi tr true nu v ch nu ch mt trong cc gi tr l true, cc trng hp cn li cho gi tr false ! Ton hng n t NOT. Chuyn gi tr t true sang false v ngc li. Bng 2.4 Cc ton t logic Cc ton t iu kin Ton t iu kin l mt loi ton t c bit v n bao gm ba thnh phn cu thnh biu thc iu kin. C php:
<biu thc 1> ? <biu thc 2> : <biu thc 3>;

biu thc 1: biu thc logic. Tr v gi tr true hoc false biu thc 2: l gi tr tr v nu <biu thc 1> xc nh l true biu thc 3: l gi tr tr v nu <biu thc 1> xc nh l false Ton t gn Ton t gn (=) dng gn mt gi tr vo mt bin v c th gn nhiu gi tr cho nhiu bin cng mt lc. V d on lnh sau gn mt gi tr cho bin var v gi tr ny li c gn cho nhiu bin trn mt dng lnh n.
int var = 20; int p,q,r,s; p=q=r=s=var;

Dng lnh cui cng c thc hin t phi qua tri. u tin gi tr bin var c gn cho s, sau gi tr ca s c gn cho r v c tip nh vy.

Bin son : Bi Cng Giao --------------------------------------- 24 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java

Th t u tin ca cc ton t Cc biu thc c vit ra ni chung gm nhiu ton t. Th t u tin quyt nh trt t thc hin cc ton t trn cc biu thc. Bng di y lit k th t thc hin cc ton t trong Java Th t 1 2 3 4 5 Ton t Cc ton t n nh +, -, ++, -Cc ton t s hc v cc ton t dch nh *, /, +, -, <<, >> Cc ton t quan h nh >, <, >=, <=, ==, != Cc ton t logic v bit nh &&, ||, &, |, ^ Cc ton t gn nh =, *=, /=, +=, -= Bng 2.5 Th t u tin cc ton t Thay i th t u tin thay i th t u tin trn mt biu thc, ta c th s dng du ngoc n (): Phn c gii hn trong ngoc n c thc hin trc. Nu dng nhiu ngoc n lng nhau th ton t nm trong ngoc n pha trong s thc thi trc, sau n cc vng pha ngoi. Trong phm vi mt cp ngoc n th quy tc th t u tin vn gi nguyn tc dng. V d:
int x = 1; int y = 2; int z = 3; int answer = ((8 * (y + z)) + y) * x;

s c lng gi nh sau: ((8 * (y + z)) + y) * x ((8 * 5) + y) * x (40 + y) * x 42 * x 42

2.4.2 Biu thc


Mt biu thc n gin trong Java l Hng: 7, false Mt k t: A, 3 Mt chui: foo, Java Tn ca bin: myString, x

Bin son : Bi Cng Giao --------------------------------------- 25 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java

S kt hp ca hai ton hng bi mt ton t hai ngi: x + 2 Mt bin v ton t mt ngi i km: i++ Biu thc trong cp du (): (x + 2) Biu thc c th l s kt hp ca cc biu thc khc c lng nhau trong cc cp (): ((((4/x) + y) * 7) + z). Kiu ca biu thc l kiu gi tr tr v sau khi lng gi biu thc V d 1 :
double x = 3.0 ; double y = 2.0 ; if ((x > 2.0) && (y != 4.0)) { }

biu thc (x > 2.0) && (y != 4.0) lng gi ti true, v vy biu thc ny c kiu boolean. V d 2 :
int x = 1 ; int y = 2 ; int z = 3 ; int answer = ((8 * (y + z)) + y) * x ;

biu thc ((8 * (y + z)) + y) * x lng gi ti 4, v vy biu thc ny c kiu int.

2.5 Cc cu trc lnh


Java cung cp hai loi cu trc iu khin: iu khin r nhnh
if-else swich-case while do-while for

Vng lp (loop)

2.5.1 Lnh if-else


Lnh if-else kim tra gi tr dng boolean ca iu kin. Nu gi tr iu kin l true th ch c khi lnh sau if s c thc hin, nu l false th ch c khi lnh sau else c thc hin. C php:
if (iu kin) { khi lnh 1; } else {

Bin son : Bi Cng Giao --------------------------------------- 26 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java khi lnh 2; } iu kin: Biu thc boolean nh ton t so snh. khi lnh 1: Khi lnh c thc thi khi gi tr iu kin l true. khi lnh 2: Khi lnh c thc thi nu iu kin tr v gi tr false.

on chng trnh sau kim tra xem cc s c chia ht cho 5 hay khng. int num=10;
If (num%5 == 0) System.out.println (num + chia ht cho 5!); else System.out.println (num + khng chia ht cho 5!);

on chng trnh trn num c gn gi tr nguyn l 10. Trong cu lnh if-else iu kin num%5 tr v gi tr 0 v iu kin thc hin l true. Thng bo 10 chia ht cho 5 c in ra. Lu rng v ch c mt cu lnh c vit trong on if v else, bi vy khng cn thit phi c a vo du ngoc mc { v }.

2.5.2 Lnh switch-case


Khi lnh switch-case c th c s dng thay th cu lnh if-else trong trng hp mt biu thc cho ra nhiu kt qu. C php:
swich (biu thc) { case gi tr 1: khi lnh 1; break; case gi tr 2: khi lnh 2; break; case gi tr N: khi lnh N; break; default: khi lnh mc nh; } biu thc : Bin cha mt gi tr xc nh. gi tr 1, gi tr 2, . gi tr N: Cc gi tr hng s ph hp vi gi tr trn biu thc. khi lnh 1, khi lnh 1 khi lnh N: Khi lnh c thc thi khi trng hp tng

ng c gi tr true.
break: T kho c s dng b qua tt c cc cu lnh sau v chuyn iu

khin ti cu trc sau switch.

Bin son : Bi Cng Giao --------------------------------------- 27 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java default: T kha tu chn c s dng ch r cc cu lnh no c thc hin ch

khi tt c cc trng hp nhn gi tr false. khi lnh mc nh: Khi lnh c thc hin ch khi tt c cc trng hp nhn gi tr false on chng trnh sau xc nh gi tr trong mt bin nguyn v hin th ngy trong tun c th hin di dng chui. kim tra cc gi tr nm trong khong t 0 n 6, chng trnh s thng bo li nu nm ngoi phm vi trn. V d sau xt in ra ngy:
int day = 2; switch(day) { case 0 : System.out.println(Sunday); break; case 1 : System.out.println(Monday); break; case 2 : System.out.println(Tuesday); break; case 3 : System.out.println(Wednesday); break; case 4 : System.out.println(Thursday); break; case 5: System.out.println(Friday); break; case 6 : System.out.println(Satuday); break; default: System.out.println(Invalid day of week); }

on lnh s hin th Tuesday.

2.5.3 Vng lp while


Vng lp while thc thi khi lnh khi iu kin vn l true v dng li khi iu kin thc thi nhn gi tr false. C php:
while(iu kin) { khi lnh; } iu kin: c gi tr boolean; vng lp s tip tc cho nu iu kin vn c gi tr true. khi lnh: Khi lnh c thc hin nu iu kin nhn gi tr true

on chng trnh sau tnh tng ca 5 s t nhin u tin dng cu trc while.
int a = 5, sum = 1; while (a >= 1) {

Bin son : Bi Cng Giao --------------------------------------- 28 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java sum +=a; a--; } System.out.println(The sum is +sum);

v d trn, vng lp c thc thi cho n khi iu kin a>=1 l true. Bin a c khai bo bn ngoi vng lp v c gn gi tr l 5. Cui mi vng lp, gi tri ca a gim i 1. Sau nm vng gi tr ca a bng 0. iu kin tr v gi tr false v vng lp kt thc. Kt qu s c hin th The sum is 15

2.5.4 Vng lp do-while


Vng lp do-while thc thi khi lnh khi m iu kin l true, tng t nh vng lp while, ngoi tr do-while thc hin lnh t nht mt ln ngay c khi iu kin l false. C php:
do { khi lnh; } while(iu kin); iu kin: Biu thc boolean; vng lp s tip tc khi m iu kin vn c gi tr true. khi lnh: Khi lnh lun c thc hin ln th nht, t vng lp th hai, chng

c thc hin khi iu kin nhn gi tr true. V d sau tnh tng ca 5 s t nhin u tin dng cu trc do-while.
int a = 1,sum = 0; do { sum += a; a++; } while (a <= 5); System.out.println(Sum of 1 to 5 is +sum);

Bin a c khi to vi gi tr 1, sau n va c dng lm bin chy (tng ln 1 sau mi ln lp) va c dng cng dn vo bin sum. Ti thi im kt thc, chng trnh s in ra Sum of 1 to 5 is 15.

2.5.5 Vng lp for


Vng lp for cung cp mt dng kt hp tt c cc c im chung ca tt c cc loi vng lp: gi tr khi to ca bin chy, iu kin dng ca vng lp v lnh thay i gi tr ca bin chy. C php:
for(khi lnh khi to; iu kin; khi lnh thay i bin chy) { khi lnh;

Bin son : Bi Cng Giao --------------------------------------- 29 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java } khi lnh khi to: khi to gi tr ban u cho cc bin chy, cc lnh khi to c

phn cch nhau bi du phy v ch thc hin duy nht mt ln vo thi im bt u ca vng lp.
iu kin: Biu thc boolean; vng lp s tip tc cho n khi no iu kin c gi tr

false.
khi lnh thay i bin chy: cc cu lnh thay i gi tr ca bin chy. Cc lnh ny lun c thc hin sau mi ln thc hin khi lnh trong vng lp. Cc lnh phn bit

nhau bi du phy. on chng trnh sau hin thi tng ca 5 s u tin dng vng lp for.
int sum = 0; for (int i=1; i<=5; i++) sum += i; System.out.println(The sum is +sum);

v d trn, i v sum l hai bin c gn cc gi tr u l 1 v 0 tng ng. iu kin c kim tra v khi n cn nhn gi tr true, cu lnh tc ng trong vng lp c thc hin. Tip theo gi tr ca i c tng ln 2 to ra s chn tip theo. Mt ln na, iu kin li c kim tra v cu lnh tc ng li c thc hin. Sau nm vng, i tng ln 6, iu kin tr v gi tr false v vng lp kt thc. Thng bo: The sum is 15 c hin th. thot khi vng lp ta s dng lnh break. V d:
// x chy t 1 ti 4 ... for (int x = 1; x <= 4; x++) { // ... nhng khi x bng 3, th thot khi dng lp bng lnh break if (x == 3) break; System.out.println(x); } System.out.println("Lp kt thc");

Kt qu ca on lnh: 1 2 Lp kt thc quay li vng lp ta s dng lnh continue. V d:


// x chy t 1 ti 4 ...

Bin son : Bi Cng Giao --------------------------------------- 30 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java for (int x = 1; x <= 4; x++) { // ... nhng khi x bng 3, th thot khi dng lp bng lnh break if (x == 3) continue; System.out.println(x); } System.out.println("Lp kt thc");

Kt qu ca on lnh trn: 1 2 4 Lp kt thc

2.6 Phong cch lp trnh


Ngi lp trnh gii th chng trnh vit phi cho d c, sao cho nhng ngi lp trnh chung d theo di v bo tr. Phong cch lp trnh sau y gip to nn cc chng trnh sng sa: Canh l cho tng khi lnh, v d:
public class IndentationExample { public static void main(String[] args) { for (int i = 1; i <= 4; i++) { System.out.print(i); if ((i == 2) || (i == 4)) { if (i == 2) System.out.print("Two "); else System.out.print("Four "); System.out.println("is an even number"); } else if ((i == 1) || (i == 3)) { if (i == 1) System.out.print("One "); else System.out.print("Three "); System.out.println("is an odd number"); } }

Bin son : Bi Cng Giao --------------------------------------- 31 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java } }

S dng ghi ch thch hp trong cc trng hp sau: o Nu c cc on lnh no ghi ng o Canh l ghi ch cng vi khi lnh ca n o Ghi ch phi c ngha, khng nn pht biu li ni dung cu lnh, v d
// Khai bo x l s nguyn, v gn bng 3. int x = 3;

Cch t { v } c hai cch: o t { cui dng lnh bt u khi lnh. Mi } t dng ring, canh l vi k t u tin ca dng lnh bt u trong khi lnh, v d:
public class Test { public static void main(String[] args) { for (int i = 0; i < 3; i++) System.out.println(i); } }

o t { mi dng ring, canh l vi dng ngay trn n. Mi } t dng ring, canh l vi { tng ng, v d:
public class Test { public static void main(String[] args) { for (int i = 0; i < 3; i++) System.out.println(i); } }

C hai cch trn u c chp nhn, nhng cch u th gn hn v s dng rng ri hn. Du ngi lp trnh chn cch no th phi gi ng kiu trong xuyn sut d n phn mm ca mnh m bo tnh nht qun. t tn bin phi c ngha. Trnh t tn bin qu vn tt, kh hiu nh:
int grd;

Bin son : Bi Cng Giao --------------------------------------- 32 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java

Phi l
int grade;

Trnh t tn qu di, nh:


double averageThirdQuarterReturnOnInvestment;

mt gi thay th:
double avg3rdQtrROI;

2.7 Case Study


By gi, p dng cc ni dung hc trong chng ny vit mt chng trnh tnh chu vi v din tch ca mt hnh ch nht c kch thc x,y vi yu cu: Kch thc x, y nhp t tham s dng lnh. Phi kim tra x, y l cc s nguyn dng hay khng trc khi tnh ton. In kt qu tnh ton ra mn hnh. y l chng trnh thc hin bi ton ny.
package chuong2; class RectangleDemo { public static void main(String args[]) { // khai bo cc bin lu gi kch thc ca hnh ch nht int x = 0, y = 0; // c cc kch thc t tham s dng lnh nu truyn hai tham s th mi tnh tip */ if (args.length >= 2) { //chuyn kiu t String sang integer x = Integer.parseInt(args[0]); y = Integer.parseInt(args[1]); } /*Tnh chu vi v din tch hnh ch nht nu c hai tham s u dng th mi tnh */ if (x>0 && y>0) { // tnh chu vi int chuvi = 2*(x + y); System.out.println (Chu vi l + chuvi); // tnh din tch int dientich = x*y;

Bin son : Bi Cng Giao --------------------------------------- 33 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java System.out.println (Din tch l + dientich); } else System.out.println (Cc tham s khng ng!); } }

Sau khi bin dch chng trnh trn c tn l RectangleDemo.java, ta chy t ca s dng lnh: >java RectangleDemo 10 20 S thu c kt qu: Chu vi l: 60 Din tch l: 200 Nu ch g ca s dng lnh: >java RectangleDemo Th s nhn c mt thng bo li: Cc tham s khng ng!

TNG KT CHNG 2
Ni dung chng ny trnh by cc ni dung c bn v c php ngn ng lp trnh Java: Tt c cc lnh ca Java phi c t chc vo trong mt lp nht nh. Tn tp tin m ngun phi trng vi tn lp. T kho class c dng khai bo tn lp Tn lp, tn phng thc, tn hng v tn bin trong Java phi tun theo quy tc t tn ca Java. ng dng Java c mt lp cha phng thc main. Cc tham s c th c truyn vo phng thc main nh cc tham s lnh (command line parameters). Java cung cp cc dng ton t: Cc ton t s hc Cc ton t bit Cc ton t quan h

Bin son : Bi Cng Giao --------------------------------------- 34 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java

Cc ton t logic Ton t u kin Ton t gn


if-else switch for while do while

Java cung cp cc cu trc iu khin lnh:

Mt vi qui tc lm chng trnh sng sa.

BI TP
1. Vo website ca Sun: http://java.sun.com v tm hiu cc u im ca Java cha c cp ti trong chng ny. 2. Xem xt cc sn phm phn mm ca cc cng ty IBM, Oracle, Microsoft, v Apple c lin quan n ngn ng Java. 3. So snh Java v cc ngn ng lp trnh khc m bn bit? 4. Trong cc tn sau, tn no c th dng lm tn bin trong Java: _123 a$ 1abc class vi du $123 5. Mun lu gi mt bin s nguyn dng m c gi tr ln nht l mt triu th dng kiu d liu no l tit kim b nh nht? 6. Mun lu gi mt bin s nguyn m m c gi tr nh nht l m mt t th dng kiu d liu no l tit kim b nh nht? 7. Trong cu trc lnh if-else n (mt if v mt else) th c t nht mt khi lnh (ca if hoc ca else) c thc hin. ng hay sai? 8. Trong cu trc lnh switch-case, khi khng dng default th c t nht mt khi lnh c thc hin. ng hay sai? 9. Trong cu trc lnh while, khi lnh c thc hin t nht mt ln ngay c khi iu kin c gi tr false. ng hay sai? 10. Trong cu trc lnh do-while, khi lnh c thc hin t nht mt ln ngay c khi iu kin c gi tr false. ng hay sai?

Bin son : Bi Cng Giao --------------------------------------- 35 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java

11. Trong cu trc lnh for, khi lnh c thc hin t nht mt ln ngay c khi iu kin c gi tr false. ng hay sai? 12. Lng gi biu thc sau:
int a = 1; int b = 1; int c = 1; ((((c++ + --a) * b) != 2) && true)

13. Cho bit kt qu thu c khi thc hin on chng trnh sau?
class Me { public static void main(String args[]) { int sales = 820; int profit = 200; System.out.println((sale +profit)/10*5); } }

14. Cho bit on chng trnh sau thc hin vng lp bao nhiu ln v kt qu in ra l g?
class Me { public static void main(String args[]) { int i = 0; int sum = 0; do { sum += i; i++; } while(i <= 10); System.out.println(sum); } }

15. Cho bit on chng trnh sau thc hin vng lp bao nhiu ln v kt qu in ra l g?
class Me { public static void main(String args[]) { int i = 5; int sum = 0; do { sum += i; i++;

Bin son : Bi Cng Giao --------------------------------------- 36 --------------------------------------

Chng 2: C bn ngn ng lp trnh Java } while(i < 5); System.out.println(sum); } }

16. Cho bit hai on chng trnh sau in ra kt qu ging hay khc nhau?
class Me1{ public static void main(String args[]) { int i = 0; int sum = 0; for(i=0; i<5; i++) sum += i; System.out.println(sum); } }

v:
class Me2 { public static void main(String args[ ]) { int i = 0; int sum = 0; for( ; i<5; i++) sum += i; System.out.println(sum); } }

17. Vit chng trnh tnh tng cc s chn nm trong khong 1 n 100. 18. Vit chng trnh hin th tng cc bi s ca 7 nm gia 1 v 100. 19. Vit chng trnh tm giai tha ca n (n>0), n nhp t tham s dng lnh. 20. Vit chng trnh tm bi s chung nh nht ca m v n (m, n>0), m v n c nhp t tham s dng lnh. 21. Vit chng trnh tm c s chung ln nht ca m v n (m, n>0), m v n c nhp t tham s dng lnh. 22. Vit chng trnh tm s Fibonaci th n (n>2), n nhp t tham s dng lnh. Bit rng s Fibonaci c tnh theo cng thc: F(n) = F(n-1) + F(n-2) vi n>=2 v F(0) = F(1) = 1. 23. Vit chng trnh in ra s chn t 2 ti 10 bng cch dng a. Mt vng lp for v mt cu lnh continue b. Mt vng lp while v mt bin lm c hiu (variable as a flag).

Bin son : Bi Cng Giao --------------------------------------- 37 --------------------------------------

Chng 3: i tng v lp

Chng 3.

i tng v lp

Ni dung chng ny nhm gii thiu: u im ca lp trnh hng i tng so snh vi lp trnh khng i tng truyn thng Dng lp c t d liu v cch c x ca i tng nh th no To i tng vo lc chy chng trnh nh th no Cch khai bo bin tham chiu ti i tng Cch bin tham chiu i tng trong b nh Mt kiu lp c bit gi l enum dng lit k cc gi tr nh sn m l min gi tr cho mt bin c bit

3.1 Phn r phn mm theo cch tip cn hng i tng


Nh cp phn 1.1.2, i vi lp trnh theo hng chc nng ta phn r phn mm t trn xung (top down), sau khi cc chc nng c th cc nt l c hon thnh chng c gn kt li ra ng dng hon chnh theo hng t di ln. V d nh h thng chng trnh ng k sinh vin SRS c minh ho bng hnh 3.1 v 3.2 nh sau: ng k Sinh vin

Hin th danh sch kho hc

Sinh vin chn kho hc

Kim tra Sinh vin c iu kin ng k

Hnh 3.1 Phn r ng dng t trn xung. Cch phn r nh vy th chc nng c ch u tin sau mi n d liu cn cho chc nng. D liu c gi qua li gia cc chc nng v khi c s thay i d liu ngoi mun th chng ta kh bit c ni xy qua. Hn na khi CTDL b thay i mt mun th c th cc mun khng hiu gy ra s gy h thng phn mm.

Bin son : Bi Cng Giao --------------------------------------- 38 --------------------------------------

Chng 3: i tng v lp

Phn r phn mm theo cch tip cn hng i tng s khc phc cc nhc im ny nh sau: Thit k CTDL, sau mi ti chc nng h thng. D liu c bao bc bn trong i tng, nh vy CTDL ch c hiu bi i tng c cha d liu . ng k Sinh vin

Hin th danh sch kho hc

Sinh vin chn kho hc

Kim tra Sinh vin c iu kin ng k

Hnh 3.2 Gn ng dng t di ln. Nu CTDL ca i tng phi thay i sau khi ng dng c ci t th ch nh hng ti i tng . Mi i tng chu trch nhim cho vic bo m tnh ton vn ca d liu ca n.

3.2 Khi nim i tng


Trong lp trnh hng i tng, tt c cc thc th trong h thng u c coi l cc i tng c th. i tng l mt thc th hot ng khi chng trnh ang chy. V d: 1. Trong bi ton qun l bun bn xe hi ca mt ca hng kinh doanh, mi chic xe ang c mt trong ca hng c coi l mt i tng. Chng hn, mt chic xe nhn hiu Ford, mu trng, gi 5000$ l mt i tng. 2. Trong bi ton qun l nhn vin ca mt vn phng, mi nhn vin trong vn phng c coi l mt i tng. Chng hn, nhn vin tn l Vinh, 25 tui lm phng hnh chnh l mt i tng. Mt i tng l mt thc th ang tn ti trong h thng v c xc nh bng ba yu t: nh danh i tng: xc nh duy nht cho mi i tng trong h thng, nhm phn bit cc i tng vi nhau. Trng thi ca i tng: l s t hp ca cc gi tr ca cc thuc tnh m i tng ang c.

Bin son : Bi Cng Giao --------------------------------------- 39 --------------------------------------

Chng 3: i tng v lp

Hot ng ca i tng: l cc hnh ng m i tng c kh nng thc hin c. Trng thi hin ti ca i tng qui nh tnh cht c trng ca i tng. V d, nhn vin trong v d trn c trng thi l: Tn l Vinh Tui l 25 V tr lm vic l phng hnh chnh. Trong khi , trng thi ca chic xe trong ca hng l: Nhn hiu xe l Ford Mu sn xe l trng Gi bn xe l 5000$ Mi i tng s thc hin mt s hnh ng. V d, i tng xe hi c kh nng thc hin nhng hnh ng sau: Khi ng. Dng li. Chy. biu din i tng trong lp trnh hng i tng, ngi ta tru tng ho i tng to nn khi nim lp i tng. Tru tng ho i tng theo chc nng Tru tng ho i tng theo chc nng chnh l qu trnh m hnh ho phng thc ca lp da trn cc hnh ng ca cc i tng. Qu trnh ny c tin hnh nh sau: Tp hp tt c cc hnh ng c th c ca cc i tng. Nhm cc i tng c cc hot ng tng t nhau, loi b bt cc hot ng c bit, to thnh mt nhm chung. Mi nhm i tng xut mt lp tng ng. Cc hnh ng chung ca nhm i tng s cu thnh cc phng thc ca lp tng ng. V d, trong bi ton qun l ca hng bn t. Mi t c mt trong ca hng l mt i tng. Mc d mi chic xe c mt s c im khc nhau v nhn hiu, gi xe, mu sc nhng c chung cc hnh ng ca mt chic xe t l: C th khi ng my. C th chy. C th dng li. C th tt my.

Bin son : Bi Cng Giao --------------------------------------- 40 --------------------------------------

Chng 3: i tng v lp

Ngoi ra, mt s t xe c th thc hin mt s hnh ng c bit nh: C th giu n pha C th t bt n pha C th t ng pht tn hiu bo ng. Tuy nhin, khng phi xe no cng thc hin c cc hnh ng ny. Cho nn ta loi b cc hnh ng c bit ca mt s xe, ch gi li cc hnh ng chung nht, m hnh thnh cc phng thc ca i tng xe t tng ng vi cc hnh ng chung nht ca cc xe t. Lp Xe t
Phng thc:

Khi ng xe Chy xe Dng xe Tt my Tru tng ho i tng theo d liu Tru tng ho i tng theo d liu chnh l qu trnh m hnh ho cc thuc tnh ca lp da trn cc thuc tnh ca cc i tng tng ng. Qu trnh ny c tin hnh nh sau: Tp hp tt c cc thuc tnh c th c ca cc i tng. Nhm cc i tng c cc thuc tnh tng t nhau, loi b bt cc thuc tnh c bit, to thnh mt nhm chung. Mi nhm i tng xut mt lp tng ng. Cc thuc tnh chung ca nhm i tng s cu thnh cc thuc tnh tng ng ca lp c xut. V d, trong bi ton qun l ca hng bn t. Mi t c mt trong ca hng l mt i tng. Mc d mi chic xe c mt s c im khc nhau v nhn hiu, gi xe, mu sc nhng c chung cc thuc tnh ca mt chic xe t l: Cc xe u c nhn hiu. Cc xe u c mu sc Cc xe u c gi bn Cc xe u c cng sut ng c Ngoi ra, mt s t xe c th c thm cc thuc tnh: C xe c th c dn nghe nhc C xe c th c mn hnh xem ti vi C xe c lp knh chng nng, chng n

Bin son : Bi Cng Giao --------------------------------------- 41 --------------------------------------

Chng 3: i tng v lp

Tuy nhin, y l cc thuc tnh c bit ca mt s i tng xe, nn khng c xut thnh thuc tnh ca lp t. Do , ta m hnh lp t vi cc thuc tnh chung nht ca cc t. Lp Xe t
Thuc tnh:

Nhn hiu xe Mu xe Gi xe Cng sut xe (m lc)

3.3 Khi nim lp


Trong lp trnh hng i tng, i tng l mt thc th c th, tn ti trong h thng. Trong khi , lp l mt khi nim tru tng, dng ch mt tp hp cc i tng c mt trong h thng. V d: 1. Trong bi ton qun l bun bn xe hi ca mt ca hng kinh doanh, mi chic xe ang c mt trong ca hng c coi l mt i tng. Nhng khi nim Xe hi l mt lp i tng dng ch tt c cc loi xe hi ca ca hng. 2. Trong bi ton qun l nhn vin ca mt vn phng, mi nhn vin trong vn phng c coi l mt i tng. Nhng khi nim Nhn vin l mt lp i tng dng ch chung chung cc nhn vin ca vn phng. Lu : o Lp l mt khi nim, mang tnh tru tng, dng biu din mt tp cc i tng. o i tng l mt th hin c th ca lp, l mt thc th tn ti trong h thng. Lp c dng biu din i tng, cho nn lp cng c thuc tnh v phng thc: Thuc tnh ca lp tng ng vi thuc tnh ca cc i tng. Phng thc ca lp tng ng vi cc hnh ng ca i tng. V d, lp xe t c m t bng cc thuc tnh v phng thc: Lp Xe t
Thuc tnh:

Nhn hiu xe Mu xe Gi xe Cng sut xe (m lc)

Bin son : Bi Cng Giao --------------------------------------- 42 --------------------------------------

Chng 3: i tng v lp Phng thc:

Khi ng xe Chy xe Dng xe Tt my Lu : Mt lp c th c mt trong cc kh nng sau: Hoc ch c thuc tnh, khng c phng thc. Hoc ch c phng thc, khng c thuc tnh. Hoc c c thuc tnh v phng thc, trng hp ny l ph bin nht. c bit, lp khng c thuc tnh v phng thc no l cc lp tru tng. Cc lp ny khng c i tng tng ng. Lp v i tng Lp v i tng, mc d c mi lin h tng ng ln nhau, nhng bn cht li khc nhau: Lp l s tru tng ho ca cc i tng. Trong khi , i tng l mt th hin ca lp. i tng l mt thc th c th, c thc, tn ti trong h thng. Trong khi , lp l mt khi nim tru tng, ch tn ti dng khi nim m t cc c tnh chung ca mt s i tng. Tt c cc i tng thuc v cng mt lp c cng cc thuc tnh v cc phng thc. Mt lp l mt nguyn mu ca mt i tng. N xc nh cc hnh ng kh thi v cc thuc tnh cn thit cho mt nhm cc i tng c th. Ni chung, lp l khi nim tn ti khi pht trin h thng, mang tnh khi nim, tru tng. Trong khi , i tng l mt thc th c th tn ti khi h thng ang hot ng.

3.4 Khi nim ng gi


ng gi l c ch gp thuc tnh v phng thc ca mt i tng trong mt t chc duy nht. Xt v d bi ton qun l nhn vin vn phng vi lp Nhn vin nh sau: Lp Nhn vin
Thuc tnh:

Tn Ngy sinh Gii tnh

Bin son : Bi Cng Giao --------------------------------------- 43 --------------------------------------

Chng 3: i tng v lp

Phng ban H s lng


Phng thc:

Tnh lng nhn vin Khi , cch tnh lng cho nhn vin l khc nhau i vi mi ngi: <Tin lng> = <H s lng> * <Lng c bn> * <T l phn trm> Trong , t l phn trm l khc nhau cho mi phng ban, v d: Phng k hoch l 105% Phng hnh chnh l 100% Phng nhn s l 110% Khi , tu vo thuc tnh phng ban khc nhau m ta phi dng cng thc t l khc nhau tnh lng cho mi nhn vin. Tuy nhin, cch tnh c th ny l cng vic bn trong ca phng thc tnh tin lng ca lp Nhn vin. Vi mi ng dng, khi to mt i tng c th ca lp nhn vin, ta ch cn truyn cc tham s thuc tnh cho i tng, sau gi phng thc tnh tin lng cho i tng nhn vin , ta s bit c tin lng ca nhn vin. Cch gi phng thc tnh tin lng l hon ton ging nhau cho tt c cc i tng nhn vin ca vn phng. S ging nhau v cch s dng phng thc cho cc i tng ca cng mt lp, mc d bn trong phng thc c cc cch tnh ton khc nhau vi cc i tng khc nhau, c gi l tnh ng gi d liu ca lp trnh hng i tng. u im ca ng gi c trnh by trong Chng 1.

3.5 Bin tham chiu


Trong ngn ng lp trnh C, khai bo bin
int x;

ngha rng x l mt tn hnh thc c dng ch ti mt gi tr nguyn c lu trong b nh my tnh. Chng ta khng quan tm ni b nh u. Bt c khi no ta mun truy xut gi tr nguyn , ta ch cn gi ti k hiu hnh thc x, v d:
if (x > 17) x = x + 5;

Trong ngn ng lp trnh hng i tng nh Java, chng ta c th nh ngha mt lp nh Student, v khai bo mt bin kiu Student nh sau:
Student y;

Bin son : Bi Cng Giao --------------------------------------- 44 --------------------------------------

Chng 3: i tng v lp

ngha rng y l mt tn hnh thc c dng ch ti mt i tng Student (ngha l mt th hin ca lp Student) m c lu trong b nh my tnh. Chng ta khng quan tm ni b nh u. Bt c khi no ta mun truy xut thuc tnh hay phng thc ca i tng ny, ta ch cn gi ti k hiu hnh thc y v tn thuc tnh hay phng thc, v d:
if (y.registerForCouse()) System.out.println ("Accepted");

C s ging nhau gia y l Student v x l int trong minh ho trn. Ch bi v int l kiu nh ngha trc trong Java (v cc ngn ng khc), lp Student l kiu ngi dng nh ngha. V y tham chiu ti mt th hin (i tng) ca lp Student, nn y l bin tham chiu. Tri li cc bin thuc tm kiu c bn ca Javaint, double, float, byte, short, long, char, v booleankhng l bin tham chiu, ngha l chng khng tham chiu cc i tng.

3.6 Khi to i tng


Khi khai bo bin nh
Student y;

i tng cha tht s c to trong b nh, ta ch to bin tham chiu y. Nu ta mun khi to i tng cho y tham chiu ti, dng lnh sau:
y = new Student();

Hnh 3.3 minh ho iu ny.

i tng Student

y Hnh 3.3 S dng mt bin tham chiu ch ti i tng trong b nh. Nu ngi c quen thuc vi khi nim con tr trong ngn ng C v C++, mt bin tham chiu tng t nh bin con tr ch ti mt vng nh hay cha gi tr l a ch ni i tng c lu gi Tuy nhin bin tham chiu khng th p dng cc php ton s hc nh bin con tr.

Bin son : Bi Cng Giao --------------------------------------- 45 --------------------------------------

Chng 3: i tng v lp

hiu hn v bin tham chiu ta xt cc on lnh sau: // on lnh 1 // Va khi to x va to mt i tng Student cho x tham chiu ti
Student x=new Student();

// x v y cng tham chiu ti mt i tng Student. Hnh 3.4 minh ho iu ny.


Student y = x;

i tng Student

x // on lnh 2

Hnh 3.4 Hai i tng cng tham chiu ti cng mt i tng. // Va khi to x va to mt i tng Student cho x tham chiu ti
Student x=new Student();

// x v y cng tham chiu ti mt i tng Student


Student y = x; Student z=new Student();

// z v y cng tham chiu ti i tng Student th hai. Hnh 3.5 minh ho iu ny.
y = z;

i tng Student

i tng Student

Hnh 3.5 Chuyn y tham chiu ti Student th hai.

Bin son : Bi Cng Giao --------------------------------------- 46 --------------------------------------

Chng 3: i tng v lp

// on lnh 3 // Va khi to x va to mt i tng Student cho x tham chiu ti


Student x=new Student();

// Va khi to z va to mt i tng Student cho z tham chiu ti


Student z=new Student();

/* z v x cng tham chiu ti i tng Student th hai. i tng Student u tin khng cn b tham chiu tr thnh m ci. Hnh 3.6 minh ho iu ny. */
x= z;

i tng Student

i tng Student

Hnh 3.6 Chuyn x tham chiu ti Student th hai. // on lnh 4 // Va khi to x va to mt i tng Student cho x tham chiu ti
Student x=new Student();

/* x gi khng ch ti mt i tng Student no c do b gn null. i tng Student khng cn b tham chiu tr thnh m ci. Hnh 3.7 minh ho iu ny. */
x= null;

i tng Student

x Hnh 3.7 i tng Student m ci.

Bin son : Bi Cng Giao --------------------------------------- 47 --------------------------------------

Chng 3: i tng v lp

gii quyt cc trng hp i tng khng c bin no tham chiu nh trn, my o Java to ra c ch thu rc (garbage collection) nh sau:

Cng vic thu rc xy ra khi ng dng cn t b nh t do hoc khi my o Java rnh. V vy trong mt thi im no cc i tng m ci vn cn trong b nh nhng ta khng th truy xut chng.
Runtime.getRuntime().gc();

Nu mun thu rc xy ra ngay lp tc th gi phng thc sau: Thu rc s c cp k hn trong phn 10.4

TNG KT CHNG 3
Trong chng ny cc vn sau c trnh by: Mt i tng l s tru tng ho phn mm ca mt i tng vt l hay khi nim trong th gii, . Mt lp l khun mu cho to ra i tng. c bit mt lp nh ngha d liu hay thuc tnh m mt i tng c, v cch c x/dch v m i tng thc hin, cn gi l phng thc/hot ng ca i tng. Mt i tng l th hin ca lp. Lp l kiu ngi dng nh ngha. S dng kiu lit k nh th no

BI TP
1. Trong s cc nhn nh sau, ci no ng, ci no sai: a. i tng l mt thc th c th, tn ti thc t trong cc ng dng. b. i tng l mt th hin c th ca lp. c. Lp l mt khi nim tru tng dng biu din cc i tng. d. Lp l mt s tru tng ho ca i tng. e. Lp v i tng c bn cht ging nhau. f. Tru tng ho i tng theo chc nng to ra cc thuc tnh ca lp. g. Tru tng ho i tng theo chc nng to ra cc phng thc ca lp. h. Tru tng ho i tng theo d liu to ra cc thuc tnh ca lp. i. Tru tng ho i tng theo d liu to ra cc phng thc ca lp. j. K tha cho php hn ch s trng lp m ngun. k. K tha cho php tng kh nng s dng li m ngun. l. ng gi hn ch kh nng truy nhp d liu. m. ng gi hn ch vic phi sa i m ngun. n. a hnh cho php thc hin cng mt thao tc trn nhiu i tng khc nhau.

Bin son : Bi Cng Giao --------------------------------------- 48 --------------------------------------

Chng 3: i tng v lp

2. Trong cc khai bo lp sau, khai bo no l ng: a) class myClass b) Class myClass c) public class MyClass d) Public class MyClass 3. C phi Mu th thch hp cho vic to lp tru tng ho khi nim ny hay khng ? 4. Lit k tt c cc thuc tnh v hnh ng ca i tng Xe t. xut lp Car. 5. Lit k tt c cc thuc tnh v hnh ng ca i tng lp Bus. 6. T hai lp Car v Bus ca 2 bi trn. xut mt lp Engine cho hai lp trn k tha, trnh trng lp d liu gia hai lp Car v Bus. 7. Xy dng thuc tnh ca cc lp sau o Classroom o Departments o Student o Professor Vit chng trnh to i tng ca cc lp trn.

Bin son : Bi Cng Giao --------------------------------------- 49 --------------------------------------

Chng 4: Tng tc gia cc i tng

Chng 4.

Tng tc gia cc i tng

Ni dung chng ny nhm gii thiu: S dng phng thc c t cch hnh x ca i tng. i tng cng b phng thc ca n nh l dch v ti i tng khc v vic yu cu s phc v c thc hin nh th no i tng bo tr v bo m tnh ton vn d liu ca n nh th no thng qua c ch du thng tin Cch to phng thc xy dng khi to i tng ban u

4.1 Cng tc gia cc i tng


Qui trnh pht trin phn mm hng i tng bao gm bn bc c bn: 1. Thit lp ng cc yu cu chc nng v s mnh tng qut ca mt ng dng. 2. Thit lp cc lp thch hp bao gm CTDL, cch c x v mi quan h vi lp khc. 3. To s lng cc th hin i tng t cc lp ny tho mn cc yu cu v s mnh ca ng dng.. 4. Thit lp mi trng hot ng ca i tng sn sng phn ng vi cc s kin kch hot t bn ngoi Xt h thng ng k sinh vin SRS c mi trng hot ng nh sau: Vic click chut vo mt nt (button) trn giao din ca ng dng SRS hm rng sinh vin mun ng k mt kho hc. Nhn thng tin t mt h thng t ng khc nh SRS nhn danh sch sinh vin ng tin t h thng thu cc Ngay khi mt s kin kch hot c nhn bit t h thng hng i tng, cc i tng thch hp phn ng v thc hin cc dch v ca chnh n hay yu cu cc dch v ca cc i tng khc trong dy chuyn phn ng, cho n khi t c mc ch. V d yu cu ng k kho hc ca sinh lin quan n nhiu i tng nh hnh 4.1 Cc i tng trong s tng tc ny: Mt i tng Student (tru tng ho ca mt sinh vin tht) Mt i tng DegreeProgram m bo rng kho hc ng k ph hp vi sinh vin ny. Mt i tng Course m bo cn ch cho sinh vin ng k mn hc ny. Mt i tng Classroom th hin phng hc t chc mn hc v kim tra kh nng cha ca n.

Bin son : Bi Cng Giao --------------------------------------- 50 --------------------------------------

Chng 4: Tng tc gia cc i tng

Mt i tng Transcript m bo ngi sinh vin ny hc cc mn hc cn thit cho mn hc ang ng k. Mt s kin bn ngoi tc ng vo h thng yu cu cc i tng ni chuyn vi nhau Mt Student (sinh vin) Mt DegreeProgram (chng trnh hc)

Click chut trong giao din ng dng

Mt Course (mn hc) Mt Transcript (bn im)

Mt Class (lp hc)

Hnh 4.1 Cc i tng trong h thng phi cng tc vi nhau hon tt s mnh SRS

4.2 Thuc tnh


Khai bo thuc tnh ca lp:
<tnh cht> <kiu d liu> <tn thuc tnh>;

Tnh cht: cc thuc tnh v phng thc ca lp c cc tnh cht c c trng bi cc t kho sau: o public: c th c truy cp t bn ngoi lp nh ngha. o protected: ch c truy cp t lp nh ngha v cc lp k tha t lp . o private: ch c truy cp trong phm vi bn thn lp nh ngha. o khng khai bo: ngm nh l package, ch c truy cp t cng package o static: c dng chung cho mt th hin ca lp, c th c truy cp trc tip bng <tn lp>.<tn thuc tnh> m khng cn khi to mt th hin ca lp. (phn ny c bn k hn trong 5.6) o abstract: nh ngha mt thuc tnh tru tng. Thuc tnh ny khng th truy nhp trong lp nhng c th b nh ngha chng cc lp k tha. o final: mt thuc tnh hng, khng b nh ngha chng cc lp k tha. o native: dng cho phng thc khi ci t ph thuc mi trng trong mt ngn ng khc, nh C hay hp ng.

Bin son : Bi Cng Giao --------------------------------------- 51 --------------------------------------

Chng 4: Tng tc gia cc i tng

o synchronized: dng cho phng thc ti hn, nhm ngn cc tc ng ca cc i tng khc khi phng thc ang c thc hin. Kiu d liu: c th l cc kiu d liu c bn sn c ca Java, c th l cc lp do ngi dng t nh ngha. Tn thuc tnh: c t tn theo quy tc t tn bin ca Java. Thng thng tn thuc tnh t theo kiu camel nh name, studentId, courseLoad. nh ngha lp Person sau c hai thuc tnh name, v age.
class Person { public String name; public int age; }

4.3 Phng thc


4.3.1 Khai bo phng thc
<tnh cht> <kiu tr v> <tn phng thc> ([<cc tham s>]) [throws <cc ngoi l>] { }

Tnh cht: c trng bi cc t kho tng t nh tnh cht ca thuc tnh. Kiu tr v: Kiu d liu tr v ca phng thc, c th l kiu d liu sn c ca Java hoc l kiu do ngi dng t nh ngha. Tn phng thc: tun theo qui tc t tn bin ca Java. Thng thng tn phng thc t theo kiu camel nh registerForCourse, printTranscript. Cc ngoi l: l mt i tng c bit c to ra khi chng trnh gp li. Java s tr li cho chng trnh ngoi l ny theo t kho throws. Cc ngoi l, nu c, c phn cch nhau bi du phy. Cc tham s: cc tham s ca phng thc, c lit k theo cp <kiu tham s> <tn tham s>, cc tham s c phn bit bi du phy. Di y l bng tm tt cch truy cp cho cc thnh vin ca lp (Y l c truy cp) Tnh cht private protected public (khng khai bo) Lp Y Y Y Y Y Y Y Y Y Y Y Lp con Gi Bt k u

Bng 4.1 Phm vi truy cp ca cc thnh vin ca lp

Bin son : Bi Cng Giao --------------------------------------- 52 --------------------------------------

Chng 4: Tng tc gia cc i tng

on lnh sau m t vic khai bo phng thc show() hin th thng tin c nhn ca lp Person.
class Person { public String name; public int age; public void show() { System.out.println( name + is + age + years old!); } }

4.3.2 Bin this


Bin this l mt bin n c bit lun tn ti trong cc lp Java: mt lp c ng mt bin n this. Bin ny c s dng trong khi chy v n tr n bn thn i tng ang th hin lp . Bin this thng c s dng trong cc hm xy dng ca lp. on ln sau khai bo mt lp Person hon ton ging vi lp Person c khai bo trc, nhng ch khc l c dng bin this trong hm xy dng ca lp.
class Person { public String name; public int age; // Phng thc xy dng public Person(String name, int age) { this.name = name; this.age = age; } public void show() { System.out.println( name + is + age + years old!); } }

Ta ch n hm xy dng ca lp, hm ny c hai bin cc b l name v age, trng vi cc bin ca lp. Do , trong phm vi hm ny, bin this.name v this.age s ch cc bin ca lp, cn cc bin name v age s ch cc bin cc b ca hm.

4.3.3 Gi phng thc


Chng trnh PersonDemo minh ho cch dng lp Person m chng ta va nh ngha. Chng trnh ny s to ra mt i tng myPerson ca lp Person vi cc thuc tnh c gi tr khi to: name = Minh v age = 21. Sau , chng trnh s dng phng thc show() ca i tng myPerson in ra dng thng bo : Minh is 21 years old!.

Bin son : Bi Cng Giao --------------------------------------- 53 --------------------------------------

Chng 4: Tng tc gia cc i tng package chuong4; class PersonDemo { public static void main(String args[]) { Person myPerson = new Person(Minh, 21); myPerson.show(); } }

4.3.4 Np chng phng thc


Java cho php trong cng mt lp, c th khai bo nhiu phng thc c cng tn nhng khc nhau v tnh cht; khi ta gi y l np chng (overloading) phng thc. Xt chi tit hn th cc phng thc ny: Hoc danh sch cc tham s khc nhau Hoc kiu tr v khc nhau Hoc kt hp hai iu kin trn. Nu khng, Java s khng phn bit c chng. V d nu trong cng mt lp:
// hp l public int add(int x, int y){} public float add(float x, int y){} // khng hp l public int add(int x, int y){} public int add(int x, int y){}

4.3.5 Phng thc xy dng


Phng thc xy dng (constructor) ca lp c dng khi to mt th hin c th ca mt lp, ngha l gn cc gi tr khi u cho cc thuc tnh, nu c, v to ra mt i tng c th. Lu : Phng thc xy dng phi c tn trng vi tn ca lp Phng thc xy dng khng c gi tr tr v Phng thc xy dng c tnh cht public hoc package (khng khai bo kiu truy nhp) C th c nhiu phng thc xy dng ca cng mt lp Chng trnh sau minh ho hai phng thc xy dng ca lp Person
package chuong4; class Person { public String name;

Bin son : Bi Cng Giao --------------------------------------- 54 --------------------------------------

Chng 4: Tng tc gia cc i tng public int age; // Phng thc xy dng khng tham s public Person() { name = ; age = 0; } // Phng thc xy dng c hai tham s public Person(String name, int age) { this.name = name; this.age = age; } public void show() { if (name.equals()) System.out.println( name is empty); else System.out.println( name + is + age + years old!); } } public class TestPerson { public static void main( String args[]) { // gi phng thc xy dng khng tham s Person p1 = new Person(); p1.show(); // gi phng thc xy dng c tham s Person p2 = new Person(Tam, 31 ); p2.show(); } }

Kt qu chng trnh: name is empty Tam is 31 years old!

Bin son : Bi Cng Giao --------------------------------------- 55 --------------------------------------

Chng 4: Tng tc gia cc i tng

4.3.6 Che du thng tin


Lp che du thng tin ca n bn ngoi khng th thy bng tnh cht private cho thuc tnh v phng thc. V d nh ngha lp Student sau :
public class Student { // vi thuc tnh private String name; private String ssn; private double totalLoans, tuitionOwed; public void printStudentInfo() { // Truy xut thuc tnh ca lp Student System.out.println("Name: " + name); System.out.println("Student ID: " + ssn); } public boolean allBillsPaid() { boolean answer = false; // Truy xut phng thc ca lp Student double amt = moneyOwed(); if (amt == 0.0) answer = true; else answer = false; return answer; } private double moneyOwed() { return totalLoans + tuitionOwed; } }

Trong nh ngha lp Student, hai thuc tnh name, ssn v phng thc moneyOwed ch c thy bn trong lp cn phng thc allBillsPaid c th c thy t bn ngoi cung cp cch truy nhp thuc tnh loi private t bn ngoi lp, cp phng thc get/set c ngh nh sau:
public class Student { private String name; // Bn ngoi dng phng thc c (get) gi tr thuc tnh name

Bin son : Bi Cng Giao --------------------------------------- 56 --------------------------------------

Chng 4: Tng tc gia cc i tng public String getName() { return name; } // Bn ngoi dng phng thc ghi (set) gi tr thuc tnh name public void setName(String newName) { name = newName; } //. } public class TestStudent { public static void main( String args[]) { Student s = new Student (); s.setName(Huong); System.out.println( Name : + s.getName(); } }

4.4 Truyn thng ip gia cc i tng


Chng ta xt mt v d truyn thng ip gia hai i tng c kiu nh ngha l Student v Course v cc phng thc sau. Vi lp Student
boolean successfullyCompleted(Course c)

Cho mt i tng c kiu Course, ta yu cu i tng kiu Student nhn thng ip ny v xc nhn sinh vin ny hon tt mn hc v nhn mt im u. Vi lp Course:
boolean register(Student s)

Cho mt tham chiu s ti mt i tng Student, ta yu cu i tng Course nhn thng ip lm bt c iu g cn thit xem xt s ng k hc ca sinh vin s. Ta mong ch Course tr v true hay false bo hiu ng k thnh cng hay tht bi. Hnh 4.2 phn nh trao i thng ip gia mt i tng c kiu Course v mt i tng s kiu Student. ng mi tn lin tc th hin thng ip c truyn thng qua li triu hi phng thc; ng mi tn t qung th hin gi tr tr v t phng thc. Cc bc th t trong s c din gii nh sau 1. i tng c kiu Course nhn mt thng ip
c.register(s);

Bin son : Bi Cng Giao --------------------------------------- 57 --------------------------------------

Chng 4: Tng tc gia cc i tng

vi s l mt i tng Student. i tng c quyt nh chnh thc liu s nn hay khng nn cho php c ng k, c gi thng ip s.successfullyCompleted(c2) ti s vi c2 th hin mt tham chiu ti mt i tng khc c kiu Course m l mn hc cn hc trc c. Lu c th khng c hay c mt hay nhiu c2 nh vy. 2. s tr li cho c l true ch rng s hon tt c2. 3. c thuyt phc rng s p ng iu kin cn cho kho hc, c hon tt cng vic ng k cho sinh vin s bng cch gi gi tr true ti ni yu cu phc v.

Hnh 4.2 Thng ip c truyn qua li gia cc i tng Course v Student V d ny tng i n gin; trong thc t c phi ni chuyn vi cc i tng khc nh: Mt i tng Classroom (phng m t chc mn hc ny chc chn rng cn ch cho sinh vin s) Mt i tng DegreeProgram ( m bo rng kho hc ng k ph hp vi sinh vin s)
c.register(s)

i tng c (mt Course)


true

Hnh 4.3 Ngi yu cu ch thy chi tit bn ngoi ca vic trao i thng ip. S u nhim

Bin son : Bi Cng Giao --------------------------------------- 58 --------------------------------------

Chng 4: Tng tc gia cc i tng

Nu c yu cu ti i tng A lm g v n phin n, A yu cu s tr gip t mt i tng khc l B th vic ny gi l s u nhim (delegation) bi A ti B. S u nhim xy ra gia cc i tng th thng thng trong sut vi i tng c yu cu u tin. Xt v d trc, i tng c kiu Course u nhim mt phn cng vic ng k kho hc ca i tng s kiu Student cho s khi c yu cu s kim tra xem hon tt cc kho hc bt buc hay khng. T gc nhn ca ngi pht ra yu cu ng k ban u c.register(s);iu ny dng nh l mt tng tc gin n, ngha l ngi yu cu i hi c ng k mt sinh vin v n thc hin iu ny! Tt c cng vic chi tit m c thc hin th b che y vi ngi yu cu (xem hnh 4.3).

TNG KT CHNG 4
Trong chng ny cc vn sau c trnh by: Cch to v s dng phng thc nh th no. Cc i tng thng cng tc vi nhau thc hin mt chc nng h thng nh ng k mn hc cho sinh vin. i tng A c th lin lc vi i tng B nu A c tham chiu ti B. Cc lp che du c tnh ca chng nh th no. To phng thc truy xut get/set cung cp vic truy xut cc thuc tnh private ca i tng. Cch to phng thc xy dng Np chng cho php to nhiu phng thc cng tn v cch to cc hm xy dng khc nhau.

BI TP
1. Cho lp Book c cc thuc tnh sau:
Author author; String title; int noOfPages; boolean fiction;

vit cc phng thc get/set cho mi thuc tnh ny v bin dch lp Book trn. 2. Cho on m chng trnh nh sau:
Student s; Professor p; boolean b; String x = "Math"; s.setMajor(x); if (!s.hasAdvisor())

Bin son : Bi Cng Giao --------------------------------------- 59 --------------------------------------

Chng 4: Tng tc gia cc i tng b = s.designateAdvisor(p);

c tnh -thuc tnh v phng thc- no c hm cho lp Student v Professor qua on lnh trn? Hy xc nh Kh nng truy cp ca tng c tnh Cc c tnh c khai bo nh th no 3. M rng lp Student v Professor trong bi tp 6 ca chng 3 nh sau:

Bao gm phng thc get/set cho mi thuc tnh. C cc phng thc xy dng cho mi lp. To phng thc
public void printAllAttributes() hin th tt c thuc tnh nh sau Student Name: John Smith Student ID: 123-45-6789

Ri thay i phng thc main ca s dng phng thc xy dng cho tng kiu i tng. 4. on lnh sau y c g sai:
public class Building { private String address; public int numberOfFloors; void GetnumberOfFloors() { return numberOfFloors; } private void SetNoOfFloors(float n) { NumberOfFloors = n; } public void display() { System.out.println("Address: " + address); System.out.println("No. of Floors: " + numberOfFloors); }

Bin son : Bi Cng Giao --------------------------------------- 60 --------------------------------------

Chng 5: Quan h gia cc i tng

Chng 5.

Quan h gia cc i tng

Ni dung chng ny nhm gii thiu: Cc loi quan h khc nhau gia cc lp xc nh cc i tng lin kt nh th no trong thi gian chy chng trnh. Tnh tha k gip to lp mi bng cch nu cc c im khc so vi lp c sn. Cc qui lut cho nhng g c th v khng th lm khi to cc lp con qua tnh tha k. Cc phng thc xy dng c to nh th n Kh nng truy xut cc c trng qua tnh tha k.

5.1 Kt hp v lin kt
Quan h gia cc lp l s kt hp (association).Trong h thng SRS c vi kt hp: Lp Student c quan h ng k hc vi lp Course. Lp Professor c quan h dy vi lp Course. Lp DegreeProgram c quan h bao gm vi lp Course. Mt lin kt (link) l quan h gia hai hay nhiu i tng. Xt quan h mt Student ng k mt Course, ta c cc lin kt sau: Tm (mt i tng loi Student) ng k mn Mng my tnh (mt i tng loi Course). Sn (mt i tng loi Student) ng k mn Lp trnh Agent (mt i tng loi Course). H (mt i tng loi Student) ng k mn Mng my tnh (mt i tng loi Course ging nh i tng m Tm ng k hc). Nh vy ta c th tm tt nh sau: Mt kt hp l mt quan h tim nng gia cc i tng ca cc lp. Mt lin kt l quan h thc s gia cc i tng ca cc lp. Hu ht kt hp l gia hai lp khc nhau, gi l kt hp hai ngi (binary association). Mt kt hp mt ngi (unary association) l gia cc th hin ca cng mt lp, v d Mt Course l mn hc bt buc phi hon tt trc mt Course khc. Mt Person c quan h v/chng vi mt Person khc. Kt hp c s ngi cao hn c th xy ra nh kt hp ba ngi (ternary association) bao gm ba lp. V d nh: mt Student hc mt Course c dy bi mt Professor (hnh 5.1).

Bin son : Bi Cng Giao --------------------------------------- 61 --------------------------------------

Chng 5: Quan h gia cc i tng

Ta c th phn r kt hp c nhiu ngi thnh nhiu kt hp hai ngi. V d ta th hin kt hp ba ngi hnh 5.1 thnh cc kt hp hai ngi nh sau (hnh 5.2): Student tham d Course. Professor ging dy Course. Professor dy Student.

Hnh 5.1 Kt hp ba ngi Student

dy

tham d

Professor

ging dy

Course

Hnh 5.2 Mt th hin tng ng bng ba kt hp hai ngi S lin kt (multiplicity) Cho mt kt hp gia A v B, s lin kt hm s i tng kiu A c th kt hp vi mt i tng kiu B. C ba loi s lin kt: mt-mt, mt-nhiu v nhiu-nhiu. Cc v d sau minh ho loi lin kt: Mt i tng Student ch c mt i tng Transcript, y l lin kt mt-mt. Mt i tng Professor c th hng dn nhiu Student, nhng mt i tng Student ch c mt Professor hng dn, y l lin kt mt-nhiu. Mt i tng Student tham d nhiu Course, mt Course dy cho nhiu Student, y l lin kt nhiu-nhiu

Bin son : Bi Cng Giao --------------------------------------- 62 --------------------------------------

Chng 5: Quan h gia cc i tng

Ngoi quan h lin kt, gia cc lp cn c cc dng quan h c bn nh sau: Khi qut ha (Generalization): mi quan h gia mt lp c cc c trng mang tnh khi qut cao hn v mt lp c tnh cht c bit hn. Mi quan h khi qut ha chnh l s k tha ca mt lp t lp khc. V d lp Person c khi qut ho cao hn lp Student v Employee, ngc li hai lp Student v Employee c tnh cht c bit hn lp Person. Quan h cng hp (Aggregation): dng quan h m t mt lp A l mt phn ca lp B v lp A c th tn ti c lp. V d lp Student l mt phn ca lp Class v lp Student c th tn ti c lp. Quan h gp (Composition): biu din mt quan h kiu tng th-b phn. Lp A c quan h gp vi lp B nu lp A l mt phn ca lp B v s tn ti ca i tng lp B iu khin s tn ti ca i tng lp A. V d lp Country l tng th v lp Province l b phn. Lp Province l mt phn ca lp Country. Quan h ph thuc (Dependency): mi quan h ph thuc gia hai lp i tng: mt lp i tng A c tnh c lp v mt lp i tng B ph thuc vo A; mt s thay i ca A s nh hng n lp ph thuc B. V d mt i tng ca lp Order (ho n) ph thuc vo i tng DiscountPolicy (Chnh sch chit khu).

5.2 K tha
S k tha c s dng khi mun to mt lp mi t mt lp bit. Khi , tt c cc thuc tnh v phng thc ca lp c u tr thnh thuc tnh v phng thc ca lp mi. Lp c c gi l lp cha, lp mi c gi l lp con. Khai bo lp k tha
<thuc tnh> <tn lp con> extends <tn lp cha> { .. }

on lnh sau minh ho vic to mt lp Employee c k tha t lp Person c xy dng.


classs Employee extends Person { public float salary; // Phng thc xy dng public Employee(String name, int age, float salary) { super(name, age); this.salary = salary; } }

Bin son : Bi Cng Giao --------------------------------------- 63 --------------------------------------

Chng 5: Quan h gia cc i tng

Khi , on chng trnh ca chng trnh EmployeeDemo1 vn in ra dng thng bo Minh is 21 years old! v khi i tng myEmployee gi n phng thc show() c k tha t lp Person.
package chuong4; class EmployeeDemo1 { public static void main(String args[]) { Employee myEmployee = new Employee(Minh, 21, 300f); myEmployee.show(); } }

Quy tc truy nhp trong k tha Cc quy tc ny quy nh kh nng truy nhp ca lp con i vi cc thuc tnh v phng thc ca lp cha: private: ch c truy nhp trong phm vi lp cha, lp con khng truy nhp c. Tt c cc lp ngoi lp cha u khng truy nhp c. protected: lp con c th truy nhp c. Tt c cc lp khng k tha t lp cha u khng truy nhp c. final: lp con c th s dng nhng khng th khai bo ghi c (ch ng vi phng thc). public: lp con c th s dng v np chng c. Tt c cc lp bn ngoi u s dng c.

5.3 a hnh
a hnh l vic triu gi n cc phng thc np chng ca i tng ( hc ti phn IV ca chng 4). Khi mt phng thc np chng c gi, chng trnh s da vo kiu cc tham s v kiu tr v gi phng thc ca i tng cho ph hp. Chng trnh Operator minh ho vic khai bo nhiu hm add() cng hai s hoc cng hai chui k t.
package chuong5; public class Operator { // Cng hai s nguyn public int add(int x, int y) { return (x + y); }

Bin son : Bi Cng Giao --------------------------------------- 64 --------------------------------------

Chng 5: Quan h gia cc i tng // Cng hai s thc public float add(float x, float y) { return (x + y); } // Cng hai chui k t public String add(String a, String b) { return (a + b); } public static void main(String args[]) { Operator myOperator = new Operator(); System.out.println(The (5+19) is + myOperator.add(5, 19)); System.out.println(The (\ab\ + \cd\) is \ + myOperator.add(ab, cd) + \); } }

Chng trnh s hin th ra hai dng thng bo: The (5+19) is 24 The (ab + cd) is abcd Trong lp Operator c hai phng thc cng tn v cng c hai tham s u vo l add(). Khi chng trnh thc thi lnh myOperator.add(5, 19), chng trnh s t i chiu cc kiu tham s, thy 5 v 19 c dng gn vi kiu int nht, nn phng thc add(int, int) s c gi v tr v gi tr l 24. Khi chng trnh thc thi lnh myOperator.add(ab, cd), chng trnh s t i chiu cc kiu tham s, thy ab v cd c dng gn vi kiu String nht, nn phng thc add(String, String) s c gi v tr v gi tr l abcd. Lu : Khi gi hm vi cc kiu d liu khc vi cc hm c khai bo, s c s chuyn i kiu ngm nh din ra. Khi khng th thc hin chuyn i kiu ngm nh, Java s pht sinh mt thng bo li. Chng hn, trong chng trnh Operator, nu ta thc thi lnh myOperator.add(4.0f, 5) c dng add(float, int), chng trnh s chuyn ngm nh s nguyn 5 thnh float (chuyn t kiu int sang float thuc din ni rng kiu, l kiu chuyn ngm nh

Bin son : Bi Cng Giao --------------------------------------- 65 --------------------------------------

Chng 5: Quan h gia cc i tng

trong Java) c th s dng dng c khai bo add(float, float) v kt qu s l 9.0f. Nu ta thc thi lnh myOperator.add(ab, 5) c dng add(String, int), v int khng th chuyn ngm nh thnh String nn lnh ny s pht sinh li. trnh li ny, phi chuyn i kiu tng minh cho s 5 thnh kiu String bng mt trong cc cch sau:
myOperator.add(ab, (new Int(5)).toString()); myOperator.add(ab, 5 + );

Java s dng kt ni sau (late-binding) h tr tnh a hnh. Ngha l quyt nh phng thc no c gi s b tr hon cho ti lc chy. Tnh cht ny l ghi (overriding) phng thc. Ghi phng thc Phng thc ca lp con c cng tn v c im nh phng thc ca lp cha ( c cng danh sch tham s v c cng kiu tr v). Khi phng thc ghi c triu hi t lp con, ta lun c phin bn phng thc lp con c thc hin. Xt chng trnh Override sau:
package chuong5; class A { int i, j; A(int a, int b) { i = a; j = b; } // hin th i v j void show() { System.out.println("i and j: " + i + " " + j); } } class B extends A { int k; B(int a, int b, int c) { super(a, b); k = c; }

Bin son : Bi Cng Giao --------------------------------------- 66 --------------------------------------

Chng 5: Quan h gia cc i tng // hin th k phng thc ny ghi show() ca A void show() { System.out.println("k: " + k); } } public class Override { public static void main(String args[]) { B subOb = new B(1, 2, 3); subOb.show(); // this calls show() in B } }

Kt qu chng trnh: k: 3 Ghi phng thc xy dng Trong phn 4.3.5 ta xem xt phng thc xy dng; trong chng ny do tnh cht k tha m phng thc xy dng c thm cc c tnh sau: Khi mt lp con dn xut t lp cha, nu lp con khng c phng thc xy dng nhng lp cha c phng thc xy dng khng tham s th phng thc xy dng ny s c gi. V d:
package chuong5; class LopCha { LopCha() { System.out.println("Khi to lp cha"); } } class LopCon extends LopCha { } public class TestConstruction1 { public static void main(String args[]) {

Bin son : Bi Cng Giao --------------------------------------- 67 --------------------------------------

Chng 5: Quan h gia cc i tng LopCon c = new LopCon(); } }

Kt qu chng trnh: Khi to lp cha Nu lp con c phng thc xy dng v trong phng thc ny n s dng phng thc xy dng ca lp cha th lnh super c s dng. V d:
package chuong5; class LopCha { LopCha() { System.out.println("Khi to lp cha"); } } class LopCon extends LopCha { LopCon() { super(); System.out.println("Khi to lp con"); } } public class TestConstruction2 { public static void main(String args[]) { LopCon c = new LopCon(); } }

Kt qu chng trnh: Khi to lp cha Khi to lp con

Bin son : Bi Cng Giao --------------------------------------- 68 --------------------------------------

Chng 5: Quan h gia cc i tng

Lu : super phi l lnh u tin ca phng thc xy dng lp con. Nu lp cha ch c mt phng thc xy dng c tham s v lp con s dng li phng thc xy dng ny bng lnh super th phi truyn cho n ng tham s, nu khng s c li. V d:
package chuong5; class LopCha { LopCha( int i) { System.out.println("Gi tri i : +i); } } class LopCon extends LopCha { LopCon() { super(); System.out.println("Khi to lp con"); } } public class TestConstruction3 { public static void main(String args[]) { LopCon c = new LopCon(); } }

Chng trnh s c li ti lnh super() v ta phi iu chnh chng trnh nh sau:


package chuong5; class LopCha { LopCha( int i) { System.out.println("Gi tri i : +i); } } class LopCon extends LopCha {

Bin son : Bi Cng Giao --------------------------------------- 69 --------------------------------------

Chng 5: Quan h gia cc i tng LopCon() { super(3); System.out.println("Khi to lp con"); } } public class TestConstruction3 { public static void main(String args[]) { LopCon c = new LopCon(); } }

Kt qu chng trnh: Gi tr i : 3 Khi to lp con Nu lp cha c phng thc xy dng khng tham s v phng thc xy dng c tham s th lp con mc nh s dng phng thc xy dng khng tham s vi lnh super(). Nu mun phng thc xy dng c tham s th phi truyn cho n ng tham s mt cch tng minh trong lp con nh v d TestConstruction3.

5.4 Lp tru tng


Lp tru tng l mt dng lp c bit, trong c phng thc ch c khai bo dng khun mu (template) m khng c ci t chi tit. Vic ci t chi tit cc phng thc ch c thc hin cc lp con k tha lp tru tng . Lp tru tng c s dng khi mun nh ngha mt lp m khng th bit v nh ngha ngay c vi phng thc ca n.

Bin son : Bi Cng Giao --------------------------------------- 70 --------------------------------------

Chng 5: Quan h gia cc i tng

Khai bo lp tru tng Lp tru tng c khi bo nh cch khai bo cc lp thng thng, ngoi tr c thm t kho abstract trong phn tnh cht:
[public] abstract class <Tn lp> { . }

Tnh cht: mc nh l public. Tn lp: tun th theo quy tc t tn lp thng thng ca Java. Lu : Lp tru tng cng c th k tha mt lp khc, nhng lp cha cng phi l mt lp tru tng. (Khai bo k tha thng qua t kho extends nh khai bo k tha thng thng). Khai bo phng thc ca lp tru tng
[public] abstract <kiu d liu tr v> <Tn phng thc> ([<cc tham s>]) [throws <cc ngoi l>];

Tnh cht: tnh cht ca mt phng thc tru tng ca lp tru tng lun l public. Nu khng khai bo tng minh th gi tr mc nh cng l public. Kiu d liu tr v: c th l cc kiu c bn ca Java, cng c th l kiu do ngi dng t nh ngha (kiu i tng). Tn phng thc: tun th theo quy tc t tn phng thc ca lp Cc tham s: nu c th mi tham s c xc nh bng mt cp <kiu tham s> <tn tham s>. Cc tham s c phn cch nhau bi du phy. Cc ngoi l: nu c th mi ngoi l c phn cch nhau bi du phy. Lu : Tnh cht ca phng thc tru tng khng c l private hay static. V phng thc tru tng ch c khai bo chi tit (np chng) trong cc lp dn xut (lp k tha) ca lp tru tng. Do , nu phng thc l private th khng th np chng, nu phng thc l static th khng th thay i trong lp dn xut. Phng thc tru tng ch c khai bo di dng khun mu nn khng c cp du { } v kt thc bng du ; on lnh sau khai bo hai phng thc ca lp tru tng Animal: Phng thc getName() tr v tn loi ng vt, d cha bit tn c th loi no nhng kiu tr v l String. Phng thc getFeet() tr v s chn ca loi ng vt, cng cha bit c th l bao nhiu chn nhng kiu tr v l int.
abstract class Animal { abstract String getName(); abstract int getFeet();

Bin son : Bi Cng Giao --------------------------------------- 71 --------------------------------------

Chng 5: Quan h gia cc i tng public void show() { System.out.println(Show me); } }

S dng lp tru tng Lp tru tng c s dng thng qua cc lp dn xut ca n. V ch c cc lp dn xut mi ci t c th cc phng thc c khai bo trong lp tru tng. on lnh sau khai bo lp v lp Bird k tha t lp Animal. Lp Bird ci t chi tit hai phng thc c khai bo trong lp Animal: phng thc getName() s tr v tn loi l Bird; phng thc getFeet() tr v s chn ca loi chim l 2.
public class Bird extends Animal { // Tr v tn loi chim public String getName() { return Bird; } // Tr v s chn ca loi chim public int getFeet() { return 2; } }

on lnh sau khai bo lp Cat cng k tha t lp Animal. Lp ny ci t chi tit hai phng thc c khai bo trong lp Animal: phng thc getName() s tr v tn loi l Cat; phng thc getFeet() tr v s chn ca loi mo l 4.
public class Cat extends Animal { // Tr v tn loi mo public String getName() { return Cat; } // Tr v s chn ca loi mo public int getFeet() { return 4; }

Bin son : Bi Cng Giao --------------------------------------- 72 --------------------------------------

Chng 5: Quan h gia cc i tng }

Chng trnh AnimalDemo s dng li hai lp Bird v Cat nh ngha.


package chuong5; public class AnimalDemo { public static void main(String args[]) { Bird myBird = new Bird(); System.out.println(The + myBird.getName() + has + myBird.getFeet() + feets); Cat myCat = new Cat(); System.out.println(The + myCat.getName() + has + myCat.getFeet() + feets); } }

Chng trnh ny s hin th hai dng thng bo: The Bird has 2 feets The Cat has 4 feets

5.5 Giao tip


Nhm trnh nhng nhp nhng ca tnh cht a k tha ca C++, Java khng cho php k tha trc tip t nhiu hn mt lp cha. Ngha l Java khng cho php a k tha trc tip, nhng cho php ci t nhiu giao tip (Interface) c th tha hng thm cc thuc tnh v phng thc ca cc giao tip . Khai bo giao tip
[public] interface <Tn giao tip> [extends <danh sch giao tip>] { }

Tnh cht: tnh cht ca mt giao tip lun l public. Nu khng khai bo tng minh th gi tr mc nh cng l public. Tn giao tip: tun th theo quy tc t tn bin ca java. Danh sch cc giao tip: danh sch cc giao tip cha c nh ngha k tha, cc giao tip cha c phn cch nhau bi du phy. (Phn trong ngoc vung [ ] l tu chn).

Bin son : Bi Cng Giao --------------------------------------- 73 --------------------------------------

Chng 5: Quan h gia cc i tng

Lu : mt giao tip ch c th k tha t cc giao tip khc m khng th c k tha t cc lp sn c. Khai bo phng thc ca giao tip
[public] <kiu gi tr tr v> <Tn phng thc> ([<cc tham s>]) [throws <danh sch ngoi l>];

Tnh cht: tnh cht ca mt thuc tnh hay phng thc ca giao tip lun l public. Nu khng khai bo tng minh th gi tr mc nh cng l public. i vi thuc tnh, th lun phi thm l hng (final) v tnh (static). Kiu gi tr tr v: c th l cc kiu c bn ca Java, cng c th l kiu do ngi dng t nh ngha (kiu i tng). Tn phng thc: tun th theo quy tc t tn phng thc ca lp Cc tham s: nu c th mi tham s c xc nh bng mt cp <kiu tham s> <tn tham s>. Cc tham s c phn cch nhau bi du phy. Cc ngoi l: nu c th mi ngoi l c phn cch nhau bi du phy. Lu : Cc phng thc ca giao tip ch c khai bo di dng mu m khng c ci t chi tit (c du ; ngay sau khai bo v khng c phn ci t trong du { }). Phn ci t chi tit ca cc phng thc ch c thc hin trong cc lp s dng giao tip . Cc thuc tnh ca giao tip lun c tnh cht l final, static v public. Do , cn gn gi tr khi u ngay khi khai bo thuc tnh ca giao tip. on lnh sau minh ho vic khai bo mt thuc tnh v mt phng thc ca giao tip Product, thuc tnh lu nhn hiu ca nh sn xut sn phm; phng thc dng truy xut gi bn ca sn phm.
public interface Product { public static final String MARK = Adidas; public float getCost(); }

S dng giao tip V giao tip ch c khai bo di dng cc phng thc mu v cc thuc tnh hng nn vic s dng giao tip phi thng qua mt lp c ci t giao tip . Vic khai bo mt lp c ci t giao tip c thc hin thng qua t kho implements nh sau:
<tnh cht> class <tn lp> implements <cc giao tip> { . }

Tnh cht v tn lp c s dng nh trong khai bo lp thng thng.

Bin son : Bi Cng Giao --------------------------------------- 74 --------------------------------------

Chng 5: Quan h gia cc i tng

Cc giao tip: mt lp c th ci t nhiu giao tip. Cc giao tip c phn cch nhau bi du phy. Khi , lp phi ci t c th tt c cc phng thc ca tt c cc giao tip m n s dng. Lu : Mt phng thc c khai bo trong giao tip phi c ci t c th trong lp c ci t giao tip nhng khng c php khai bo chng. Ngha l s lng cc tham s ca phng thc trong giao tip phi c gi nguyn khi ci t c th trong lp. Chng trnh Shoe minh ho vic ci t mt Shoe thc hin giao tip Product vi cc thuc tnh v phng thc c nh ngha.
package chuong5; public class Shoe implements Product { // Ci t phng thc c khai bo trong giao tip public float getCost() { return 10f; } // Phng thc truy nhp nhn hiu sn phm public String getMark() { return MARK; } // Phng thc main public static void main(String args[]) { Shoe myShoe = new Shoe(); System.out.println(This shoe is + myShoe.getMark() + having a cost of $ + myShoe.getCost()); } }

Chng trnh s in ra dng: This shoe is Adidas having a cost of $10. Hm getMark() s tr v nhn hiu ca sn phm, l thuc tnh c khai bo trong giao tip. Hm getCost() l ci t ring ca lp Shoe i vi phng thc c khai bo trong giao tip Product m n s dng, ci t ny tr v gi tr 10 i vi lp Shoe.

Bin son : Bi Cng Giao --------------------------------------- 75 --------------------------------------

Chng 5: Quan h gia cc i tng

5.6 Tnh cht tnh


C nhng trng hp m ta mun tt c cc i tng thuc mt lp chia s mt gi tr ca mt bin c th thay v phi tng i tng duy tr bn sao ca chnh mnh ca bin nh l mt thuc tnh. Ngn ng Java p ng nhu cu ny thng qua cc thuc tnh tnh (static) c lin quan n tt c i tng ca lp hn l vi cc c nhn i tng ring l. Xt nh ngha lp Student sau:
public class Student { private static int totalStudents; // . public int getTotalStudents() { return totalStudents; } public void setTotalStudents(int x) { totalStudents = x; } public int reportTotalEnrollment() { System.out.println("Total Enrollment: " + getTotalStudents()); } public void incrementEnrollment() { setTotalStudents(getTotalStudents() + 1); } }

Khi on lnh sau to cc i tng ca lp Student:


// to ba sinh vin, tng s ghi danh mi ln cho mi sinh vin Student s1 = new Student(); s1.incrementEnrollment(); // ... Student s2 = new Student(); s2.incrementEnrollment(); // ... Student s3 = new Student(); s3.incrementEnrollment();

Bin son : Bi Cng Giao --------------------------------------- 76 --------------------------------------

Chng 5: Quan h gia cc i tng

Mi ln chng ta gi incrementEnrollment i vi mt Student, nhng ngi khc s c hng li, bi v tt c h u chia s gi tr totalStudents. chng minh iu ny, hy yu cu mi i tng Student bo co v tng s ghi danh:
s1.reportTotalEnrollment(); s2.reportTotalEnrollment(); s3.reportTotalEnrollment();

y l kt qu xut ra: Total Enrollment: 3 Total Enrollment: 3 Total Enrollment: 3 Ging nh thuc tnh tnh, phng thc tnh lin quan n tt c i tng ca lp v v bn cht n thuc lp ch khng thuc tng i tng. nh ngha lp Student sau c ba phng thc tnh s dng bin tnh totalStudents getTotalStudents, setTotalStudents, v reportTotalEnrollment:
public class Student { private static int totalStudents; // phng thc xy dng... public Student(...) { // // t ng tng s sinh vin mi ln to mt i tng Student. totalStudents++; } // ba phng thc tnh sau y thuc v bn cht ca lp Student public static int getTotalStudents() { return totalStudents; } public static void setTotalStudents(int x) { totalStudents = x; } public static int reportTotalEnrollment() { System.out.println("Total Enrollment: " + getTotalStudents()); } // }

Bin son : Bi Cng Giao --------------------------------------- 77 --------------------------------------

Chng 5: Quan h gia cc i tng

Ta c th gi cc phng thc tnh ny qua tn lp


Student.reportTotalEnrollment();

Hoc qua tn i tng ca lp


s.reportTotalEnrollment();

v kt qu l ging nhau. Tuy nhin khi s dng phng thc tnh, ta cn ch n im hn ch ca n: phng thc tnh khng c php truy xut n cc c tnh khng tnh (nonstatic) ca lp cha n. Xt v d sau: ta to phng thc tnh print cho lp Student m truy xut n phng thc khng tnh getName.
public class Student { private static int totalStudents; // public static int getTotalStudents() { return totalStudents; } // public static void print() { System.out.println(getName() + " is one of " + getTotalStudents() + "students."); } } }

Trnh bin dch s bo li: non-static method getName() cannot be referenced from a static context L do l c tnh (thuc tnh hay phng thc) khng tnh thuc v i tng ca lp, do chng ch tn ti khi i tng c to ra. Khi phng thc tnh dng c tnh khng tnh th c th c tnh khng tnh cha c.

5.7 Kiu lit k


Kiu lit k (Enumeration) cha mt danh sch cc gi tr nh sn v l min gi tr cho bin hay thuc tnh c bit. Kiu ny do ngi dng nh ngha c dng nh sau:
public enum EnumName { }

Bin son : Bi Cng Giao --------------------------------------- 78 --------------------------------------

Chng 5: Quan h gia cc i tng

Kiu lit k l loi lp n gin bao gm Ch c mt thuc tnh nh value c kiu c bn:
private final type value;

Mt danh sch lit k gi tr c th c cho thuc tnh c biu din theo dng danh sch cc cp tn hnh thc(gi tr) cch nhau bi du ,
symbolicName1(value1), symbolicName2(value2), symbolicNameN(valueN);

Mt phng thc xy dng dng to thuc tnh value c dng:


EnumName(type v) { value = v; }

Nhn xt rng phng thc xy dng ca kiu lit k khng c khai bo l public v n khng c gi t bn ngoi, n ch dng bn trong kiu lit k ny. Mt phng thc truy nhp value() c gi t bn ngoi ly gi tr ca thuc tnh. Kt hp li dng mu tng qut cho vic khai bo mt kiu lit k nh sau:
public enum EnumName { symbolicName1(value1), symbolicName2(value2), symbolicNameN(valueN); private final type value; EnumName(type v) { value = v; } public type value() { return value; } }

Bin son : Bi Cng Giao --------------------------------------- 79 --------------------------------------

Chng 5: Quan h gia cc i tng

Xt mt v d sau: c 5 khoa m sinh vin c th theo hc, tn khoa kiu String:


// Major.java public enum Major { Math(Mathematics), Bio(Biology), Chem(Chemistry), CS(Computer Science), PhysEd(Physical Education); /* Do vy kiu ca thuc tnh value, kiu ca tham s chuyn ti phng thc xy dng Major, v kiu tr v ca phng thc value() tt c l String */ private final String value; Major(String v) { value = v; } public String value() { return value; } }

By gi ta c nh ngha lp Student c s dng kiu lit k trn


public class Student { private String name; private Major major; // public Student(String name, Major major) { this.setName(name); this.setMajor(major); } public void setName(String n) { name = n; } public void setMajor(Major m) { major = m; } //

Bin son : Bi Cng Giao --------------------------------------- 80 --------------------------------------

Chng 5: Quan h gia cc i tng public void display() { // tn dng phng thc value() ca Major System.out.println(name + is a + major.value() + major.); } }

Sau y l chng trnh minh ho cch dng kiu lit k Major:


package chuong5; public class EnumExample { public static void main(String[] args) { /* To i tng Student v dng kiu lit k Major gn mt trong 5 gi tr hp l cho thuc tnh major ca i tng ny, Major.CS hm mt gi tr nh vy */ Student s = new Student(Fred Schnurd, Major.CS); s.display(); } }

Kt qu chng trnh: Fred Schnurd is a Computer Science major. Vi tn hnh thc Major.CS i din cho chui Computer Science. iu ny c c do li gi ti value() trong phng thc display() ca Student. Nu ta thay i display() nh sau:
public void display() { // in ra major trc tip System.out.println(name + is a + major + major.); }

Th tn hnh thc ca kiu lit k Major c in ra Fred Schnurd is a CS major. Lu : ta khng th gn bt k gi tr no khc hn 5 gi tr nh ngha trong kiu lit k Major cho thuc tnh major. Nu vi phm Java s bo li lc bin dch.

Bin son : Bi Cng Giao --------------------------------------- 81 --------------------------------------

Chng 5: Quan h gia cc i tng

Mt v d khc v kiu lit k Grade :


public enum Grade { // cc gi tr l hng s kiu double A(4.0), B(3.0), C(2.0), D(1.0), F(0.0); // thuc tnh value c kiu double. private final double value; Grade(double v) { // tham s kiu double. value = v; } public double value() { // tr v kiu double return value; } }

Chng trnh minh ho cch dng kiu lit k Grade:


public class GradeDemo { public static void main(String[] args) { Grade grade; grade = Grade.A; System.out.println(grade); System.out.println(grade.value()); } }

Kt qu xut ra : A 4.0

Bin son : Bi Cng Giao --------------------------------------- 82 --------------------------------------

Chng 5: Quan h gia cc i tng

5.8 Case Study


Trong phn ny, chng ta s vit mt chng trnh qun l nhn vin ca mt cng ty. Bao gm cc lp chnh: Lp Human l mt lp tru tng, ch c mt phng thc duy nht l show(). Lp Person l lp k tha t lp Human, c hai thuc tnh l name v age. ng gi d liu cc thuc tnh ny c dng private v cc phng thc truy nhp chng (get v set). Ngoi ra lp ny cn ci t phng thc show() k tha t lp tru tng Human. Lp Employee l lp k tha t lp Person, c thm thuc tnh l salary. Thuc tnh ny cng c dng private ng gi d liu v cn cc phng thc truy nhp get/set. Lp ny ci t li phng thc show(). Hn na, lp Employee cn c thm hai phng thc addSalary() v addSalary(float) tnh tng lng cho nhn vin: mt phng thc tng lng theo t l mc nh l 10% (khng cn tham s), v mt phng thc tng theo gi tr c th a vo (cn tham s). Cc phn tip theo s trnh by phn ci t chi tit cho cc lp ny. Lp Human l mt lp tru tng, ch c mt phng thc duy nht l show(). y l ni dung tp tin Human.java.
package chuong5; abstract class Human { abstract void show(); }

Lp Person l lp k tha t lp Human: C hai thuc tnh l name v age c dng private Cc phng thc truy nhp cc thuc tnh name (getName() v setName(String)) v age (getAge() v setAge(int)). Ci t chng phng thc show() k tha t lp tru tng Human. y l ni dung tp tin Person.java.
package chuong5; class Person extends Human { private String name; private int age; // Phng thc xy dng khng c tham s public Person() { super();

Bin son : Bi Cng Giao --------------------------------------- 83 --------------------------------------

Chng 5: Quan h gia cc i tng name = ; age = 0; } // Phng thc xy dng c tham s public Person(String name, int age) { this.name = name; this.age = age; } // Phng thc truy nhp thuc tnh name public String getName() { return name; } public void setName(String name) { this.name = name; } // Phng thc truy nhp thuc tnh age public int getAge() { return age; } public void setAge(int age) { this.age = age; } // Khai bo np chng public void show() { System.out.println( name + is + age + years old!); } }

Lp Employee l lp k tha t lp Person: C thm thuc tnh l salary cng c dng private ng gi d liu v cn cc phng thc truy nhp get/set. Lp ny ci t li phng thc show().

Bin son : Bi Cng Giao --------------------------------------- 84 --------------------------------------

Chng 5: Quan h gia cc i tng

C thm hai phng thc addSalary() v addSalary(float) tnh tng lng cho nhn vin: phng thc addSalary() tng lng theo t l mc nh l 10% (khng cn tham s), phng thc addSalary(float) tng theo gi tr c th a vo (cn tham s). Sau y l ni dung tp tin Employee.java
package chuong5; class Employee extends Person { private float salary; // Phng thc xy dng khng c tham s public Employee() { super(); salary = 0f; } // Phng thc xy dng c tham s public Employee(String name, int age, float salary) { super(name, age); this.salary = salary; } /* Phng thc truy nhp thuc tnh salarry */ public float getSalary() { return salary; } public void setSalary(float salary) { this.salary = salary; } // Khai bo np chng public void show() { System.out.println( getName() + is + getAge() + years old having a salary of $ + salary + /month!); }

Bin son : Bi Cng Giao --------------------------------------- 85 --------------------------------------

Chng 5: Quan h gia cc i tng /* Phng thc tng lng */ public void addSalary() { salary *= 1.1f; } public void addSalary(float addition) { salary += addition; } }

Lu : Trong phng thc np chng show() ca lp Employee, ta phi dng cc phng thc public c k tha t lp Person l getName() v getAge() truy nhp n thuc tnh name v age m khng th truy xut trc tip. Chng trnh CaseStudy5 cha hm main chy minh ho vic s dng cc lp Person v Employee. y l ni dung ca tp tin CaseStudy5.java
package chuong5; public class CaseStudy5 { public static void main(String args[]) { // S dng lp Person Person myPerson = new Person(Vinh, 25); myPerson.show(); // S dng lp Employee Employee myEmployee = new Employee(Sn, 25, 300f); myEmployee.show(); // Tng lng theo mc nh myEmployee.addSalary(); myEmployee.show(); // Tng lng ln $50 myEmployee.addSalary(50f); myEmployee.show(); } }

Bin son : Bi Cng Giao --------------------------------------- 86 --------------------------------------

Chng 5: Quan h gia cc i tng

Chng trnh s hin th ni dung nh sau: Vinh is 25 years old!


Sn is 25 years old having a salary of $300/month! Sn is 25 years old having a salary of $330/month! Sn is 25 years old having a salary of $380/month!

Dng th nht in ra dng thng bo theo phng thc show() ca lp Person. Dng th hai cng hin th thng bo theo phng thc show() ca lp Employee c khai bo np chng. Dng th ba hin th thng bo sau khi tng lng theo mc nh (10%) t 300$ ln 330$. Dng th t hin th thng bo sau khi tng lng thm mt ln na vi lng tng l 50$ t 330$ ln 380$.

TNG KT CHNG 5
Trong chng ny cc vn sau c trnh by: Mt s kt hp m t mi quan h gia cc lp, ngha l mi quan h tim nng gia cc i tng ca hai lp, trong khi mt lin kt m t mt quan h thc s gia hai i tng ca cc lp . Xt s kt hp gia lp X v Y, multiplicity l l s i tng kiu X lin kt ti mt i tng kiu Y v ngc li; c th l 1:1, 1:m, v m:m. Trong tt c trng hp s tham gia ca i tng hai u mi quan h c th l tu thch hoc bt buc. Nh th no to lp mi t lp ang c qua tnh tha k, v iu g nn v khng nn khi to lp mi. Hn na chng ta c th m rng lp cha v chuyn bit n bng vic thm vo cc c trng hay ghi phng thc. S phn cp lp pht trin theo thi gian nh th no, v iu g ta c th lm trnh cc hiu ng xu ti ng dng khi s phn cp lp thay i theo yu cu thc t. Vi iu phc tp ca hm xy dng lin quan ti tnh tha k.

Ti sao a tha k c th gy rc ri cho vic din gii ngn ng hng i tng.

BI TP
1. Nu mi quan h? Dc s Toa thuc Toa thuc Thuc 2. Cho cc v d minh ho cc dng quan h c bn. 3. Trong cc khai bo phng thc ca mt lp (khng tru tng) sau, khai bo no l ng:

Bin son : Bi Cng Giao --------------------------------------- 87 --------------------------------------

Chng 5: Quan h gia cc i tng a. String getName{return name;} b. String getName(){return name;} c. String getName(){return name;}; d. String getName();

4. Trong cc khai bo phng thc tru tng ca mt lp tru tng sau, khai bo no l ng:
a. abstract String getName{return name;} b. abstract String getName(){return name;} c. abstract String getName(){return name;}; d. abstract String getName();

5. Trong cc khai bo mt giao tip sau, khai bo no l ng:


a. public abstract MyInterface{} b. public class MyInterface{} c. public interface MyInterface{} d. public interface MyInterface();

6. Trong cc khai bo k tha lp sau, gi s Aclass v Bclass l cc lp c sn, khai bo no l ng:


a. public class MyClass extends Aclass{} b. public class MyClass Extends Aclass{} c. public class MyClass extends Aclass, Bclass{} d. public class MyClass extends Aclass, extends Bclass{}

7. Trong cc khai bo k tha giao tip sau, gi s Ainterface v Binterface l cc giao tip c sn, khai bo no l ng:
a. public interface MyInterface extends Ainterface{} b. public interface MyInterface Extends Ainterface{} c. public interface MyInterface extends Ainterface, Binterface{} d. public interface MyInterface extends Ainterface, extends Binterface{}

8. Trong cc khai bo mt lp s dng giao tip sau, gi s Ainterface v Binterface l cc giao tip c sn, khai bo no l ng:
a. public class MyClass extends Ainterface{} b. public class MyClass implements Ainterface{} c. public class MyClass implements Ainterface, Binterface{} d. public class MyClass implements Ainterface, implements Binterface{}

9. Xt on chng trnh ci t mt lp s dng mt giao tip sau:


public interface MyInterface { public void show(String a); }

Bin son : Bi Cng Giao --------------------------------------- 88 --------------------------------------

Chng 5: Quan h gia cc i tng // Khai bo lp s dng giao tip public class MyClass implements MyInterface { }

10. Khi , lp MyClass ch c duy nht mt phng thc ci t chi tit phng thc show ca giao tip MyInterface. Trong cc cch ci t sau, cch no l ng:
a. public int show(String a){ System.out.println(a);} b. public void show(){ System.out.println(Show!);} c. public void show(String a){ System.out.println(a);} d. public void show(String a, String b){ System.out.println(a+b);}

11. Xt on chng trnh ci t php ton cng vi cc s hng c kiu khc nhau:
public class MyOperator { public static int add(int a, int b) { return a+b; } public static float add(float a, float b) { return a+b; } public static double add(double a, double b) { return a+b; } public static String add(String a, String b) { return a+b; } }

Khi ta gi lnh MyOperator.add(-5, 100), chng trnh s gi phng thc no?


a. add(int, int) b. add(float, float) c. add(double, double) d. add(String, String) e. Thng bo li

12. Cng vi lp MyOperator trong bi 9, khi ta gi lnh MyOperator.add(5.0d, 100f), chng trnh s gi phng thc no?
a. add(int, int) b. add(float, float) c. add(double, double) d. add(String, String)

Bin son : Bi Cng Giao --------------------------------------- 89 --------------------------------------

Chng 5: Quan h gia cc i tng e. Thng bo li

13. Cng vi lp MyOperator trong bi 9, khi ta gi lnh MyOperator.add(abcd, 100f), chng trnh s gi phng thc no?
a. add(int, int) b. add(float, float) c. add(double, double) d. add(String, String) e. Thng bo li

14. V s khc nhau gia lp v giao tip trong Java, nhng nhn nh no sau y l ng: a. Lp c k tha ti a t mt lp khc, giao tip c th k tha t nhiu giao tip khc. b. Lp c th k tha t giao tip, nhng giao tip khng k tha t cc lp. c. Thuc tnh ca lp c th c tnh cht bt k, thuc tnh ca giao tip phi l hng s v tnh. d. Phng thc ca lp c th c ci t chi tit, phng thc ca giao tip ch c khai bo dng khun mu. 15. Xt on chng trnh khai bo hai lp k tha nhau nh sau:
public class Person { public void show() { System.out.println(This is a person!); } }

v:
public class Employee extends Person { public void show(int x) { System.out.println(This is the employee + x); } }

Khi , on chng trnh sau s hin th thng bo no?


public class Demo1 { public static void main(String args[]) { Employee myEmployee = new Employee(); myEmployee.show(); } }

a. This is a person!.

Bin son : Bi Cng Giao --------------------------------------- 90 --------------------------------------

Chng 5: Quan h gia cc i tng

b. This is the employee 0. c. Thng bo li. d. Khng hin th g c. 16. Cng vi hai lp Person v Employee trong bi 13. on chng trnh sau s hin th thng bo no?
public class Demo2 { public static void main(String args[]) { Employee myEmployee = new Employee(); myEmployee.show(10); } }

a. This is a person!. b. This is the employee 10. c. Thng bo li. d. Khng hin th g c. 17. Vit mt chng trnh khai bo mt lp Rectangle. Lp ny c hai thuc tnh cc b l chiu rng v chiu di ca hnh. Vit hai phng thc xy dng tng minh cho lp ny: Mt khi to vi mt tham s kiu int, khi , chiu rng v chiu di c thit lp thnh gi tr tham s a vo (hnh vung). Mt khi to vi hai tham s kiu int tng ng l chiu rng v chiu di. 18. Vit mt giao tip khai bo cc php ton cng hai s, cng hai xu, cng xu v s. Sau vit mt lp ci t giao tip . 19. Vit mt lp tru tng v cc hnh phng, trong khai bo cc phng thc tnh chu vi v din tch ca hnh. Sau vit ba lp k tha t lp tru tng l: lp hnh vung, lp hnh ch nht v lp hnh trn. T thit lp cc thuc tnh cc b cn thit cho mi lp con v khai bo np chng hai phng thc ban u trong mi lp con. 20. Xt bi 3 ca chng 1 hy nu cc mi quan h ca cc lp trong h thng xut. 21. Xt lp FeatureFilm c cc phng thc nh sau:
public void update(Actor a, String title) public void update(Actor a, Actor b, String title) public void update(String topic, String title)

22. Cc phng thc no sau y l hp l ?


public boolean update(String category, String theater) public boolean update(String title, Actor a) public void update(Actor b, Actor a, String title)

Bin son : Bi Cng Giao --------------------------------------- 91 --------------------------------------

Chng 5: Quan h gia cc i tng public void update(Actor a, Actor b)

23. To lp FeatureFilm ca bi trc kim tra cc phng thc. To lp Actor rng nh sau:
public class Actor { }

24. Xc nh phng thc no np chng, ghi ca bn lp sauVehicle, Automobile, Truck, v SportsCar:


public class Vehicle { String name; public void fuel(String fuelType) { // b qua chi tit ... } public boolean fuel(String fuelType, int amount) { // b qua chi tit ... } } public class Automobile extends Vehicle { public void fuel(String fuelType, String timeFueled) { // b qua chi tit ... } public boolean fuel(String fuelType, int amount) { // ... } } public class Truck extends Vehicle { public void fuel(String fuelType) { // ... } } public class SportsCar extends Automobile { public void fuel(String fuelType) { // ... }

Bin son : Bi Cng Giao --------------------------------------- 92 --------------------------------------

Chng 5: Quan h gia cc i tng

public void fuel(String fuelType, String timeFueled) { // ... } }

C bao nhiu phng thc Fuel m bn lp nhn din? Hy lit k chng. 25. Xt cc lp FarmAnimal, Horse, v Cow:
public class FarmAnimal { private String name; public String getName() { return name; } public void setName(String n) { name = n; } public void makeSound() { System.out.println(getName() + " makes a sound ..."); } } public class Cow extends FarmAnimal { public void makeSound() { System.out.println(getName() + " goes Moooooo ..."); } } public class Horse extends FarmAnimal { public void setName(String n) { super.setName(n + " [a Horse]"); } }

on lnh sau s in ra cu g?
Cow c = new Cow(); Horse h = new Horse();

Bin son : Bi Cng Giao --------------------------------------- 93 --------------------------------------

Chng 5: Quan h gia cc i tng c.setName("Elsie"); h.setName("Mr. Ed"); c.makeSound(); h.makeSound();

26. To cc kiu lit k sau Kiu lit k Weekday i din by ngy trong tun c kiu String.

Kiu lit k SolarSystem i din 9 hnh tinh trong h mt tri: Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, v Pluto. h tr kiu lit k ny hy khai bo lp Planet c tnh cht sau: mt thuc tnh kiu String cha tn hnh tinh, mt phng thc xy dng c tn hnh tinh nh tham s v mt phng thc toString tr v chui "Planet: planetName".

Bin son : Bi Cng Giao --------------------------------------- 94 --------------------------------------

Chng 6: Tp i tng

Chng 6.

Tp i tng

Ni dung chng ny nhm gii thiu: Thao tc trn mng Thuc tnh ca ba kiu tp hp thng thng : danh sch c th t, b, t in. Tp hp gip m hnh cc vn rt phc tp trong th gii thc K thut thit k cc kiu tp hp ring

6.1 Khi nim tp i tng


Tp i tng dng tp hp cc i tng c cng tnh cht no qun l chng nh l mt nhm v thao tc trn chng chung vi nhau, v cng c th truy cp n tng i tng khi cn thit. V d: Mt gio s c th lt qua tt c cc i tng sinh vin ng k mt kha hc m gio s ging dy vo im cui k. H thng ng k sinh vin duyt qua tt c i tng kho hc trc khi cho m hay hu kho hc v khng sinh vin ng k Khai bo mt bin tham chiu ti mt kiu tp hp:
CollectionType<elementType> x;

Bin x lc ny cha xc nh. K tip ta dng ton t new triu hi phng thc xy dng ca kiu tp hp .
X = new CollectionType<elementType>();

V d:
ArrayList<Student> x; // ArrayList l mt trong cc kiu tp hp c sn x = new ArrayList<Student>();

6.2 Ba kiu tp i tng c bn


Danh sch c th t (ordered list): kiu tp hp cho php chn cc phn t vo v tr c sp th t v sau truy xut chng theo cng th t . Cc i tng c bit c th truy xut theo v tr ca chng trong danh sch (v d chng c th ly theo th t u tin, cui cng hay th n). Hu ht cc kiu tp hp-bao gm danh sch c th t- khng cn gn kh nng cha lc khi to ban u. Tp hp t ng m rng khi thm vo phn t v khi phn t b ly ra tp hp t ng kht li nh hnh 6.1. Vi lp Java l danh sch c th t nh: ArrayList, LinkedList, Stack,Vector.

Bin son : Bi Cng Giao --------------------------------------- 95 --------------------------------------

Chng 6: Tp i tng

Khi mt phn t b xo t mt tp hp

L trng t ng b bt li Hnh 6.1 Hu ht tp hp t ng co li khi mt phn t b ly ra Mt t in (dictionary), hay mt bn (map), dng lu tng tham chiu i tng cng vi mt kho tm kim duy nht (unique lookup key) ca i tng sau kho ny c dng truy xut nhanh chng i tng ny. Kho thng c to ra da trn mt hay nhiu gi tr thuc tnh ca i tng.V d, m sinh vin l kho ca ca Student v gi tr ny l duy nht cho mi Student (hnh 6.2). Vi lp Java l t in nh HashMap, Hashtable, v TreeMap. Tham chiu

Kho

i tng

Dng kho truy xut chnh xc i tng trong t in

Hnh 6.2 Dng kho truy cp trc tip i tng trong tp hp t in Mt b (set) l mt tp hp khng sp th t, ngha rng khng th truy xut mt phn t ca b bng v tr ca n trong b k t khi n c thm vo. B khng cho php cc phn t ging nhau. V d nu ta to mt b tham chiu cc i tng Student v mt tham chiu ti mt i tng c trong b th mt

Bin son : Bi Cng Giao --------------------------------------- 96 --------------------------------------

Chng 6: Tp i tng

tham chiu th hai ti cng i tng khng th c thm vo b; b s l i yu cu thm ny. Nhng i vi danh sch c th t hay t in ta c th lm iu ny nh hnh 6.3. Vi lp Java l b nh HashSet v TreeSet.

Hnh 6.3 Cc tp hp khng phi l b cho php nhiu tham chiu ti cng mt i tng.

6.3 Mng
Mng l kiu n gin ca danh sch c th t Khai bo mt bin tham chiu ti mt kiu tp hp:
datatype[] x;

v d:
int[] x; // khai bo bin y nh l mt tham chiu ti mt mng lu tr 20 i tng Student Student[] y = new Student[20];

hay
// khai bo mt mng cha 3 gi tr kiu double double[] data = new double[3]; // gn 4.7cho phn t u tin (th zero) data[0] = 4.7; // ly gi tr phn t cui cng double temp = data[2];

Khi to ni dung mng chui


String[] names = { "Steve", "Jacquie", "Chloe", "Shylow", "Baby Grode" };

Mt cch khc (di hn)

Bin son : Bi Cng Giao --------------------------------------- 97 --------------------------------------

Chng 6: Tp i tng String[] names = new String[5]; names[0] = "Steve"; names[1] = "Jacquie"; names[2] = "Chloe"; names[3] = "Shylow"; names[4] = "Baby Grode";

Thao tc trn mng i tng


studentBody[0] = new Student("Fred"); studentBody[1] = new Student("Mary");

hay
Student s = new Student("Fred"); studentBody[0] = s; // s dng li s s = new Student("Mary"); studentBody[1] = s;

ArrayList y l kiu tp hp mng m rng Xt chng trnh ArrayListExample sau:


package 6; import java.util.*; public class ArrayListExample { public static void main(String[] args) { // khi to tp hp students ArrayList<Student> students = new ArrayList<Student>(); // to vi i tng Student Student a = new Student("Herbie"); Student b = new Student("Klem"); Student c = new Student("James"); // lu tham chiu ba Student ny vo trong tp hp students.add(a); students.add(b); students.add(c); // ... duyt tp hp ny in tn sinh vin

Bin son : Bi Cng Giao --------------------------------------- 98 --------------------------------------

Chng 6: Tp i tng for (Student s : students) System.out.println(s.getName()); } }

Kt qu xut ra: Herbie Klem James Chp ni dung ca ArrayList vo mt mng Xt v d to mt ArrayList tn l students v thm vo 3 i tng Student
ArrayList<Student> students = new ArrayList<Student>(); students.add(new Student("Herbie")); students.add(new Student("Klemmie")); students.add(new Student("James"));

K n to mt mng kiu Student c kch thc bng mng students


Student[] copyOfStudents = new Student[students.size()];

chp ni dng students vo copyOfStudents ta gi phng thc toArray trn students


students.toArray(copyOfStudents);

Cui cng ta kim tra ni dung 2 mng xem c ging nhau khng
System.out.println("The ArrayList contains the following students:"); for (Student s : students) System.out.println(s.getName()); System.out.println(); System.out.println("The array contains the following students:"); for (int i = 0; i < copyOfStudents.length; i++) System.out.println(copyOfStudents[i].getName());

Bin son : Bi Cng Giao --------------------------------------- 99 --------------------------------------

Chng 6: Tp i tng

y l kt qu: The ArrayList contains the following students: Herbie Klemmie James The array contains the following students: Herbie Klemmie James

6.4 Cc loi tp i tng thng gp


6.4.1 LinkedList
L mt danh sch m mi phn t c mt lin kt ti phn t k tip. C danh sch lin kt tuyn tnh v danh sch lin kt tuyn tnh quay vng. Danh sch lin kt tuyn tnh kt thc mt m no cn danh sch lin kt tuyn tnh quay vng c phn t cui cng ch ti phn t u tin to mt chu trnh. Chng trnh LinkListDemo sau y minh ho danh sch lin kt:
package chuong6; import java.util.*; public class LinkedListDemo { public static void main(String[] args) { LinkedList link = new LinkedList(); // thm vo 3 phn t khc kiu link.add("a"); link.add("b"); link.add(new Integer(10)); System.out.println("The contents of array is " + link); System.out.println("The size of an linkedlist is " + link.size()); // thm phn t u link.addFirst(new Integer(20)); System.out.println("The contents of array is" + link); System.out.println("The size of an linkedlist is " + link.size());

Bin son : Bi Cng Giao --------------------------------------- 100 --------------------------------------

Chng 6: Tp i tng

// thm phn t cui link.addLast("c"); System.out.println("The contents of array is " + link); System.out.println("The size of an linkedlist is " + link.size()); // thm phn t th ba link.add(2, "j"); System.out.println("The contents of array is " + link); System.out.println("The size of an linkedlist is " + link.size()); // thm phn t th hai link.add(1, "t"); System.out.println("The contents of array is " + link); System.out.println("The size of an linkedlist is " + link.size()); // xo phn t th t link.remove(3); System.out.println("The contents of array is " + link); System.out.println("The size of an linkedlist is " + link.size()); } }

y l kt qu: The contents of array is [a, b, 10] The size of an linkedlist is 3 The contents of array is[20, a, b, 10] The size of an linkedlist is 4 The contents of array is [20, a, b, 10, c] The size of an linkedlist is 5 The contents of array is [20, a, j, b, 10, c] The size of an linkedlist is 6 The contents of array is [20, t, a, j, b, 10, c] The size of an linkedlist is 7 The contents of array is [20, t, a, b, 10, c]

Bin son : Bi Cng Giao --------------------------------------- 101 --------------------------------------

Chng 6: Tp i tng

The size of an linkedlist is 6

6.4.2 HashMap
L kiu tp hp t in, HashMap cho php truy xut trc tip ti mt i tng bng kho duy nht ca n. C hai kho v i tng c th thuc bt c kiu no. Xt chng trnh HashMapExample sau y:
package chuong6; public class Student { private String idNo; private String name; public Student(String i, String n) { idNo = i; name = n; } public String getName() { return name; } public String getIdNo() { return idNo; } } import java.util.HashMap; public class HashMapExample { public static void main(String[] args) { /* khi to tp hp students c kiu HashMap vi String l kiu kho v Student l kiu gi tr */ HashMap<String, Student> students = new HashMap<String, Student>(); // to 3 Student Student s1 = new Student("12345-12", "Fred"); Student s2 = new Student("98765-00", "Barney"); Student s3 = new Student("71024-91", "Wilma"); // chn 3 Student vo students, dng idNo nh kho students.put(s1.getIdNo(), s1);

Bin son : Bi Cng Giao --------------------------------------- 102 --------------------------------------

Chng 6: Tp i tng students.put(s2.getIdNo(), s2); students.put(s3.getIdNo(), s3); // ly Student theo mt ID c bit. String id = "98765-00"; System.out.println("Let's try to retrieve a Student with ID = " + id); Student x = students.get(id); // nu gi tr tr v v bi get khc null th ta tm thy mt Student ... if (x != null) System.out.println("Found! Name = " + x.getName()); else // khng c Student no nh vy System.out.println("Invalid ID: " + id); System.out.println(); // th mt ID khng hp l id = "00000-00"; System.out.println("Let's try to retrieve a Student with ID = " + id); x = students.get(id); if (x != null) System.out.println("Found! Name = " + x.getName()); else System.out.println("Invalid ID: " + id); System.out.println(); System.out.println("Here are all of the students:"); System.out.println(); // duyt HashMap ny x l tt c Student. for (Student s : students.values()) { System.out.println("ID: " + s.getIdNo()); System.out.println("Name: " + s.getName()); System.out.println(); } } }

Bin son : Bi Cng Giao --------------------------------------- 103 --------------------------------------

Chng 6: Tp i tng

Kt qu xut ra: Let's try to retrieve a Student with ID = 98765-00 Found! Name = Barney Let's try to retrieve a Student with ID = 00000-00 Invalid ID: 00000-00 Here are all of the students: ID: 12345-12 Name: Fred ID: 98765-00 Name: Barney ID: 71024-91 Name: Wilma

6.4.3 TreeMap
L kiu tp hp t in khc trong Java. TreeMap tng t nh HashMap, vi mt im khc bit sau: Khi ta duyt qua TreeMap, i tng c truy xut ti theo th t tng dn. Khi ta duyt qua HashMap, khng g m bo rng cc phn t c truy xut theo th t xc nh trc. Xt chng trnh TreeHash sau y:
package chuong6; import java.util.*; public class TreeHash { public static void main(String[] args) { /* khi to 2 tp hp, mt HashMap v mt TreeMap vi String l kiu kho v l kiu i tng */ HashMap<String, String> h = new HashMap<String, String>(); TreeMap<String, String> t = new TreeMap<String, String>(); // chn vi chui vo HashMap, chui chn va l kho va l gi tr h.put("FISH", "FISH"); h.put("DOG", "DOG"); h.put("CAT", "CAT");

Bin son : Bi Cng Giao --------------------------------------- 104 --------------------------------------

Chng 6: Tp i tng h.put("ZEBRA", "ZEBRA"); h.put("RAT", "RAT"); // chn chui ging nh vy theo cng th t vo TreeMap t.put("FISH", "FISH"); t.put("DOG", "DOG"); t.put("CAT", "CAT"); t.put("ZEBRA", "ZEBRA"); t.put("RAT", "RAT"); // duyt qua HashMap ly tt c chui ... System.out.println("Retrieving from the HashMap:"); for (String s : h.values()) System.out.println(s); System.out.println(); // ... v ri duyt qua TreeMap System.out.println("Retrieving from the TreeMap:"); for (String s : t.values()) System.out.println(s); } }

Kt qu xut ra: Retrieving from the HashMap: ZEBRA CAT FISH DOG RAT Retrieving from the TreeMap: CAT DOG FISH RAT

Bin son : Bi Cng Giao --------------------------------------- 105 --------------------------------------

Chng 6: Tp i tng

ZEBRA

6.4.4 HashSet
y l kiu b dng bng bm (hash table) lu tr. Bng bm l CTDL lu thng tin bng vic nh x kho ca tng phn t d liu vo mt v tr hay ch mc ca mng. Chng trnh NamsSet sau y minh ho HashSet:
package chuong6; import java.util.*; public class NamesSet { public static void main(String args[]) { HashSet objSet = new HashSet(); // thm 5 phn t vo bng bm objSet.add("Patrick"); objSet.add("Bill"); objSet.add("Gene"); objSet.add("Daniel"); objSet.add("Claire"); System.out.println("Size of the set : " + objSet.size()); // in cc phn t ca bng bm System.out.println("Contents of the set :"); System.out.println(objSet); System.out.println("\nContents of the set after adding 2 elements :"); objSet.add("Rubio"); objSet.add("Yang Sun"); System.out.println(objSet); System.out.println("Size of the set : " + objSet.size()); } }

Bin son : Bi Cng Giao --------------------------------------- 106 --------------------------------------

Chng 6: Tp i tng

Kt qu xut ra: Contents of the set : [Bill, Gene, Claire, Patrick, Daniel] Size of the set : 5 Contents of the set after adding 2 elements : [Bill, Gene, Claire, Patrick, Yang Sun, Daniel, Rubio] Size of the set : 7

6.4.5 TreeSet
Kiu b dng mt cy (tree) lu d liu. Trong cy cc i tng c sp xp theo th t tng dn v vy truy xut i tng nhanh hn. Chng trnh TreeDemo sau y minh ho TreeSet:
package chuong6; import java.util.*; class TreeDemo { public static void main(String[] args) { TreeSet objTree = new TreeSet(); // thm cc phn t vo cy objTree.add(beta); objTree.add(gama); objTree.add(tera); objTree.add(alpha); objTree.add(penta); System.out.println(Automatically sorted contents of the Tree : \n + objTree); } }

Kt qu xut ra: Automatically sorted contents of the Tree : [alpha, beta, gama, penta, tera]

Bin son : Bi Cng Giao --------------------------------------- 107 --------------------------------------

Chng 6: Tp i tng

6.5 To kiu tp hp
6.5.1 M rng mt lp tp hp c sn
minh ho chng ta m rng lp ArrayList to mt lp tp hp MyIntCollection. Ngoi cc c tnh ArrayList, MyIntCollection c th lu gi gi tr int nh nht v ln nht trong tp hp ca n. Lp MyIntCollection minh ho iu ny.
import java.util.ArrayList; public class MyIntCollection extends ArrayList<Integer> { /* Tha hng tt c thuc tnh v phng thc ca ArrayList v c thm 2 thuc tnh lu gi gi tr int nh nht v ln nht trong tp hp v thuc tnh tng s phn t */ private int smallestInt; private int largestInt; private int total; // Thay th phng thc xy dng public MyIntCollection() { super(); // khi to total. total = 0; } // Ghi phng thc add() t ArrayList. public boolean add(int i) { // Nu ln u thm phn t th phi gn i cho smallest v largest if (this.isEmpty()) { smallestInt = i; largestInt = i; } else { // cc ln thm sau phi xc nh li smallest v largest if (i < smallestInt) smallestInt = i; if (i > largestInt) largestInt = i; } // tng total cho vic thm phn t total+=i;

Bin son : Bi Cng Giao --------------------------------------- 108 --------------------------------------

Chng 6: Tp i tng /* Chn gi tr i vo tp hp, ta khng cn bit chn nh th no do ta gi phng thc add ca ArrayList */ return super.add(i); } public int getSmallestInt() { return smallestInt; } public int getLargestInt() { return largestInt; } public double getAverage() { // p kiu int thnh double trnh vic thu hp gi tr khi chia return ((double) total) / ((double) this.size()); } }

6.5.2 Bao bc tp hp chun


Chng ta thit k mt lp bao bc mt th hin ca ArrarList. Lp MyIntCollection2 minh ho iu ny.
import java.util.ArrayList; // Khng cn m rng lp ArrayList public class MyIntCollection2 { // bao bc mt ArrayList trong lp ny. ArrayList<Integer> numbers; // nh ngha vi thuc tnh nh MyIntCollection private int smallestInt; private int largestInt; private int total; public MyIntCollection2() { // Khi to mt ArrayList nhng vo lp. numbers = new ArrayList<Integer>(); // gn gi tr khi u cho total. total = 0; }

Bin son : Bi Cng Giao --------------------------------------- 109 --------------------------------------

Chng 6: Tp i tng /* v khng tha k phng thc size() na, ta to mt phng thc size() mi */ public int size() { // U NHIM! return numbers.size(); } /* v khng tha k phng thc add() na, ta khng th ghi n, ta to mt phng thc add() mi */ public boolean add(int i) { // U NHIM cho tp hp c bao bc if (numbers.isEmpty()) { smallestInt = i; largestInt = i; } else { if (i < smallestInt) smallestInt = i; if (i > largestInt) largestInt = i; } total+=i; // U NHIM cho tp hp c bao bc thm phn t return numbers.add(i); } public int getSmallestInt() { return smallestInt; } public int getLargestInt() { return largestInt; } public double getAverage() { return ((double) total)/this.size()); } }

6.6 Phng thc tr v kiu tp hp


Nu chng ta nh ngha mt phng thc c kiu tr v l mt tp hp, ta c th nhn v mt tp hp c kch thc tu ti ni gi phng thc. Trong on lnh sau nh ngha lp Course, mt phng thc getRegisteredStudents tr v ton b i tng Student c ng k mt kho hc xc nh:

Bin son : Bi Cng Giao --------------------------------------- 110 --------------------------------------

Chng 6: Tp i tng public class Course { private ArrayList<Student> enrolledStudents; /* phng thc tr v mt tham chiu ti ton b tp hp cha ton b Students c ng k Course */ public boolean enroll( Student s) { // nu s tho iu kin ng k mn hc ny enrolledStudents.add( s); } public ArrayList<Student> getRegisteredStudents() { return enrolledStudents; } }

Di y l on lnh s dng phng thc trn:


// Khi to mt kho hc v vi sinh vin Course c = new Course(); Student s1 = new Student(); Student s2 = new Student(); Student s3 = new Student(); // ng k sinh vin cho kho hc ny. c.enroll(s1); c.enroll(s2); c.enroll(s3); /* yu cu kho hc cho danh sch sinh vin ng k hc v in bng im ca tng sinh vin ny */ for (Student s : c.getRegisteredStudents()) s.printGradeReport();

TNG KT CHNG 6
Trong chng ny cc vn sau c trnh by: Tp hp l cc kiu i tng c bit dng tham chiu ti cc i tng khc. Hu ht cc ngn ng lp trnh hng i tng u h tr 3 kiu tp hp: o Danh sch c th t o B

Bin son : Bi Cng Giao --------------------------------------- 111 --------------------------------------

Chng 6: Tp i tng

o T in Mng l kiu tp hp n gin m c vi hn ch, nhng Java cng c cc kiu tp hp nhiu tnh nng hn nh ArrayList, HashMap, TreeMap, C th to cc kiu tp hp ring bit bng cch m rng cc lp tp hp c sn hoc to mt lp c thuc tnh l tp hp nh ngha trc. Phng thc c th tr v l mt tp hp.

BI TP
1. Tru tng ho mt vn nh sau: mt quyn sch l tp hp cc chng, chng l tp hp cc trang. Phc ho cc lp Book, Chapter, v Page : To bt k thuc tnh no m ta ngh l cn thit, hy tn dng tp hp nh l thuc tnh ca lp To cc phng thc cho lp Chapter cho vic thm trang v xc nh mt chng c bao nhiu trang. To cc phng thc cho lp Book cho vic thm chng v xc nh quyn sch c bao nhiu chng, v s trang cho quyn sch (gi s dng s u nhim-delegation), v xut ra bng ni dung ca sch. 2. Vit mt chng trnh minh ho cc lp va to. 3. Kiu tp hp no danh sch c th t, danh sch c th t c sp xp, b, v t inc th dng tru tng ho cc vn sau ? Hy gii thch. Danh mc thit b my tnh Cc l bi trn tay ngi chi Cc cuc gi ti b phn h tr k thut c lu li 4. H thng sinh vin ng k mn hc cn loi tp hp g? 5. H thng cn theo di toa thuc bnh nhn cn loi tp hp g? 6. Loi tp hp no cn thit cho bi tp 3 chng 1 7. Thay i lp MyIntCollection thm phng thc printSortedContents nhm in ni dung ca tp hp trong mt th t c sp xp.

Bin son : Bi Cng Giao --------------------------------------- 112 --------------------------------------

Chng 7: X l ngoi l

Chng 7.

X l ngoi l

Ni dung chng ny nhm gii thiu: Ngoi l (exception) l g ? M t c ch x l ngoi l v bt ngoi l nh th no qua cch s dng cc khi try, catch v finally Vic bt ngoi l din ra nh th no Hiu c phn cp ngoi l trong Java Cc vn lu thm khi x l ngoi l

7.1 Gii thiu ngoi l


Vn c th pht sinh bt ng khi my o Java thc hin chng trnh Java, v d: Chng trnh khng th m mt tp tin d liu do khng c quyn thch hp Chng trnh gp kh khn khi thit lp kt ni n mt h thng qun l CSDL v ngi s dng cung cp mt mt khu khng hp l. Ngi s dng cung cp s liu khng ph hp thng qua mt ng dng ca giao din ngi dng, v d nhp mt gi tr khng phi s ni mt gi tr s c mong i. Vn c th l mt li logic m cc trnh bin dch khng th pht hin. Ta xt v d sau :
package chuong7; public class Problem { public static void main(String[] args) { /* Khai bo hai tham chiu ti i tng sinh vin v khi to chng l gi tr null */ Student s1 = null; Student s2 = null; // b qua chi tit /* to i tng v cho s1 tham chiu ti nhng qun lm iu ny cho s2 */ s1 = new Student(); // dng lnh ny OK s1.setName(Fred);

Bin son : Bi Cng Giao --------------------------------------- 113 --------------------------------------

Chng 7: X l ngoi l

/* nhng dng ny gy li trong thi gian chy v ta gi phng thc ca i tng khng tn ti. */ s2.setName(Mary); } }

on lnh trn s bin dch m khng c li, nhng nu chng ta thc hin chng trnh ny, my o Java s bo co cc li chy thi gian sau y: Exception in thread main java.lang.NullPointerException at Problem.main(Problem.java:22) Chng ta hm li thi gian chy (c th phc hi) trong Java l trng hp ngoi l, v my o Java bo co rng mt li thi gian chy pht sinh hnh ng nm ra mt ngoi l (throwing an exception). Vi v d trn my o Java nm NullPointerException trn dng 22 ca lp Problem:
s2.setName(Mary); // dng 22

Mt NullPointerException pht sinh bt c khi no chng ta c gng gi mt phng thc trn mt tham kho i tng (nh s2, trong v d trn) c gi tr null hay bt c khi no chng ta c gng ni chuyn vi mt i tng khng tn ti. My o Java

M bytecode c np vo my o

Hnh 7.1 Khi my o Java nm mt ngoi l, nh pht ra mt pho thng bo cho ng dng mt vn pht sinh. Khi my o Java nm mt ngoi l, nh th my o bn ra mt pho hiu thng bo cho mt ng dng bit c mt ci g sai, cung cp cho ng dng mt c hi phc hi v chy tip (xem hnh 7.1). Thng qua k thut x l cc trng hp

Bin son : Bi Cng Giao --------------------------------------- 114 --------------------------------------

Chng 7: X l ngoi l

ngoi l, chng ta c th thit k cc ng dng n c th d on v phc hi t trng hp ngoi l trong thi gian chy.

7.2 C ch x l ngoi l
7.2.1 Khi try
Ta dng khi lnh try bao cc lnh c th to li. iu ny gip vic bt li thun tin v tp trung hn. Chng trnh trn c sa cha nh sau:
package chuong7; public class Problem2 { public static void main(String[] args) { Student s1 = null; Student s2 = null; s1 = new Student(); // thm lnh try bao bc khi lnh gy li try { s1.setName("Fred"); s2.setName("Mary"); } //

Trc khi bin dch, khi try phi c theo sau t nht mt khi catch hay khi finally.

7.2.2 Khi catch


Khi catch c cu trc nh sau:
catch (ExceptionType variableName) { ... // m phc hi cho mt ngoi l kiu ExceptionType ... }

Mt hay nhiu khi catch c th theo sau mt khi try nh:


try { // m c th gy ngoi l ... } catch (ExceptionType1 variableName1) { // m phc hi cho mt ngoi l kiu ExceptionType1 ... } catch (ExceptionType2 variableName2) { // m phc hi cho mt ngoi l kiu ExceptionType2 ...

Bin son : Bi Cng Giao --------------------------------------- 115 --------------------------------------

Chng 7: X l ngoi l } //

C nhiu loi ngoi l khc nhau c xy dng trong cc ngn ng Java, mi mt loi c nh ngha bi mt lp c nh ngha trc v tt c chng bt ngun t mt lp gc l Exception. Ty thuc vo loi trng hp ngoi l chng ta mun bt, chng ta c th import gi th vin; tuy nhin NullPointerException c trong gi java.lang. Chng trnh trn thm khi lnh catch nh sau:
package chuong7; public class Problem3 { public static void main(String[] args) { Student s1 = null; Student s2 = null; //to i tng v cho s1 tham chiu ti nhng qun lm iu ny cho s2 s1 = new Student(); // thm lnh try bao bc khi lnh gy li try { s1.setName("Fred"); s2.setName("Mary"); } /* kt thc khi try bt u cc khi catch (3 khi) */ catch (ArithmeticException e) { // m phc hi cho mt ngoi l kiu ArithmeticException ... } catch (NullPointerException e2) { // m phc hi cho mt ngoi l kiu NullPointerException ... System.out.println("Qun khi to tt c sinh vin!"); } catch (ArrayIndexOutOfBoundsException e3) { /* m phc hi cho mt ngoi l kiu ArrayIndexOutOfBoundsException */ } } }

Lu rng on m trong khi lnh try ny khng nm ArithmeticExceptions hay ArrayIndexOutOfBoundsExceptions; chng c thm vo cho bao gm cho mc ch minh ho.

Bin son : Bi Cng Giao --------------------------------------- 116 --------------------------------------

Chng 7: X l ngoi l

i vi vic x l ngoi l, c hai con ng thc hin lnh. Nu l cc lnh trong try khng c li th tt c cc khi catch c b qua, v thc hin chng trnh vn tip tc ngay sau khi catch cui cng nh minh ha trong hnh 7.2.

Hnh 7.2 Nu khng c ngoi l c nm ra trong khi try, tt c cc khi catch c b qua. Nu mt ngoi l c nm ra bi my o Java trong khi thc hin khi lnh try, vic thc hin khi try phi chm dt ngay lp tc ngay dng ngoi l xy ra. My o Java sau xem xt cc cc lnh catch theo th t t trn xung di tm kim mt kiu ngoi l ging nh loi ngoi l c nm. Nu tm thy, my o Java thc thi khi catch ny; trong trng hp c nhiu lnh catch so khp , ch catch u tin c thc hin. Sau , vic thc hin tip tc sau lnh catch cui cng. iu ny c minh ha trong hnh 7.3. Nu khng c lnh catch no c tm thy, ngoi l c cho l cn t do, v trong trng hp ca v d trc thng bo li: Exception in thread "main" java.lang.NullPointerException at Problem.main(Problem.java: ...)

Bin son : Bi Cng Giao --------------------------------------- 117 --------------------------------------

Chng 7: X l ngoi l

Hnh 7.3 Nu mt ngoi l pht sinh, khi catch u tin chn bt, nu c, c thc thi, v phn cn li c b qua. Xt chng trnh Problem4 sau:
package chuong7; public class Problem4 { public static void main(String[] args) { Student s1 = null; Student s2 = null; s1 = new Student(); //... System.out.println("We're about to enter the try block ..."); try { System.out.println("We're about to call s1.setName(...)"); s1.setName("Fred"); System.out.println("We're about to call s2.setName(...)"); s2.setName("Mary"); System.out.println("We've reached the end of the try block ..."); } catch (ArithmeticException e) { System.out.println("Executing the first catch block ..."); } catch (NullPointerException e2) {

Bin son : Bi Cng Giao --------------------------------------- 118 --------------------------------------

Chng 7: X l ngoi l System.out.println("Executing the second catch block ..."); } catch (ArrayIndexOutOfBoundsException e3) { System.out.println("Executing the third catch block ..."); } System.out.println("We're past the last catch block ..."); } }

Chng trnh xut ra mn hnh: We're about to enter the try block ... We're about to call s1.setName(...) We're about to call s2.setName(...) Executing the second catch block ... We're past the last catch block ...

7.2.3 Khi finally


Mt khi try c th c mt khi finally lin kt vi n. Khi finally phi sau khi catch (cui cng) lin kt vi khi try . D c hay khng khi catch no c thc hin, khi finally lun c thc thi. Xt chng trnh Problem5 sau:
package chuong7; public class Problem5 { public static void main(String[] args) { Student s1 = null; Student s2 = null; s1 = new Student(); System.out.println("We're about to enter the try block ..."); try { System.out.println("We're about to call s1.setName(...)"); s1.setName("Fred"); System.out.println("We're about to call s2.setName(...)"); s2.setName("Mary"); System.out.println("We've reached the end of the try block ..."); } catch (ArithmeticException e) { System.out.println("Executing the first catch block ...");

Bin son : Bi Cng Giao --------------------------------------- 119 --------------------------------------

Chng 7: X l ngoi l } catch (NullPointerException e2) { System.out.println("Executing the second catch block ..."); } catch (ArrayIndexOutOfBoundsException e3) { System.out.println("Executing the third catch block ..."); } finally { System.out.println("Executing the finally block ..."); } System.out.println("We're past the last catch block ..."); } }

Chng trnh xut ra mn hnh: We're about to enter the try block ... We're about to call s1.setName(...) We're about to call s2.setName(...) Executing the second catch block ... Executing the finally block ... We're past the last catch block ... Mt bin th cui cng ca chng trnh Problemx l n nm ra NullPointerException, nhng khng c lnh catch no thch hp:
package chuong7; public class Problem6 { public static void main(String[] args) { Student s1 = null; Student s2 = null; s1 = new Student(); System.out.println("We're about to enter the try block ..."); try { System.out.println("We're about to call s1.setName(...)"); s1.setName("Fred"); System.out.println("We're about to call s2.setName(...)"); s2.setName("Mary"); System.out.println("We've reached the end of the try block ...");

Bin son : Bi Cng Giao --------------------------------------- 120 --------------------------------------

Chng 7: X l ngoi l } // khng bt NullPointerException. catch (ArithmeticException e) { System.out.println("Executing first catch block ..."); } catch (ArrayIndexOutOfBoundsException e2) { System.out.println("Executing second catch block ..."); } finally { System.out.println("Executing finally block ..."); } System.out.println("We're past the last catch block ..."); } }

Chng trnh xut ra mn hnh: We're about to enter the try block ... We're about to call s1.setName(...) We're about to call s2.setName(...) Executing the finally block ... Nhn xt rng chng trnh khng thc hin cu lnh: System.out.println("We're past the last catch block ..."); Bi v ngoi l khng b bt gy ra khi lnh m xy ra ngoi l - trong trng hp ny l phng thc main kt thc bt bnh thng. Nh vy d trng hp no xy ra trong khi lnh try/catch, khi finally nu c lun thc hin. Ta c th b qua khi catch nu c khi finally:
// Cc khi catch khng cn thit nu c khi finally. try { ... } finally { ... }

7.3 Bt cc ngoi l
Nu phng thc c mt ngoi l pht sinh nhng khng nm bt c ngoi l th ni gi (client code) phng thc c c hi bt ngoi l . Xem xt 3 lp sau:
public class MainProgram { public static void main(String[] args) { Student s = new Student();

Bin son : Bi Cng Giao --------------------------------------- 121 --------------------------------------

Chng 7: X l ngoi l s.methodX(); } } public class Student { // b qua chi tit. public void methodX() { Professor p = new Professor(); p.methodY(); } } public class Professor { // b qua chi tit. public void methodY() { // b qua chi tit. } }

Khi my o Java thc hin MainProgram, phng thc main gi s.methodX(), m n s gi p.methodY(); iu ny to mt chng (stack) lc chy chng trnh nh hnh 7.4. Chng gi hot ng theo c ch LIFO. V vy, khi methodY kt thc thc hin, quyn kim sot thc hin tr li cho methodX, methodY c y ra nh hnh 7.5. By gi chng ta hy gi nh rng NullPointerException c nm trong khi thc hin methodY. Nu c khi lnh try/catch thch hp bt ngoi l ny trong methodY th NullPointerException c x l nh sau:
public class Professor { // b qua chi tit public void methodY() { try { ... } catch (NullPointerException e) { ... } } }

Bin son : Bi Cng Giao --------------------------------------- 122 --------------------------------------

Chng 7: X l ngoi l

Hnh 7.4 My o Java theo di vic th t cc phng thc c gi bng cch to chng gi (call stack).

Hnh 7.5 Khi mt phng thc chm dt, n b ly ra khi chng. Sau c Student v MainProgram khng nhn bit nhng ngoi l c nm t Proffessor. T gc nhn ca chng gi, nhn bit ca cc ngoi l c cha trong phm vi mc hin hnh ca chng, nh minh ha trong hnh 7.6

Hnh 7.6 Khi lnh try/catch trong trong phng thc methodY nhn bit ngoi l trong mc hin hnh ca chng gi. Gi s methodY khng bt ngoi l NullPointerExceptions:
public class Professor { // b qua chi tit. public void methodY() { // Ngoi l NullPointerException c nm y nhng khng b bt // } }

Bin son : Bi Cng Giao --------------------------------------- 123 --------------------------------------

Chng 7: X l ngoi l

Nu NullPointerException c nm trong khi thc hin phin bn ny ca methodY, n s i xung mt mc ca chng gi ti methodX ca lp sinh vin, l ni gi p.methodY(). Nu m methodX ca lp Student c khi try/catch thch hp nh sau:
public class Student { // b qua chi tit. public void methodX() { Professor p = new Professor(); // X l ngoi l y. try { p.methodY(); } catch (NullPointerException e) { ... } } }

Th x l ngoi l trong methodX s x l, v MainProgram khng bit rng c mt ngoi l c nm ra. iu ny c minh ha trong hnh 7.7

Hnh 7.7 Ngoi l thot khi p.methodY() v chuyn xung s.methodX() x l


public class Professor { // b qua chi tit. public void methodY() { // Ngoi l NullPointerException c nm y nhng khng b bt // } } //----------------------------public class Student { // b qua chi tit. public void methodX() { Professor p = new Professor(); // Khng c x l ngoi l y p.methodY(); } }

Bin son : Bi Cng Giao --------------------------------------- 124 --------------------------------------

Chng 7: X l ngoi l //----------------------------public class MainProgram { public static void main(String[] args) { Student s = new Student(); // x l ngoi l y. try { s.methodX(); } catch (NullPointerException e) { ... } } }

Trong trng hp ny, ngoi l NullPointerException c nm trong methodY s thng qua chng gi chuyn ti phng thc main, ni c x l ngoi l nh hnh 7.8. Trong trng hp ny, ngi s dng ng dng ny l khng bit rng c mt ngoi l xy ra.

Hnh 7.8 NullPointerException thng qua chng gi c chuyn ti phng thc main. Mt minh ho cui cng, chng ta hy gi nh rng ngay c phng thc main b qua x l ngoi l. Nu mt NullPointerException pht sinh trong methodY, chng ta nhn thy du vt chng (stack trace) xut hin trong ca s lnh: java PSExample Exception in thread "main" java.lang.NullPointerException at Professor.methodY(Professor.java: ...) at Student.methodX(Student.java: ...) at MainProgram.main(MainProgram.java: ...) T mi trng ca chng gi, tnh hung ny c th hin trong hnh 7.9 Bt c khi no du vt chng pht sinh t mt ngoi l, ni u tin chng ta nn xem xt chn on v sa cha vn l dng m c bo co u tin trong du vt chng. Nu kim tra dng ny, ta khng th hiu ti sao ngoi l pht sinh, ta nhn

Bin son : Bi Cng Giao --------------------------------------- 125 --------------------------------------

Chng 7: X l ngoi l

sang mc th hai trong du vt chng, sau th ba, v nh vy, cho n khi chng ta nhn xa trong lch s cuc gi xc nh l do ti sao li pht sinh.

Hnh 7.9 Nu ng dng b qua x l ngoi l, my o Java chm dt ng dng v bo co ngoi l ti ca ca s dng lnh cho ngi s dng quan st.

7.4 Phn cp lp ngoi l


Nh cp phn trc lp Exception tng qut, bao gm trong gi java.lang, l siu lp ca tt c cc loi ngoi l trong Java. Nh minh ha trong hnh 7.10 (c ly t ti liu Java trc tuyn ca Sun), c nhiu lp con trc tip ca cc lp hc ngoi l. Mt khi catch bt ngoi l cho mt loi X s bt kiu c th ca ngoi l hay bt k kiu con no ca n, v l bn cht ca tha k. Do l do ny, iu quan trng l lit k khi lnh catch t chi tit nht ti tng qut nht sau khi lnh try, c ngha l, t lp con mc thp nht n siu lp cao nht. Hy s dng mt v d c th minh ha ti sao iu ny l nh vy. Chng ta thc hin truy xut CSDL. Cc ngoi l c nh ngha trong gi java.sql. Ta xem xt ba kiu ngoi l tng qut sau: DataTruncation l loi ngoi l chi tit nht m chng ta s quan tm trong v d ny. Mt ngoi l DataTruncation xy ra nu d liu c c ghi vo CSDL v b ct ngn, v d nh khi mt gi tr String qu di v b ghi vo mt trng CSDL khi n ch ch c th cha 255 k t. DataTruncation l kiu con ca ngoi l tng qut hn l SQLWarning. SQLWarning c nm ra khi c mt vn truy cp CSDL (khng nghim trng) xy ra. N ch cnh bo ng dng v vn ny. Ngoi l SQLWarning n phin n l mt trng hp c bit/lp con ca lp ngoi l tng qut hn SQLException. SQLException c nm khi c bt c iu g trong qu trnh giao tip CSDL, t c gng ng nhp bng cch s dng mt mt khu khng hp l, hay c gng truy cp vo mt bng khng tn ti, hay c gng gi mt truy vn SQL khng chun.

Bin son : Bi Cng Giao --------------------------------------- 126 --------------------------------------

Chng 7: X l ngoi l

Cui cng SQLException l lp con trc tip ca lp Exception tng qut.

Hnh 7.10 Lp java.lang.Exception c nhiu lp con ng i tha k ny c minh ho trong hnh 7.11

Hnh 7.11 Cy tha k ca kiu ngoi l java.sql.DataTruncation on m sau y trnh by mt cch chng ta vit try /catch x l DataTruncation (v cc loi khc lin quan n CSDL). Lu rng chng ta cn phi bao gm ch th
import java.sql.*;

Bin son : Bi Cng Giao --------------------------------------- 127 --------------------------------------

Chng 7: X l ngoi l // try { // vit d liu vo CSDL } catch (DataTruncation e1) { // bt kiu ngoi l c th nht } catch (SQLWarning e2) { //ri t c th hn ... } catch (SQLException e3) { // tng qut hn... }

Bng sau y lit k mt s ngoi l thng gp: Ngoi l RuntimeException ArthmeticException IllegalAccessException IllegalArgumentException Lp cha ca th t phn cp ngoi l Lp c s cho nhiu ngoi l java.lang Trng thi li v s, v d nh chia cho 0 Lp khng th truy cp Phng thc nhn mt i s khng hp l

ArrayIndexOutOfBoundsExeption Kch thc ca mng ln hn 0 hay ln hn kch thc tht s ca mng NullPointerException SecurityException ClassNotFoundException NumberFormatException AWTException IOException FileNotFoundException EOFException NoSuchMethodException InterruptedException SQLException Khi mun truy cp i tng null Vic thit lp c ch bo mt khng c hot ng Khng th np lp yu cu Vic chuyn i khng thnh cng t chui sang s thc Ngoi l v AWT Lp cha ca cc ngoi l I/O Khng th nh v tp tin Kt thc mt tp tin Phng thc yu cu khng tn ti Khi mt lung b ngt Khi giao tip CSDL c li Bng 7.1 Danh sch mt s ngoi l

Bin son : Bi Cng Giao --------------------------------------- 128 --------------------------------------

Chng 7: X l ngoi l

7.5 Cc im cn lu thm v ngoi l


7.5.1 Bt ngoi l tng qut Mt s ngi lp trnh s dng hng tip cn li bing bt loi ngoi l chung nht v sau khng lm g khi phc li, ch lm im lng my o Java, v d nh:
try { // } catch (Exception e) { } // khng lm g phc hi !!!

y khng phi l cch lm tt v c th cc li do ngoi l sinh ra s tim n cc tc hi m ta khng lng ht khi tip tc ng dng. Ta c th bt ngoi l khi c cch x l ngoi l ring, v d:
public class Example { public static void main(String[] args) { try { // } catch (Exception e) { /* gi phng thc tnh ca lp MyExceptionHandler do ngi vit ng dng to */ MyExceptionHandler.handleException(e); } } }

7.5.2 Trnh bin dch Java yu cu phi c x l ngoi l


i khi Java bt buc chng ta phi bao on lnh c th gy ra ngoi l, v d
public class FileIOExample { public static void main(String[] args) { // m gi m v c tp tin; while (cha ti cui tp tin) { c dng k tip t tp tin; // ... } } }

Bin son : Bi Cng Giao --------------------------------------- 129 --------------------------------------

Chng 7: X l ngoi l

Trnh bin dch s bo cc li sau: Unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown Trong trng hp ny, ta c hai cch khc phc: 1. Bao khi truy cp tp tin trong try v c catch bt ngoi l v x l:
import java.io.FileNotFoundException; public class FileIOExample { public static void main(String[] args) { try { // m gi m v c tp tin; while (cha ti cui tp tin) { c dng k tip t tp tin; // ... } } catch (FileNotFoundException e) { ...} } }

2. Ta thm lnh throws ti tiu ca phng thc m ngoi l c th xy ra nh:


import java.io.FileNotFoundException; public class FileIOExample { /* thm throws ti phng thc main, ta khng phi quan tm v bt FileNotFoundExceptions */ public static void main(String[] args) throws FileNotFoundException { // m gi m v c tp tin; while (cha ti cui tp tin) { c dng k tip t tp tin; // ... } } }

Bin son : Bi Cng Giao --------------------------------------- 130 --------------------------------------

Chng 7: X l ngoi l

7.5.3 Tn dng x l ngoi l lm r li pht sinh


Ta c th s dng phng thc getMessage() trong khi catch c thng bo m t li nh sau:
try { // m tp tin Foo.dat khng tn ti... } catch (FileNotFoundException e) { System.out.println("Error opening file " + e.getMessage()); }

Kt qu xut ra: Error opening file Foo.dat (The system cannot find the file specified) Phng thc printStackTrace() c th s dng xut ra du vt chng trong ca s dng lnh (nh rng du vt chng ch xy ra t ng nu ta khng x l ngoi l):
try { // m tp tin Foo.dat khng tn ti... } catch (FileNotFoundException e) { e.printStackTrace(); }

7.5.4 try/catch lng nhau


Mt khi try c th c lng vo bn trong khi try hoc khi catch. Thng thng ta c nhu cu lng khi try trong mt khi catch, v m phc hi m chng ta vit trong mt khi catch c th c mt nguy c nm mt ngoi l b sung ca ring n. V d nh khi mt FileNotFoundException pht sinh, chng ta mun m mt tp tin mc nh thay th. Nhng, do m mt tp tin mc nh c th cng c kh nng nm mt FileNotFoundException ca ring n, ta cn phi bao m phc hi trong khi try ring ca n nh sau:
try { // m tp tin Foo.dat khng tn ti... } catch (FileNotFoundException e) { /* Nu ta khng th m tp tin do ngi dng ch ra, ta s m tp tin mc nh, nhng iu g xy ra nu tp tin mc nh cng khng c */ try { // m tp tin mc nh } catch (FileNotFoundException e2) {

Bin son : Bi Cng Giao --------------------------------------- 131 --------------------------------------

Chng 7: X l ngoi l // c gng phc hi ... } }

7.5.5 Kiu ngoi l do ngi dng nh ngha


Ta c th nh ngha cc loi ngoi l ring bo hiu cc kiu li c th ca ng dng ca chng ta, v chng trnh nm chng khi c vn pht sinh. to kiu ngoi l ring, ta to lp tha k t cc lp ngoi l c sn ca Java. Thng thng ta m rng lp Exception trc tip:
public class MissingValueException extends Exception { ... }

Xt mt minh ho tng i hon chnh v ngoi l do ngi dng nh ngha:


public class MissingValueException extends Exception { private Student student; /* ... phng thc xy dng c hai tham s, tham s u tin gn cho thuc tnh student, v tham s th hai chuyn cho ngoi l ... */ public MissingValueException(Student s, String message) { super(message); student = s; } // ... thm phng thc get cho thuc tnh Student. public Student getStudent() { return student; } }

V dng ngoi l ny trong nh ngha lp Student:


public class Student { private String name; private String ssn; // b qua chi tit. public String getSsn() { ... } public void setSsn() { ... } public String getName() { ... } public void setName(String n) throws MissingValueException { // Ta mun bo co mt li nu n l chui rng. if (n.equals(""))

Bin son : Bi Cng Giao --------------------------------------- 132 --------------------------------------

Chng 7: X l ngoi l throw new MissingValueException(this, "A student's name cannot be blank"); else name = n; } // ... }

Khi to mt ng dng nh sau:


public class Example { public static void main(String[] args) { // m gi. String name = c gi tr t GUI; Student s = new Student(); s.setName(name); //

Trnh bin dch pht ra li ti lnh gi phng thc setName ca i tng s do ta bao gm lnh throws MissingValueException cho phng thc ny Unreported exception MissingValueException; must be caught or declared to be thrown s.setName(name); Trnh bin dch Java phi bt kiu ngoi l ny trong on m gi! Ngha l ta phi t setName trong khi try, v theo sau l khi catch thch hp:
public class Example { public static void main(String[] args) { // m gi. String name = c gi tr t GUI; Student s = new Student(); try { s.setName(name); } catch (MissingValueException e) { System.out.println(e.getMessage()); System.out.println("ID of affected student: " + e.getStudent().getSsn());

Bin son : Bi Cng Giao --------------------------------------- 133 --------------------------------------

Chng 7: X l ngoi l } //

Trong khi catch, ta li dng va phng thc tha k getMessage v phng thc getStudent ca lp MissingvalueException xut ra kt qu nh sau: A student's name cannot be blank ID of affected student: 123-45-6789

7.5.6 Nm nhiu kiu ngoi l


Ta c th nm nhiu kiu ngoi l t mt phng thc. Xt v d sau: gi s ta khai bo mt ngoi l InvalidCharacterException cng vi MissingValueException.
public class Student { // b qua chi tit. public void setName(String s) throws MissingValueException, InvalidCharacterException { if (s.equals("")) throw new MissingValueException(this, "A student's name cannot be blank"); // m gi. else if (s c mt k t khng hp l) throw new InvalidCharacterException(this, s +" contains a nonalphabetic character"); else name = s; } // }

7.6 Case Study


Vit mt chng trnh NumberOfDigits m s k s c nhp vo nh tham s t ca s dng lnh. Nu mt k t c nhp vo th xut ra cu thng bo li. Mt chng trnh minh ho cho bi ton trn nh sau
package chuong7; class NumberOfDigits { public static void main(String args[]) try { {

Bin son : Bi Cng Giao --------------------------------------- 134 --------------------------------------

Chng 7: X l ngoi l int num = Integer.parseInt(args[0]); System.out.println(args[0].length()); } catch (NumberFormatException e) { System.out.println("\nEnter only numbers!"); } } }

Khi chy chng trnh s c dng nh hnh 7.12:

Hnh 7.12 Kt qu demo ca NumberOfDigits.java

TNG KT CHNG 7
Trong chng ny cc vn sau c trnh by: Bt c khi no mt li xut hin trong khi thi hnh chng trnh, ngha l mt ngoi l xut hin. Mi ngoi l pht sinh ra phi b bt gi, nu khng ng dng s b ngt. Java s dng cc khi try v catch x l cc ngoi l. Cc cu lnh trong khi try chn ngoi l cn khi catch x l ngoi l. Cc khi cha nhiu catch c th c s dng x l cc kiu ngoi l khc nhau. Khi finally khai bo cc cu lnh lun c thc hin d ngoi l c xy ra hay khng. T kho throws lit k cc ngoi l m phng thc chn. T kho throw ch ra mt ngoi l va xut hin. C ch x l ngoi l v bt ngoi l qua chng gi. Ngoi l do ngi dng nh ngha. Nm nhiu kiu ngoi l cho mt phng thc nh th no.

Bin son : Bi Cng Giao --------------------------------------- 135 --------------------------------------

Chng 7: X l ngoi l

BI TP
1. Vit chng trnh ArraySize to mng 5 s. Vit lnh truy xut phn t th 6;

iu ny gy ra mt ngoi l. Bt ngoi l thch hp v in thng bo li.


2. Sau khi hc xong chng 9 hy vit mt applet Square. Mt ngoi l s pht sinh

khi ngi dng nhp vo gi tr khng phi l s. Hy bt ngoi l thch hp v in thng bo li.

Bin son : Bi Cng Giao --------------------------------------- 136 --------------------------------------

Chng 8: X l vo/ra

Chng 8.

X l vo/ra

Ni dung chng ny nhm gii thiu: cp n cc khi nim v lung v cc kiu lung Vic qut d liu vo qua scanner v t qui cch d liu vo v xut ra bng formatting. M t vo ra trong ch dng lnh Lm vic vi CSDL qua JDBC

8.1 Lung vo/ra


8.1.1 Gii thiu lung vo/ra Theo thut ng chung, lung (stream) l mt dng lu chuyn, trong thut ng v k thut lung l mt l trnh m d liu c truyn trong mt chng trnh. Cn trong Java lung l nhng dn ng (pipelines) gi v nhn thng tin. Mt ng dng v cc lung m ta quen thuc l lung nhp System.in. Khi mt lung d liu c gi hoc nhn, ta hm nh ang ghi hoc c lung v cc lung khc b phong to. Nu c mt li xy ra khi c hay ghi lung, mt IOException c kch hot. Do vy, cc cu lnh lung phi bao gm khi try/catch. Hnh 8.1 v 8.2 minh ho vic c v ghi d liu qua lung nhp, xut tng ng:

Hnh 8.1 c d liu vo chng trnh. Lung x l tt c d liu t c bn n i tng. Ngun d liu (data source) v ni n ca d liu ca hai hnh trn c th l bt c ci g gi, pht ra, hay x l d liu. C th l tp tin, chng trnh khc, thit b ngoi vi, mng, hay network socket. Lp java.lang.System nh ngha cc lung nhp v xut chun. chng l cc lp chnh ca cc lung byte m Java cung cp. Ta cng s dng cc lung xut xut d liu v hin th kt qu trn mn hnh. Lung vo ra bao gm: Lp System.out: Lung xut chun dng hin th kt qu trn mn hnh. Lp System.in: Lung nhp chun thng n t bn phm v c dng c cc k t d liu. Lp System.err: y l lung li chun.

Bin son : Bi Cng Giao --------------------------------------- 137 --------------------------------------

Chng 8: X l vo/ra

Cc lp InputStream v OutputStream cung cp nhiu kh nng vo ra khc nhau. C hai lp ny c cc lp con thc hin vo ra thng qua cc vng m b nh, cc tp tin v ng dn. Cc lp con ca lp InputStream thc hin u vo, trong khi cc lp con ca lp OutputStream thc hin kt xut.

Hnh 8.2 Vit d liu t chng trnh. Trong phn k tip ta s dng lung c bn nht , lung byte minh ho cc thao tc thng thng. Ta s dng tp tin xanadu.txt c ni dung nh sau:
In Xanadu did Kubla Khan A stately pleasure-dome decree: Where Alph, the sacred river, ran Through caverns measureless to man Down to a sunless sea.

8.1.2 Lung byte


Chng trnh s dng lung byte thc hin vo ra trn cc byte. Tt c lp lung byte tha k t lp InputStream v OutputStream. Trc ht ta xt lung byte vo ra trn tp tin, cc lung byte khc c s dng tng t nh vy nhng ch khc cch m chng c xy dng. Chng trnh CopyBytes di y dng lung byte chp xanadu.txt theo tng byte.
package chuong8; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class CopyBytes { public static void main(String[] args) throws IOException { FileInputStream in = null; FileOutputStream out = null; try { in = new FileInputStream("xanadu.txt"); out = new FileOutputStream("outagain.txt");

Bin son : Bi Cng Giao --------------------------------------- 138 --------------------------------------

Chng 8: X l vo/ra int c; // c n khi cui tp tin while ((c = in.read()) != -1) out.write(c); } finally { if (in != null) in.close(); if (out != null) out.close(); } } }

Hnh 8.3 minh ho chng trnh CopyBytes. Lung vo I n X a n a d u d i d

read(b)

S nguyn d

write(b)

n Lung ra

Hnh 8.3 Lung byte vo ra n gin Nhn xt rng read() tr v gi tr int. Nu lung vo l chui cc byte ti sao read() khng tr v byte? S dng int nh l kiu tr v cho php read() dng -1 bo hiu n cui lung. Ch : o Lun ng lung khi khng cn dng na.

Bin son : Bi Cng Giao --------------------------------------- 139 --------------------------------------

Chng 8: X l vo/ra o Khi x l vo ra vi tp tin cha d liu k t ta nn dng lung k t. Lung

byte ch dng cho vic vo ra c bn nht. Nhng ti sao ta dng lung byte cho minh ho u tin. L do rng cc kiu lung khc c xy dng trn lung byte.

8.1.3 Lung k t
Java lu tr k t theo m Unicode. Lung vo ra k t ng dch bng m ny ti/t b k t a phng (local character set). Tt c lp lung k t c dn xut t Reader v Writer. Nh lung byte, ta c lung k t chuyn dng cho vo ra tp tin: FileReader and FileWriter. Chng trnh CopyCharacters minh ho cc lp ny.
package chuong8; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class CopyCharacters { public static void main(String[] args) throws IOException { FileReader inputStream = null; FileWriter outputStream = null; try { inputStream = new FileReader("xanadu.txt"); outputStream = new FileWriter("characteroutput.txt"); int c; while ((c = inputStream.read()) != -1) outputStream.write(c); } finally { if (inputStream != null) inputStream.close(); if (outputStream != null) outputStream.close(); } } }

Nhn xt rng trong CopyCharacters bin c cha gi tr k t 16 bit; cn CopyBytes bin c cha gi tr k t 8 bit.

Bin son : Bi Cng Giao --------------------------------------- 140 --------------------------------------

Chng 8: X l vo/ra

Lung k t thng bao ly lung byte. Lung k t dng lung byte thc hin vo ra cp vt l, cn cng vic cn li ca n l x l vic dch gia k t v byte. V d FileReader dng FileInputStream, trong khi FileWriter dng FileOutputStream.

8.1.4 Lung b m
Hu ht cc v d m ta xt n gi u dng vo ra khng b m (unbuffered I/O). Ngha rng mi ln c hoc vit u c x l trc tip bi h iu hnh. iu ny khng kinh t v mi yu cu nh vy thng to nn truy xut a, hoc vi hnh ng tng i tn km chi ph. khc phc, Java gii thiu lung vo ra dng b m. Lung vo dng b m c d liu t mt vng b nh, b m, vic lp y b m ch thc hin khi b m rng ( c c ht). Tng t lung xut dng b m ghi d liu vo b m. Vic ghi ti ni cha thc s ch thc hin khi b m y. Khi x l dng d liu c du kt thc dng, thng thng "\r\n", hoc "\r", hoc "\n" th ta dng vo ra hng dng (line-oriented I/O). lm iu ny, ta dng BufferedReader v PrintWriter. Chng trnh c th chuyn lung khng b m thnh lung c b m bng cch dng bao bc nh trong CopyLines.
package chuong8; import java.io.FileReader; import java.io.FileWriter; import java.io.BufferedReader; import java.io.PrintWriter; import java.io.IOException; public class CopyLines { public static void main(String[] args) throws IOException { BufferedReader inputStream = null; PrintWriter outputStream = null; try { inputStream = new BufferedReader(new FileReader("xanadu.txt")); outputStream = new PrintWriter(new FileWriter("characteroutput.txt")); String l; while ((l = inputStream.readLine()) != null) outputStream.println(l); } finally {

Bin son : Bi Cng Giao --------------------------------------- 141 --------------------------------------

Chng 8: X l vo/ra if (inputStream != null) inputStream.close(); if (outputStream != null) outputStream.close(); } } }

readLine tr v mt dng vn bn, println chn du kt thc dng ph hp vi h iu hnh hin thi. C th du kt thc dng chn vo khc vi du kt thc dng c dng cho tp tin nhp vo. C bn lung vo ra dng b m bao bc lung khng b m: BufferedInputStream v BufferedOutputStream to lung byte c b m, BufferedReader v BufferedWriter to lung k t c b m. i khi ta cn ghi b m ra ni cha ngay lp tc m khng cn ch n y. Khi vic xut b m (flush the buffer) c thc hin bng phng thc flush. C hai lung vo ra dng b m trc tip (khng cn bao bc) x l trn mng: Lp ByteArrayInputStream : to lung u vo t b nh m. N l mng cc byte. Lp ByteArrayOutputStream : to ra lung xut trn mt mng cc byte. Lp ny cung cp cc phng thc toByteArrray() v toString(). Chng c dng chuyn i lung thnh mt mng byte hay i tng chui. Lp ny cung cp hai phng thc xy dng. Mt chp nhn mt i s s nguyn dng n nh mng byte kt xut theo mt kch c ban u. v th hai khng chp nhn i s no, v thit lp m kt xut vi kch thc mc nh. Lp ny cung cp vi phng thc b sung, khng c khai bo trong OutputStream: reset() : thit lp li kt xut vng m nhm cho php tin trnh ghi khi ng li ti u vng m. size() : tr v s byte hin ti c ghi ti vng m. writeto() :ghi ni dung ca vng m kt xut ra lung xut ch nh. thc hin, n chp nhn mt i tng ca lp OutputStream lm i s. Chng trnh ByteExam minh ho cho cch s dng hai lp trn:
package chuong8; import java.lang.System; import java.io.*;

Bin son : Bi Cng Giao --------------------------------------- 142 --------------------------------------

Chng 8: X l vo/ra public class ByteExam { public static void main(String args[]) throws IOException { ByteArrayOutputStream os =new ByteArrayOutputStream(); String s ="Welcome to Byte Array Input Output classes"; // Vit tng k t ca chui s vo os for(int i=0; i<s.length( );i++) os.write(s.charAt(i)) ; System.out.println("Output Stream is:" + os); System.out.println("Size of output stream is:"+ os.size()); ByteArrayInputStream in; in = new ByteArraylnputStream(os.toByteArray()); // s byte cn li c th c c t lung nhp ByteArraylnputStream int ib = in.available(); System.out.println("Input Stream has :" + ib + "available bytes"); byte ibuf[] = new byte[ib]; int byrd = in.read(ibuf, 0, ib); System.out.println("Number of Bytes read are :" + byrd); System.out.println("They are: " + new String(ibuf)); } }

Kt qu chng trnh nh sau: Output Stream is:Welcome to Byte Array Input Outputclasses Size of output stream is:41 Input Stream has : 41 available bytes Number of Bytes read are :41 They are: Welcome to Byte Array Input Output classes

8.2 Scanning v Formatting


8.2.1 Scanning
i tng kiu Scanner dng ngt cc d liu vo c qui cch thnh cc t (token) v dch tng t theo kiu d liu ca n.

Bin son : Bi Cng Giao --------------------------------------- 143 --------------------------------------

Chng 8: X l vo/ra

Thng thng mt Scanner dng khong trng phn bit cc t (k t khong trng bao gm khong trng, tab, du kt thc dng). xem scanning lm vic nh th no, ta hy xem chng trnh ScanXan c tng k t trong xanadu.txt v in chng theo tng dng.
import java.io.*; import java.util.Scanner; public class ScanXan { public static void main(String[] args) throws IOException { Scanner s = null; try { s = new Scanner(new BufferedReader(new FileReader("xanadu.txt"))); while (s.hasNext()) System.out.println(s.next()); } finally { if (s != null) s.close(); } } }

Nhn xt rng mc du scanner khng l lung d liu, ta cng cn ng n. Kt qu ca chng trnh: In Xanadu did Kubla Khan A stately pleasure-dome ... ScanXan xem tt c t nhp vo c kiu String. Ngoi ra Scanner cng h tr cc kiu d liu c bn (tr char), cng nh BigInteger v BigDecimal. Gi tr kiu s dng rt

Bin son : Bi Cng Giao --------------------------------------- 144 --------------------------------------

Chng 8: X l vo/ra

nhiu du phn cch. Thng dng nh kiu bn a ca M (US locale), Scanner c chnh xc chui "32,767" nh l s nguyn. Chng trnh ScanSum c mt danh sch cc gi tr double v tnh tng chng:
package chuong8; import java.io.FileReader; import java.io.BufferedReader; import java.io.IOException; import java.util.Scanner; import java.util.Locale; public class ScanSum { public static void main(String[] args) throws IOException { Scanner s = null; double sum = 0; try { s = new Scanner( new BufferedReader(new FileReader("usnumbers.txt"))); s.useLocale(Locale.US); while (s.hasNext()) if (s.hasNextDouble()) sum += s.nextDouble(); else s.next(); } finally { s.close(); } System.out.println(sum); } }

Sau y l ni dung usnumbers.txt 8.5 32,767 3.14159 1,000,000.1

Bin son : Bi Cng Giao --------------------------------------- 145 --------------------------------------

Chng 8: X l vo/ra

Chui kt qu l 1032778.74159 Tu theo qui c ca locale, du . c th l du khc. Do System.out l mt i tng PrintStream v lp khng cung cp cch thc ghi locale mc nh. Ta ch c th ghi locale cho ton b chng trnh bng formatting.

8.2.2 Formatting
i tng lung thc hin vic formatting c kiu l PrintWriter, lp lung k t, v PrintStream, lp lung byte. C hai mc formatting: 1. print v println t qui cch tng gi tr theo cch tiu chun. print hay println xut ra tng gi tr sau khi chuyn kiu bng phng thc toString. Xem lp Root sau:
public class Root { public static void main(String[] args) { int i = 2; double r = Math.sqrt(i); System.out.print("Cn bc hai ca "); System.out.print(i); System.out.print(" l "); System.out.print(r); System.out.println("."); i = 5; r = Math.sqrt(i); System.out.println("Cn bc hai ca " + i + " l " + r + "."); } }

y l kt qu xut ra: Cn bc hai ca 2 l 1.4142135623730951. Cn bc hai ca 5 l 2.23606797749979.

Bin son : Bi Cng Giao --------------------------------------- 146 --------------------------------------

Chng 8: X l vo/ra

2. format t qui cch hu nh bt k gi tr s da trn chui c qui cch vi nhiu la chn. Phng thc ny trong lp java.util.Formatter c c php sau:
format (String format, Object... args)

Phng thc ny hu nh ging ht vi printf () ca PrintStream. Cc tham s args s c hin th trong kt qu theo cc ch th c t trong chui nh dng trong tham s u tin. Xt chng trnh Root2 thay th cho Root. Root2 t quy cch hai gi tr:
public class Root2 { public static void main(String[] args) { int i = 2; double r = Math.sqrt(i); System.out.format("Cn bc hai ca %d l %f.%n", i, r); } }

Kt qu xut ra: Cn bc hai ca 2 l 1.414214 Tt c c t qui cch bt u vi % v kt thc bng 1 hay 2 k t chuyn i. Cc k t chuyn i thng gp:

d t qui cch gi tr nguyn nh loi thp phn. f t qui cch gi tr du chm ng (float) nh loi thp phn. n xut du kt thc dng. x t qui cch gi tr nguyn nh loi thp lc phn. s t qui cch bt k gi tr no nh l mt chui. tB t qui cch s nguyn l tn thng theo kiu bn a.

Ch : Ngoi tr %% v %n tt c c t qui cch phi c tham s i km; Nu khng mt ngoi l pht sinh. Trong ngn ng Java, \n pht ra k t linefeed (\u000A). Khng nn dng \n xung dng. Ta nn dng %n xung dng cho ph hp vi mi trng thc hin. c t qui cch c th c thm nhiu thnh phn tu bin kt qu xut ra. Lp Format sau y minh ho thm cc tu bin.
public class Format {

Bin son : Bi Cng Giao --------------------------------------- 147 --------------------------------------

Chng 8: X l vo/ra public static void main(String[] args) { System.out.format("%f, %1$+020.10f %n", Math.PI); } }

Kt qu : 3.141593, +00000003.1415926536 Hnh sau y m t cc la chn thm. % Bt u c t qui cch 1$ Ch mc tham s +0 C 20 Chiu rng .10 chnh xc f Chuyn i

Hnh 8.4 Cc thnh phn c t qui cch. ngha cc thnh phn ny nh sau:

chnh xc: vi du chm ng gi tr ny xc nh s cc k s sau phn thp phn. Vi chuyn i chui (%s) gi tr ny xc nh chiu rng, kt qu b ct phi nu khng ch. Chiu rng: chiu rng ti thiu, khong trng c thm vo bn tri nu cn thit. C: trong v d trn + xc nh s lun c du, v 0 l k t chn vo. C khc bao gm - (chn vo bn phi) v , (qui cch s du phn cch phn nghn). Ch mc tham s cho php so khp tng minh mt tham s xc nh. c t < hm dng li tham s trc, v d nh:
System.out.format("%f, %<+020.10f %n", Math.PI);

8.3 Vo ra t ch dng lnh


Mt chng trnh thng c chy t dng lnh v tng tc vi ngi s dng trong mi trng dng lnh. Cc nn tng Java h tr loi hnh tng tc theo hai cch: thng qua cc lung chun v thng qua Console.

8.3.1 Vo ra qua lung chun


x l u vo ta phi dng System.in, y l mt lung byte. Vi System.in ta c th c trong mt byte n l, hoc mt mng kiu byte, n tr l mt s nguyn. Sau ta chuyn tng byte t u vo bn phm thnh kiu k t. V d:
try {

Bin son : Bi Cng Giao --------------------------------------- 148 --------------------------------------

Chng 8: X l vo/ra int tmp = System.in.read (); char c = (char)tmp; }

c mt chui k t th on m trn nn i vo bn trong mt vng lp:


String strInput = ""; while (true) { try { int tmp = System.in.read (); if (tmp == -1) break; char c = (char) tmp; strInput = strInput + c; } catch (IOException e) { } } System.out.println ("Xut ra = " + strInput);

Gi tr tr v -1 bo hiu kt thc vic nhp. V gi tr kiu byte chim 8 bit u tin ca mt gi tr int 32-bit nn gi tr thc s s khng bao gi c du. s dng nhp chun ny nh l lung k t, ta phi bao System.in trong InputStreamReader.
InputStreamReader cin = new InputStreamReader(System.in);

Nh tho lun phn trc, cc lp bao b m cung cp vic truyn lung byte hiu qu. Trong v d BufferedReaderApp, ta bao System.in vi InputStreamReader v sau bao th hin ny vi BufferedReader. Ta dng phng thc readLine() trong BufferedReader c mt dng nhp vo thay v vng lp nhn tng k t. K thut ny cng loi b vic chuyn t int ti char.
package chuong8; import java.io.*; public class BufferedReaderApp { public static void main (String arg[]) { // System.in m theo mc nh. // Bao mt lung reader mi c kh nng 16 bit. InputStreamReader reader = new InputStreamReader (System.in); // Bao reader vi mt reader c b m.

Bin son : Bi Cng Giao --------------------------------------- 149 --------------------------------------

Chng 8: X l vo/ra BufferedReader buf_in = new BufferedReader (reader); // Bao mt lung writer mi c kh nng 16 bit. OutputStreamWriter writer = new OutputStreamWriter (System.out); PrintWriter print_writer = new PrintWriter (writer, true); String str = "q"; try { /* c nguyn dng. Kim tra chui nhp l "quit" thot ra vng lp */ do { // c vn bn t bn phm str = buf_in.readLine (); // Xut ngc vn bn ra console. print_writer.println ("echo " + str); } while (!str.toLowerCase ().equals ("q") ); } catch (IOException e) { System.out.println ("IO exception = " + e ); } } }

Mt v d kt qu chng trnh: My input from the keyboard echo My input from the keyboard More of my input echo More of my input q echo q c c gi tr s t bn phm i hi phi c cc gi tr nh chui v sau chuyn i chng thnh cc kiu c bn. V d on m sau c mt s nguyn nh l chui v sau chuyn thnh gi tr s nguyn.
InputStreamReader reader = new InputStreamReader (System.in); BufferedReader buf_reader = new BufferedReader (reader);

Bin son : Bi Cng Giao --------------------------------------- 150 --------------------------------------

Chng 8: X l vo/ra try { String s = buf_reader.readLine (); // c s nh chui // Ct khong trng ng sau trc khi chuyn kiu. tmp = Integer.parseInt (s.trim ()); System.out.println (" echo = " + tmp); } catch (IOException ioe) { System.out.println ("IO exception = " + ioe); }

Chng trnh PrintWriterApp di y xut chui, cc kiu d liu c bn, v bao cc lung c kh nng nhiu hn. u tin chng ta bao i tng System.out, lung 8 bit, vi mt OutputStreamWriter c c lung 16-bit. Tuy nhin lp OutputStreamWriter ch c vi phng thc, v vy ta bao i tng OutputStreamWriter bng PrintWriter, m n cung cp y cc phng thc print() v println() cho vic in chui v cc kiu d liu c bn.
package chuong8; import java.io.*; public class PrintWriterApp { public static void main (String arg[]) { OutputStreamWriter writer = new OutputStreamWriter (System.out); // Tham s th hai l true autoflush. PrintWriter print_writer = new PrintWriter (writer,true); print_writer.println ("Text output with PrintWriter."); print_writer.println ("Primitives converted to strings:"); boolean a_boolean = false; byte a_byte = 114; short a_short = 1211; int an_int = 1234567; long a_long = 987654321; float a_float = 983.6f; double a_double = -4.297e-15; print_writer.println (a_boolean); print_writer.println (a_byte); print_writer.println (a_short);

Bin son : Bi Cng Giao --------------------------------------- 151 --------------------------------------

Chng 8: X l vo/ra print_writer.println (an_int); print_writer.println (a_long); print_writer.println (a_float); print_writer.println (a_double); // PrintWriter khng nm ra IOExceptions m a ra checkError () if( print_writer.checkError ()) System.out.println ("An output error occurred!" ); } }

Kt qu xut ra: Text output with PrintWriter. Primitives converted to strings: false 114 1211 1234567 987654321 983.6 -4.297E-15 Lu rng vi lp lung bao bc (wrapper) bao gm mt b m thu thp d liu cho n khi n y v sau ton d liu trong b m c gi n ch ca n trong mt ln. iu ny hiu qu hn gi mi mt byte mi ln v chi ph lin quan n vic chuyn giao. bo m rng d liu c y ra khi b m ngay lp tc ta dng phng thc flush. Vi c hai PrintStream v PrintWriter, ta c ty chn autoflush. Chng trnh FormatWriteApp minh ho dng Formatter gi cc gi tr s to qui cch ti console.
package chuong8; import java.io.*; import java.util.*;

Bin son : Bi Cng Giao --------------------------------------- 152 --------------------------------------

Chng 8: X l vo/ra public class FormatWriteApp { public static void main (String arg[]) { // Gi kt xut t qui cch ti lung System.out. Formatter formatter = new Formatter ((OutputStream)System.out); formatter.format ("Text output with Formatter. %n"); formatter.format ("Primitives converted to strings: %n"); boolean a_boolean = false; byte a_byte = 114; short a_short = 1211; int an_int = 1234567; long a_long = 987654321; float a_float = 983.6f; double a_double = -4.297e-15; formatter.format ("boolean = %9b %n", a_boolean); formatter.format ("byte formatter.format ("int formatter.format ("long = %9d %n", a_byte); = %9d %n", an_int); = %9d %n", a_long); formatter.format ("short = %9d %n", a_short);

formatter.format ("float = %9.3f %n", a_float); formatter.format ("double = %9.2e %n", a_double); formatter.flush (); formatter.close (); } }

Kt xut chng trnh: Text output with Formatter. Primitives converted to strings: boolean = byte = short = int false 114 1211

= 1234567

long = 987654321

Bin son : Bi Cng Giao --------------------------------------- 153 --------------------------------------

Chng 8: X l vo/ra

float = 983.600 double = -4.30e-15

8.3.2 Vo ra qua Console


Console l mt thay th cao cp hn cho lung chun. Console c hu ht cc tnh nng cung cp bi lung chun v c bit hu ch cho vic nhp mt khu an ton. N cng cung cp lung vo v ra l lung k t thc s, thng qua phng thc reader v writer. Trc khi mt chng trnh c th s dng Console, n phi c gng to i tng iu khin bng cch gi System.console(). Nu i tng iu khin c sn, phng thc ny tr v mt tham chiu. Nu System.console tr v null, th cc hot ng Console khng c php, hoc v h iu hnh khng h tr chng hay bi v chng trnh chy trong mi trng khng tng tc. i tng Console h tr nhp mt khu an ton thng qua cc phng thc readPassword. Phng thc ny gip m bo nhp mt khu trong hai cch. u tin, n ngn chn hin th, do , mt khu l khng th nhn thy trn mn hnh ca ngi dng. Th hai, readPassword tr v mt mng k t, khng phi l mt chui, v vy cc mt khu c th c ghi , loi b n khi b nh ngay sau khi n khng cn cn thit. Chng trnh Password sau thay i mt khu.
package chuong8; import java.io.Console; import java.util.Arrays; import java.io.IOException; public class Password { public static void main (String args[]) throws IOException { Console c = System.console(); if (c == null) { System.err.println("No console."); System.exit(1); } String login = c.readLine("Enter your login: "); char [ ] oldPassword = c.readPassword("Enter your old password: "); if (verify(login, oldPassword)) { boolean noMatch;

Bin son : Bi Cng Giao --------------------------------------- 154 --------------------------------------

Chng 8: X l vo/ra do { char [ ] newPassword1 = c.readPassword("Enter your new password: "); char [ ] newPassword2 = c.readPassword("Enter new password again: "); noMatch = ! Arrays.equals(newPassword1, newPassword2); if (noMatch) c.format("Passwords don't match. Try again.%n"); else { change(login, newPassword1); c.format("Password for %s changed.%n", login); } Arrays.fill(newPassword1, ' '); Arrays.fill(newPassword2, ' '); } while (noMatch); } Arrays.fill(oldPassword, ' '); } // gi lp phng thc kim tra. static boolean verify(String login, char[] password) { return true; } // gi lp phng thc thay i. static void change(String login, char[ ] password) { } }

Chng trnh ny thc hin: C gng ly i tng Console. Nu i tng khng c, hy b. Gi Console.readLine nhc v c tn ng nhp ca ngi dng. Gi Console.readPassword nhc v c mt khu hin hnh. Kim tra ngi dng c quyn thay i mt khu. Lp li cc bc sau cho n khi ngi dng nhp mt khu hai ln: a. Console.readPassword gi hai ln nhc cho v c mt mt khu mi. b. Nu ngi dng nhp vo cng mt mt khu c hai ln, gi change thay i n. Ghi ln c hai mt khu vi cc khong trng. c. Ghi ln cc mt khu c vi khong trng.

Bin son : Bi Cng Giao --------------------------------------- 155 --------------------------------------

Chng 8: X l vo/ra

Dng Scanner cho nhp t Console on lnh sau minh ho vic c gi tr nguyn t bn phm:
Scanner scanner = new Scanner (System.in); int i = scanner.nextInt ();

i vi mi kiu c bn c phng thc nextXxx() tr v gi tr ca kiu tng ng. Nu chui khng th chuyn c nh kiu , th x l ngoi l InputMismatchException xut hin. Chng trnh ScanConsoleApp minh ho vic c int, float, v double t bn phm.
package chuong8; import java.io.*; import java.util.*; public class ScanConsoleApp { public static void main (String arg[]) { // To m scanner c t bn phm Scanner scanner = new Scanner (System.in); try { System.out.printf ("Input int (e.g. %4d): ",3501); int int_val = scanner.nextInt (); System.out.println (" You entered " + int_val +"\n"); System.out.printf ("Input float (e.g. %5.2f): ", 2.43); float float_val = scanner.nextFloat (); System.out.println (" You entered " + float_val +"\n"); System.out.printf ("Input double (e.g. %6.3e): ",4.943e15); double double_val = scanner.nextDouble (); System.out.println (" You entered " + double_val +"\n"); } catch (InputMismatchException e) { System.out.println ("Mismatch exception:" + e ); } } }

Kt qu chng trnh: Input int (e.g. 3501): 23431

Bin son : Bi Cng Giao --------------------------------------- 156 --------------------------------------

Chng 8: X l vo/ra

You entered 23431 Input float (e.g. 2.43): 1.2343 You entered 1.2343 Input double (e.g. 4.943e+15): -2.34e4 You entered -23400.0 C mt s phng thc khc hu ch trong lp Scanner nh skip() nhy qua u vo, findInLine () tm kim cc chui con. useDelimiter() ch ra mt du phn cch t khc (different token separator). V d ta mun du phn cch t l du phy theo sau l khong trng, dng lnh:
s.useDelimiter(",\\s*");

8.4 Lm vic vi CSDL


8.4.1 JDBC
8.4.1.1 Gii thiu JDBC JDBC l mt API c cha mt tp hp cc lp, cc giao din Java v cc thng bo li ngoi l nm trong cng mt c t m theo c cc cng ty sn xut JDBC driver cng nh cc nh pht trin JDBC u phi tun th cht ch khi pht trin ng dng. SUN chun b v duy tr c t JDBC. Bi JDBC ch l mt c t ( xut cch vit v s dng cc JDBC driver), nn cc cng ty sn xut phn mm bn th ba s pht trin cc JDBC driver tun th cht ch c t ny. Cc nh pht trin JDBC sau s s dng cc driver ny truy cp vo cc ngun d liu. JDBC tn ti l gip cc nh pht trin Java to nn cc ng dng truy xut CSDL m khng cn phi hc v s dng cc API c quyn do cc cng ty sn xut phn mm khc nhau (bn th ba) cung cp. 8.4.1.2 Kin trc JDBC Trong Java c 2 lp ch yu chu trch nhim v thit lp kt ni n mt CSDL: 1. DriverManager - Np cc JDBC driver vo trong b nh. C th s dng n m cc kt ni ti mt ngun d liu. 2. Connection - Gip kt ni n mt ngun d liu. c dng to ra cc i tng Statement, PreparedStatement v CallableStatement. Statement - Biu din mt lnh SQL tnh. C th s dng n thu v i tng ResultSet. PreparedStatement - Mt gii php thay th hot ng tt hn i tng Statement, thc thi mt cu lnh SQL c bin dch trc.

Bin son : Bi Cng Giao --------------------------------------- 157 --------------------------------------

Chng 8: X l vo/ra

CallableStatement biu din mt th tc c lu tr. C th c s dng thc thi cc th tc c lu tr trong mt RDBMS c h tr chng. ResultSet - biu din mt tp kt qu trong CSDL to ra bi vic s dng mt cu lnh SQL l SELECT. SQLException - mt lp x l li ngoi l cha cc li truy cp CSDL. C nhiu loi JDBC driver, nhng y ta ch quan tm n loi m SUN khuyn co s dng v pht trin. y l loi c vit thun ty bng Java v l loi hiu qu nht. Chng cho php kt ni trc tip vo CSDL, cung cp kt qu ti u v cho php lp trnh vin thc hin cc chc nng ty thuc vo CSDL. iu ny to ra tnh c ng cao nht l khi ta cn thay i CSDL bn di mt ng dng. Loi driver ny thng c dng cho cc ng dng phn tn cao. 8.4.2 MySQL v Java MySQL l h qun tr CSDL m ngun m ph bin nht th gii v c cc nh pht trin rt a chung trong qu trnh pht trin ng dng. MySQL min ph hon ton nn ta c th ti v MySQL t trang ch www.mysql.com. 8.4.2.1 Ci t Connector/J - JDBC Driver ca MySQL Sau khi ci MySQL ln my, bc k tip ta ci t Connector/J - JDBC Driver ca MySQL. JDBC Driver ca MySQL c th ly v a ch http://dev.mysql.com/downloads/connector/j. File ti v s l mt file .zip hoc .gz. Sau khi gii nn ta s c mt file c tn tng t nh sau: mysql-connector-java5.1.13.rar. Hy chp file ny vo th mc %JAVA_HOME%/jre/lib/ext trn h thng ca ta. V d:
C:\Program Files\Java\jdk1.6.0_21\jre\lib\ext

Ta cng cn a ng dn n file JAR ny vo bin mi trng MYSQL_DRIVER ca h thng.

MYSQL_DRIVER : C:\Program Files\Java\jdk1.6.0_21\jre\lib\ext\mysql-connectorjava-5.1.13-bin.jar

Bin son : Bi Cng Giao --------------------------------------- 158 --------------------------------------

Chng 8: X l vo/ra

8.4.2.2 Kim tra Connector/J Chng ta to ra mt chng trnh Java nh kim tra xem chng ta ci t ng JDBC driver ca MySQL cha. Nu chng trnh chy thnh cng th ngha l trnh iu khin JDBC sn sng cho cc tc v phc tp hn. Ta to ra mt file Connect.java vi on m sau:
package chuong8; import java.sql.*; public class Connect { public static void main (String[] args) { Connection conn = null; try { String userName = root; String password = localhost; String url = jdbc:mysql://127.0.0.1:3306/mysql; // ng k/Np driver Class.forName (com.mysql.jdbc.Driver).newInstance (); // Thit lp kt ni n CSDL conn = DriverManager.getConnection (url, userName, password); System.out.println (Da ket noi CSDL); // Gi cu lnh SQL v x l kt qu thu v } catch (Exception e) { System.err.println (Khong ket noi duoc); } finally { if (conn != null) { try { conn.close (); System.out.println (Dong ket noi); } catch (Exception e) { /* bo qua loi luc dong CSDL */ } } } }

Bin son : Bi Cng Giao --------------------------------------- 159 --------------------------------------

Chng 8: X l vo/ra }

Trc ht bin dch file ny ra m bytecode nhng chy n, ta cn ch m bo MySQL ang chy. Nu ta ci t MySQL n ch chy khi ta gi th ta hy bt MySQL vi cu lnh mysqld-nt --console hay nu ta ci chng trnh qun tr CSDL ny di hnh thc mt dch v th ta c th g net start mysql trong shell Run trong Windows. on m trn s dng cp tn ngi s dng v mt khu l root/localhost vi CSDL l mysql. Nu kt ni thnh cng, ta s thy mt mn hnh nh di y xut hin. Da ket noi CSDL Dong ket noi 8.4.2.3 Thc hin cc cu truy vn thc hin cu lnh SQL trong mt ng dng c s dng JDBC, ta hy to ra mt i tng Statement t i tng Connection ca ta. i tng ny cha mt kt ni n n CSDL. Cc i tng Statement h tr phng thc executeUpdate() a vo cc cu truy vn thc hin chc nng thay i CSDL v khng tr li tp kt qu, v phng thc executeQuery() to ra cc cu truy vn cho php tr li tp kt qu. minh ha kt qu x l d liu chng ta s dng mt bng, animal, bng ny ha 1 ct id cha s nguyn v 2 ct cha cc chui, name v category. Cu lnh MySQL to bng ny trng nh sau:
CREATE TABLE animal( id INT UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY (id), name CHAR(40), category CHAR(40) )

Ct id c thuc tnh AUTO_INCREMENT tc l gi tr ca n t ng tng thm m khng cn chng ta trc tip can thip, v MySQL t ng gn cc gi tr ni tip nhau 1, 2, 3, mi khi c 1 bn ghi c b sung vo bng. Thc hin cu truy vn khng tr li tp kt qu u tin chng ta to ra mt i tng Statement t i tng Connection, v sau s dng chng to ra v cung cp gi tr cho bng animal. DROP TABLE, CREATE TABLE, UPDATE, DELETE v INSERT u l cc cu lnh thc hin vic thay i CSDL, cho nn phng thc executeUpdate() l phng thc thch hp thc thi chng. Phng thc ny tr li mt s nguyn ch s lng hng trong CSDL

Bin son : Bi Cng Giao --------------------------------------- 160 --------------------------------------

Chng 8: X l vo/ra

b tc ng sau khi thc hin cu truy vn. Trong v d di y, s nguyn ny c gn vo bin count:
Statement s = conn.createStatement (); int count; s.executeUpdate (DROP TABLE IF EXISTS animal); s.executeUpdate ( CREATE TABLE animal ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT, + PRIMARY KEY (id), + name CHAR(40), category CHAR(40))); count = s.executeUpdate (INSERT INTO animal (name, category) VALUES (snake, reptile), (frog, amphibian), (tuna, fish), (racoon, mammal)); s.close(); System.out.println (count + dong da duoc tao ra);

y, bin count c s dng bo li s lng hng m cu lnh INSERT b sung vo bng animal. Mt i tng Statement c th s dng to ra nhiu cu truy vn. Khi thc hin xong cc thao tc trn CSDL, ta hy gi phng thc close() xa i tng v gii phng tt c cc ti nguyn lin kt n n. Nu nh ta mun bit cu lnh SQL c tr li tp kt qu hay khng (v d nh khi ngi s dng nhp cu lnh vo trng nhp liu ca form), bn c th dng phng thc execute() ca i tng Statement. Phng thc ny tr li true nu cu lnh c tr li tp kt qu. Trong trng hp , i tng ResultSet c th c thu hi thng qua phng thc getResultSet() v s lng hng c tc ng c th bit c thng qua phng thc getUpdateCount():
Statement unknownSQL = con.createStatement(); If (unknownSQL.execute(sqlString)) { ResultSet rs = unknownSQL.getResultSet(); // hin th kt qu } else System.out.println(Cac dong da cap nhat: + unknownSQL.getUpdateCount());

Thc thi cc cu truy vn c tr li mt tp kt qu Cc cu lnh truy vn c tr li tp kt qu l cc cu lnh gip chng ta ly ra d liu t CSDL di mt dng thc no . V d cu lnh SELECT ly thng tin t mt CSDL v th khi ta dng phng thc executeQuery(). Sau khi gi phng thc

Bin son : Bi Cng Giao --------------------------------------- 161 --------------------------------------

Chng 8: X l vo/ra

ny, ta hy to ra mt i tng ResultSet v s dng n lp li cc thao tc d liu trn cc hng m cu truy vn tr v. V d sau cho thy cch s dng phng thc ny ly thng tin t bng animal v:
Statement s = conn.createStatement (); s.executeQuery (SELECT id, name, category FROM animal); ResultSet rs = s.getResultSet (); count = 0; while (rs.next ()) { int idVal = rs.getInt (id); String nameVal = rs.getString (name); String catVal = rs.getString (category); System.out.println ( id = + idVal + , name = + nameVal + , category = + catVal); ++count; }

Phng thc executeQuery() khng tr li s nguyn m s hng m n tc ng, do vy nu ta mun bit mt tp kt qu cha bao nhiu hng th ta cn t mnh m ly khi ta thc thi thao tc ly d liu trn tng hng. ly c cc gi tr ca ct trn tng hng, th ta hy gi cc phng thc getXXX(),trong XXX i din cho kiu gi tr ca ct. Chng hn, cc phng thc getInt() v getString() c s dng trong v d trn tr li cc gi tr chui v s nguyn. Nh trnh by, cc phng thc ny c th c gi bng cch s dng tn ca mt ct nm trong tp kt qu. Ta cng c th ly cc gi tr v t v tr ca chng. i vi tp kt qu ly v t cu truy vn SELECT trong v d trn, id, name, v category nm cc v tr ct 1, 2 v 3 v do vy c th ly v theo cch sau:
int idVal = rs.getInt (1); String nameVal = rs.getString (2); String catVal = rs.getString (3);

Cc i tng ResultSet, cng nh cc i tng Statement, nn c ng li khi ta dng xong chng. kim tra xem liu gi tr ca mt ct no c l NULL hay khng, ta hy gi phng thc wasNull() ca i tng cha tp kt qu sau khi ly gi tr v. V d, ta c th kim tra gi tr NULL nm trong ct name nh sau:
String nameVal = rs.getString (name);

Bin son : Bi Cng Giao --------------------------------------- 162 --------------------------------------

Chng 8: X l vo/ra if (rs.wasNull ()) nameVal = (khong ten);

S dng k t gi ch Thnh thong ta cn xy dng mt cu truy vn vi cc gi tr c cha cc k t cn c x l c bit. V d, trong cc cu truy vn, cc gi tr dng chui c vit bn trong cc du trch dn n, nhng bt c k t trch dn n no nm trong chnh chui u cn phi c bin thnh du trch dn kp hoc phi c chuyn v (escaped) bng k t \ trnh to ra cc cu SQL hot ng sai mc ch. Trong trng hp ny, cch d dng hn c l ta hy JDBC x l vn chuyn v ny cho ta, ch khng nn t mnh lm ly. lm c iu , ta hy to ra mt kiu lnh khc (mt lnh PreparedStatement), tham chiu n cc gi tr d liu nm trong chui truy vn di hnh thc cc k t gi ch (placeholders). Sau bo cho JDBC bit lin kt cc gi tr d liu vo cc k t gi ch ny v n s x l mt cch t ng bt c mt k t c bit no. Gi s ta c hai bin c tn l nameVal v catVal dng cha cc gi tr s chn vo trong bng animal. lm c iu m khng cn quan tm n vic liu cc bin c cha cc k t c bit hay khng, ta hy to ra mt cu truy vn kiu nh th ny:
PreparedStatement s; s = conn.prepareStatement ( INSERT INTO animal (name, category) VALUES(?,?)); s.setString (1, nameVal); s.setString (2, catVal); int count = s.executeUpdate (); s.close (); System.out.println (count + dong da duoc chen);

Cc k t ? nm trong chui truy vn ng vai tr l cc k t gi ch--cc k t nh du c bit nhm xc nh ni cc gi tr d liu cn c t vo . Phng thc setString() nhn thng tin v v tr ca k t gi ch v mt gi tr dng chui ri gn kt gi tr vo k t gi ch thch hp, thc thi bt c thao tc chuyn v no cn thit. Phng thc m ta s dng gn kt mt gi tr ty thuc vo kiu d liu. V d, setString() gn gi tr dng chui v setInt() gn cc gi tr dng s nguyn. X l li Nu ta mun by li, hy thc thi cc thao tc JDBC bn trong khi try v s dng mt b x l li ngoi l hin th thng tin v nguyn nhn gy ra vn c th xut hin. JDBC cung cp cc phng thc getMessage() v getErrorCode() m khi li xut hin ta c th s dng bit c thng bo li v m li dng s. V d sau c

Bin son : Bi Cng Giao --------------------------------------- 163 --------------------------------------

Chng 8: X l vo/ra

tnh dng mt cu truy vn mc li. Khi thc thi, phng thc executeQuery() s khng th x l c v pht sinh mt li ngoi l. Li ny s c thu v thng qua khi catch, trong khi ny ta c th cha m lnh x l li hay ch n gin l hin th thng bo li v m li:
try { Statement s = conn.createStatement (); s.executeQuery(XYZ); // to ra cu truy vn khng hp l s.close(); } catch( SQLException e) { System.err.println (Thong bao loi: + e.getMessage()); System.err.println (Ma loi: + e.getErrorCode()); }

TNG KT CHNG 8
Trong chng ny cc vn sau c trnh by: Th no l lung d liu C ba lung d liu: byte, k t v c b m. i tng scanner qut lung d liu vo v chuyn thnh cc d liu vi kiu xc nh t qui cch d liu xut ra bng formatting. M t vo ra trong ch dng lnh qua hai c ch: qua lung chun v i tng Console Th no l JDBC Lm vic vi CSDL MySQL

BI TP
1. in cc t thch hp vo cc cu sau: a. ---------- l cc dn ng (pipelines) gi v nhn thng tin trong cc chng trnh Java. b. ----------- l lung li chun. c. Phng thc ------------- c cc byte d liu t mt lung. d. -------------- lu gi d liu tm thi trc khi nhp/xut ti ch (destination). e. Phng thc ------------ x sch lung. f. Nhp/xut mng byte s dng cc lp ------------ v --------------------2. Vit mt chng trnh nhn mt dy k t ring l, cch nhau bi khong trng t

Bin son : Bi Cng Giao --------------------------------------- 164 --------------------------------------

Chng 8: X l vo/ra

ca s dng lnh ri ni chng vi nhau thnh mt t, v d nh sau: java Glue B A N A N A th chng trnh xut ra: BANANA vi khng c khong trng 3. Vit mt chng trnh nhn mt cu t dng lnh v xut ra kt qu thng k cu ny, v d nh sau: java SentenceStatistics this is my sample sentence th chng trnh xut ra: number of words: 5 longest word(s): sentence length of longest word(s): 8 shortest word(s): is my length of shortest word(s): 2 cho n gin khng dng bt k du ngt (punctuation) trong cu. 4. Vit chng trnh xut ra d liu t bng animal.

Bin son : Bi Cng Giao --------------------------------------- 165 --------------------------------------

Chng 9: Lp trnh giao din

Chng 9.

Lp trnh giao din

Ni dung chng ny nhm gii thiu: Lp trnh giao din vi cc i tng c bn v vi cc i tng multimedia. Lp trnh giao din vi HTML&Applet Lp trnh giao din vi SWING

9.1 Giao din vi cc i tng c bn


Trong mc ny, chng ta s tm hiu v s dng cc i tng c bn ca lp trnh giao din trong Java: Cc i tng khung cha (container) c bn: Frame, Panel, Dialog. Cc i tng thnh phn (component) c bn: Button, Label, TextField, TextArea Cc s kin c bn ca cc i tng. Mun s dng cc i tng ny, cn thm lnh s dng th vin AWT ca Java:
import java.awt.*;

9.1.1 Cc i tng container c bn


Cc i tng container c dng cha cc i tng thnh phn khc. Cc lp i tng ny c mt s phng thc chung nh sau: add(Object): thm mt i tng (kiu component) vo container. remove(Object): loi b mt i tng ra khi container. removeAll(): loi b tt c cc i tng m container ang cha. getComponent(int): tr v i tng thnh phn c ch s l tham s u vo. Container qun l cc i tng cha trong n di dng mng. Ch s ca cc thnh phn l s th t khi thnh phn c thm vo container. getComponents(): tr v mng tt c cc i tng m container ang cha.

countComponents(): tr v s lng cc i tng m container ang cha.

9.1.1.1 Frame Frame l mt i tng c th dng mt cch c lp, hoc c gn vo mt i tng khc nh mt i tng conponent bnh thng. Thng thng, Frame c dng nh mt ca s ca mt chng trnh c lp. Cc phng thc c bn ca lp Frame: Frame(): khi to khng tham s. Frame(String): khi to vi tham s l dng tiu ca frame.

Bin son : Bi Cng Giao --------------------------------------- 166 --------------------------------------

Chng 9: Lp trnh giao din

setSize(int, int): nh kch c ca frame, tham s tng ng l chiu rng v chiu cao ca frame. setVisible(boolean): cho php frame xut hin hay n i trn mn hnh. setTitle(String)/getTitle(): truy nhp thuc tnh dng tiu ca frame. setResizable(boolean): thit lp thuc tnh cho php thay i kch c frame. setIconImage(Image): thit lp nh icon gc trn (biu tng) ca frame. Chng trnh FrameDemo minh ho vic s dng mt i tng ca lp Frame.
package chuong9; import java.awt.*; public class FrameDemo { public static void main(String[] args) { // Khai bo v khi to frame c tiu Frame myFrame = new Frame(This is my Frame!); myFrame.setSize(300,150); // nh kch c frame myFrame.setVisible(true); // Hin th frame } }

Hnh 9.1 Kt qu demo Frame 9.1.1.2 Panel Panel cng l mt dang khung cha, nhng kh n gin. Panel ch dng nhm cc i tng giao din vi nhau. Thng thng, panel c dng trong mt ca s ca Frame hoc mt ng dng khc. Cc phng thc c bn ca lp Panel, ngoi cc phng thc chung ca container: Panel(): Khi to khng tham s. Chng trnh PanelDemo minh ho vic s dng mt Panel trong mt Frame.
package chuong9; import java.awt.*; public class PanelDemo { public static void main(String[] args) {

Bin son : Bi Cng Giao --------------------------------------- 167 --------------------------------------

Chng 9: Lp trnh giao din // Khai bo v khi to frame c tiu Frame myFrame = new Frame(Frame has a panel!); myFrame.setSize(300,150); // nh kch c frame Panel myPanel = new Panel();// Khai bo panel myFrame.add(myPanel); // Thm panel vo frame myFrame.setVisible(true); // Hin th frame } }

Hnh 9.2 Kt qu demo Panel 9.1.1.3 Dialog Dialog l mt i tng ca s con ca mt ca s chng trnh chnh. Do vy, Dialog ch c s dng km vi mt Frame. C hai dng Dialog: Modal: khi hin ca s dialog, cc ca s khc ca chng trnh s b kho li, khng thao tc c, ch thao tc c trn ca s dialog. Non-modal: khng kho cc ca s khc. Khi dialog xut hin, ngi dng vn c th chuyn sang thao tc trn cc ca s khc, nu cn. Cc phng thc c bn ca lp Dialog: Dialog(Frame, boolean): Khi to dialog, tham s th nht l frame cha dialog, tham s th hai xc nh dialog c l modal hay khng. Dialog(Frame, String, boolean): Khi to dialog, thm tham s th hai l dng tiu ca dialog. setVisible(boolean): Thit lp trng thi hin th hoc n dialog trn mn hnh. setSize(int, int): nh kch c cho dialog, cc tham s tng ng l chiu rng v chiu cao ca dialog. setTitle(String)/getTitle(): Truy nhp thuc tnh dng tiu ca dialog. setResizable(boolean): Thit lp thuc tnh cho php thay i kch c ca dialog. setLayout(Layout): Thit lp ch hin th cc i tng cha trong dialog. Chng trnh DialogDemo minh ho vic thm mt dialog (ang rng, cha c i tng thnh phn no) vo mt frame.

Bin son : Bi Cng Giao --------------------------------------- 168 --------------------------------------

Chng 9: Lp trnh giao din package chuong9; import java.awt.*; public class DialogDemo { public static void main(String[] args) { // Khai bo v khi to frame c tiu Frame myFrame = new Frame(Frame has a dialog!); myFrame.setSize(300,150); // nh kch c frame // Khai bo v khi to dialog Dialog myDialog = new Dialog(myFrame, An empty dialog!, true); myDialog.setSize(300,150); // nh kch c dialog myDialog.setVisible(true); // Hin th dialog } }

Hnh 9.3 Kt qu demo Dialog

9.1.2 Cc i tng component c bn


Cc i tng component c dng lm thnh phn ca cc i tng khung cha, chng khng th dng c lp, m lun phi gn vo trong mt i tng khung cha container. 9.1.2.1 Label Label (nhn) l mt i tng hin th vn bn tnh, nhng vn bn m ngi dng khng th thay i trc tip c. Cc phng thc c bn ca Label: Label(): Khi to mt nhn rng. Label(String): Khi to mt nhn vi ni dung vn bn l tham s u vo. Label(String, int): Khi to mt nhn c ni dung sn, tham s th hai xc nh cch cn l ca nhn so vi khung cha, bao gm {Label.CENTER, Label.LEFT, Label.RIGHT}. setText(String)/getText(): Truy nhp ni dung vn bn ca nhn. setAlignment(int)/getAlignment(): Truy nhp thuc tnh cn l ca nhn. setFont(Font): nh dng phng ch ca nhn. Chng trnh LabelDemo minh ho vic s dng nhn trong mt frame.

Bin son : Bi Cng Giao --------------------------------------- 169 --------------------------------------

Chng 9: Lp trnh giao din package chuong9; import java.awt.*; public class LabelDemo { public static void main(String[] args) { // Khai bo v khi to frame c tiu Frame myFrame = new Frame(Frame has a label!); myFrame.setSize(300,150); // nh kch c frame // Khai bo v khi to label Label myLabel = new Label(); myLabel.setText(This is a label!);//Gn ni dung vn bn myLabel.setAlignment(Label.CENTER);// Cn l gia myFrame.add(myLabel); // Gn label vo frame myFrame.setVisible(true); // Hin th frame } }

Hnh 9.4 Kt qu demo Label 9.1.2.2 TextField v TextArea y l hai i tng dng biu din vn bn v ngi dng c th thay i ni dung vn bn cha trong chng. im khc bit l TextField ch cho php mt dng vn bn, trong khi TextArea cho php cha nhiu dng vn bn. Cc phng thc chung ca hai lp ny: setText(String)/getText(): Truy nhp thuc tnh ni dung vn bn cha trong . getSelectedText(): Tr v chui vn bn c bi en (nh du chn) trong . getSelectedStart(): Tr v v tr k t u trong vng c nh du chn (tnh t 0). getSelectedEnd(): Tr v v tr k t cui trong vng c nh du chn (tnh t 0). selectAll(): nh du chn ton vn bn. setEditable(boolean): Xc nh vng vn bn c th edit c hay khng. Cc phng thc khc ca lp TextField: TextField(): Khi to mt vn bn rng.

Bin son : Bi Cng Giao --------------------------------------- 170 --------------------------------------

Chng 9: Lp trnh giao din

TextField(int): Khi to mt vn bn rng, rng xc nh bi tham s vo. TextField(String): Khi to mt vn bn c ni dung xc nh bi tham s u vo. TextField(String, int): Khi to vi ni dung c sn, rng xc nh. setEchoChar(char)/getEchoChar(): Truy nhp thuc tnh l k t thay th vn bn trong . Thuc tnh ny c dng khi ta cn che du thng tin vn bn, v d, g mt khu ca chng trnh. getColums(): Tr v rng ca vn bn. Cc phng thc khc ca lp TextArea: TextArea(): Khi to mt vng vn bn rng. TextArea(int, int): Khi to mt vng vn bn rng, kch c (s dng, s ct) xc nh bi tham s vo. TextArea(String): Khi to mt vng vn bn c ni dung xc nh bi tham s u vo. TextArea(String, int, int): Khi to vng vn bn vi ni dung c sn, rng xc nh. appendText(String): Thm mt on vn bn vo cui on vn bn trong vng. insertText(String, int): Chn mt on vn bn vo v tr xc nh (tham s th hai) ca vng vn bn. replaceText(String, int, int): Thay th mt on vn bn trong vng, nh du bng v tr bt u v v tr kt thc (tham s th hai v th ba), bng mt on vn bn mi (tham s th nht). getRows()/getColums(): Tr v s dng/ct ca vng vn bn. Chng trnh TextDemo minh ho vic t cc i tng vn bn v vng vn bn vo mt frame.
package chuong9; import java.awt.*; public class TextDemo { public static void main(String[] args) { // Khai bo v khi to frame c tiu Frame myFrame = new Frame(Frame has some texts!); myFrame.setSize(300,150); // nh kch c frame

Bin son : Bi Cng Giao --------------------------------------- 171 --------------------------------------

Chng 9: Lp trnh giao din

// Khai bo v khi to textField TextField myTextField = new TextField(A text field!); myFrame.add(myTextField); // Gn vo frame // Khai bo v khi to textArea TextArea myTextArea = new TextArea(5, 40); String str=The TextFields columns is: +myTextField.getColumns(); str += The TextAreas size is: + myTextArea.getRows() + * + myTextArea.getColumns(); myTextArea.setText(str); // Thit lp ni dung myFrame.add(myTextArea); // Gn vo frame myFrame.setVisible(true); // Hin th frame } }

Hnh 9.5 Kt qu demo Text 9.1.2.3 Button Button l i tng nt lnh, dng thc hin mt nhim v xc nh. Cc phng thc c bn ca nt nhn: Button(String): Khi to nt nhn vi tn xc nh trn nt. setLabel(String)/getLabel(): Truy nhp tn ca nt nhn. Chng trnh ButtonDemo minh ho vic to mt nt nhn trong mt frame.
package chuong9; import java.awt.*; public class ButtonDemo { public static void main(String[] args) { // Khai bo v khi to frame c tiu Frame myFrame = new Frame(Frame has a button!); myFrame.setSize(300,150); // nh kch c frame // Khai bo v khi to button

Bin son : Bi Cng Giao --------------------------------------- 172 --------------------------------------

Chng 9: Lp trnh giao din Button myButton = new Button(Click!); myFrame.add(myButton); // Gn vo frame myFrame.setVisible(true); // Hin th frame } }

Hnh 9.6 Kt qu demo Button Tuy nhin, khi click vo nt nhn ny, khng xy ra iu gi c. L do l chng ta cha ci t vic x l s kin cho nt nhn. Phn sau s trnh by vic x l s kin cho cc i tng.

9.1.3 X l s kin
Khi mi i tng component c to n c kh nng pht ra s kin khi ngi dng giao tip vi n. Ngi lp trnh phi xc nh vic phn ng nh th no vi mt s s kin cn quan tm sinh ra t i tng ny. K thut ny gi l x l s kin. Hai bc x l s kin : 1. To mt i tng listenner c th nghe v phn ng vi cc kiu s kin c bit t i tng component. V d phn ng ti vic click mt Button m pht ra ActionEvents, ta phi to mt ActionListener m c kh nng lng ghe v phn ng ti ActionEvents. 2. Ta phi ng k i tng listenner vi i tng component ny. Khi x l s kin, xc nh s kin pht sinh t component no, ta dng phng thc getSource():
<Kiu component> <i tng s kin>.getSource();

Cc kiu s kin c bn ActionEvent: xut hin khi mt nt b click vo, mt danh sch (list) c chn, mt menu c chn. ComponentEvent: xut hin khi mt component b thay i kch c, v tr, trng thi. FocusEvent: xut hin khi mt component c hoc mt focus. ItemEvent: xut hin khi mt menu item c chn hoc b, khi checkbox hoc list item c click vo. WindowEvent: xut hin khi mt ca s c m ra, kch hot, ng li hoc thot ra.

Bin son : Bi Cng Giao --------------------------------------- 173 --------------------------------------

Chng 9: Lp trnh giao din

TextEvent: xut hin khi gi tr vn bn ca cc i tng TextField v TextArea b thay i. MouseEvent: xut hin khi chut c click, di chuyn qua, nhn xung v th ra. KeyEvent: xut hin khi c u vo t bn phm. Cc giao tip c ci t x l cc s kin trn: ActionListener. ComponentListener FocusListener ItemListener WindowListener TextListener MouseListener v MouseMotionListener KeyListener Cch to v ng k Listeners Trc ht ta tm hiu cch khai bo lp trong c tn nh sau:
public class OuterClass { // Khai bo thuc tnh ca lp ngoi, b qua chi tit // Khai bo lp trong trong thn ca lp ngoi. class InnerClass { // Khai bo thuc tnh v phng thc ca lp trong, b qua chi tit. } // Kt thc lp trong public void someMethodOfOuterClass() { /* Ta c th to mt i tng kiu InnerClass bn trong ca bt k phng thc OuterClass. Nu InnerClass c tham chiu t bt k ni no khc trong ng dng th trnh bin dch s bo li "symbol not found" */ InnerClass x = new InnerClass(); } }

Ch : khi bin dch c hai tp tin c to ra: OuterClass.class v OuterClass$InnerClass.class. Trong vic to v ng k Listener ta dng k thut lp trong khng tn (anonymous inner class). Lp trong khng tn v bn cht ging nh lp trong c tn nhng ngoi

Bin son : Bi Cng Giao --------------------------------------- 174 --------------------------------------

Chng 9: Lp trnh giao din

tr vic khng c tn. to lp lp Listener in hnh nh ActionListener ta phi thc hin mt giao din ActionListener. Giao din ny c mt phng thc actionPerformed c tiu nh sau:
void actionPerformed(ActionEvent e)

Phng thc ny s phn ng ti vic nghe mt ActionEvent. Ta to mt lp trong khng tn da theo c php lp trong c tn: u tin to mt i tng kiu ActionListener
ActionListener l = new ActionListener();

Tuy nhin v ActionListener l mt giao din nn khng th to i tng kiu ActionListener trc tip. Ci m ta cn l to mt i tng ca lp X no m thc hin giao din ActionListener:
ActionListener l = new X();

vi X c khai bo nh sau:
class X implements ActionListener { // Phi nh ngha phng thc actionPerformed ca ActionListener public void actionPerformed(ActionEvent e) { // chi tit b qua } }

Gi s ta c th chen ton b khai bo ca lp X gia ) v ; ca khai bo


ActionListener l = nh sau: ActionListener l = new ActionListener() class X implements ActionListener { ... };

Nhn xt du ; sau } ca cu lnh phc tp ny. Bnh thng khng c du ; sau } nhng y l trng hp c bit ; kt thc cu lnh n bt u vi
ActionListener l = ....

Gi s lp X khng c tn, ch c phn thn


ActionListener l = new ActionListener() { public void actionPerformed(ActionEvent e) { // b qua chi tit } }; // ng qun du ;

Bin son : Bi Cng Giao --------------------------------------- 175 --------------------------------------

Chng 9: Lp trnh giao din

Lp WindowListener Khi chy mt ng dng GUI, ta click vo gc trn bn phi ca ca s, ca s ng li nhng chng trnh vn cn chy, v vn chim ti nguyn h thng. kt thc chng trnh hon ton ta cn thc hin: To mt WindowListener v ng k cho ca s chng trnh. To lnh cho phng thc windowClosing ca WindowListener ng chng trnh System.exit(0).
exit(int status) l phng thc tnh ca lp System kt thc tng minh my

o Java. M 0 tr v bo hiu khng c li. Cc chng trnh chy ch dng lnh n lung th khng cn c lnh System.exit(0). Ch : WindowListener c 7 phng thc, thng thng ta ch quan tm n windowClosing, nn thng s c on lnh sau:
WindowListener w = new WindowListener() { public void windowClosing(WindowEvent e) { //. System.exit(0); } // cc phng thc sau c nh ngha nhng khng lm g public void windowOpened(WindowEvent e) { } public void windowClosed(WindowEvent e) { } public void windowIconified(WindowEvent e) { } public void windowDeiconified(WindowEvent e) { } public void windowActivated(WindowEvent e) { } public void windowDeactivated(WindowEvent e) { } };

trnh rm r, Java c cc lp Adapter c tc dng tng ng on lnh trn:


WindowListener w = new WindowAdapter() { public void windowClosing(WindowEvent e) { //. System.exit(0); } };

Bin son : Bi Cng Giao --------------------------------------- 176 --------------------------------------

Chng 9: Lp trnh giao din

Tng t ta c cc on lnh tng ng:


MouseListener m = new MouseListener() { public void mouseClicked (MouseEvent e) { // b qua chi tit } // cc phng thc sau c nh ngha nhng khng lm g public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } };

tng ng:
MouseListener m = new MouseAdapter() { public void mouseClicked (MouseEvent e) { // b qua chi tit } };

Nhn xt rng mi giao din XxxListener c mt lp XxxAdapter tng ng ch tr ActionListener khng c ActionAdapter v ActionListener ch c mt phng thc l actionPerformed. Chng trnh EventDemo ci t mt ng dng hon chnh, bao gm: Hai nhn tiu cho hai vn bn. Hai vn bn, nhp s liu vo. Bn nt nhn tng ng thc hin cc thao tc nhn, chia, cng, tr cc s liu nhp t hai vn bn. Thm mt nt nhn, khi click vo s thot khi chng trnh (chng trnh kt thc).
package chuong9; import java.awt.*; import java.awt.event.*; public class EventDemo extends Frame implements ActionListener { Label lbl1, lbl2, lblKq; TextField txt1, txt2;

Bin son : Bi Cng Giao --------------------------------------- 177 --------------------------------------

Chng 9: Lp trnh giao din Button btnCong, btnTru, btnNhan, btnChia, btnThoat; public EventDemo() { super(Event demo!); this.setLayout(new GridLayout(6,2)); //Ch hin th 6 dng, 2 ct lbl1 = new Label(So thu nhat:); // Nhn s th nht this.add(lbl1); txt1 = new TextField(); // vn bn s th nht this.add(txt1); lbl2 = new Label(So thu hai:); // Nhn s th hai this.add(lbl2); txt2 = new TextField(); // vn bn s th hai this.add(txt2); lblKq = new Label(); // Nhn kt qu this.add(lblKq); this.add(new Label()); // Cc nt nhn btnCong = new Button(Cong); // Nt cng btnCong.addActionListener(this); // Bt s kin this.add(btnCong); btnTru = new Button(Tru); // Nt tr btnTru.addActionListener(this); this.add(btnTru); btnNhan = new Button(Nhan); // Nt nhn btnNhan.addActionListener(this); this.add(btnNhan); btnChia = new Button(Chia); // Nt chia btnChia.addActionListener(this); this.add(btnChia); btnThoat = new Button(Thoat); // Nt thot btnThoat.addActionListener(this); this.add(btnThoat); // Phng thc bt s kin click vo nt ng frame this.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } });

Bin son : Bi Cng Giao --------------------------------------- 178 --------------------------------------

Chng 9: Lp trnh giao din } // Phng thc x l s kin nt c nhn public void actionPerformed(ActionEvent ae) { try { float x = Float.parseFloat(txt1.getText()); float y = Float.parseFloat(txt2.getText()); float kq = 0; if (ae.getSource() == btnCong) // Cng hai s kq = x + y; if (ae.getSource() == btnTru) // Tr hai s kq = x - y; if (ae.getSource() == btnNhan) // Nhan hai s kq = x*y; if ((ae.getSource() == btnChia) && (y != 0)) // Chia hai s kq = x/y; lblKq.setText(Ket qua la: + String.valueOf(kq)); } catch (Exception ex) { lblKq.setText(Nhap sai); return; } if (ae.getSource() == btnThoat) // Thot khi chng trnh System.exit(0); // Thay i ni dung kt qu } public static void main(String[] args) { // Khai bo i tng demo EventDemo myFrame = new EventDemo(); myFrame.setSize(300,150); // nh kch c frame myFrame.setVisible(true); // Hin th frame } }

Hnh 9.7 Kt qu demo s kin

Bin son : Bi Cng Giao --------------------------------------- 179 --------------------------------------

Chng 9: Lp trnh giao din

9.2 Giao din vi cc i tng Multimedia


Ni dung phn ny s tp trung trnh by cc i tng multimedia, bao gm: nh du (Checkbox) v Nt chn (Radio button) La chn (Choice) Danh sch (List) 9.2.1 nh du v nt chn Checkbox v Radio button l cc i tng dng nh du, hoc chn thng tin. S khc bit gia chng l checkbox cho php chn ng thi nhiu cng lc, trong khi , trong mi nhm radio button, ch cho php chn mt thng tin. Phng thc chung ca hai lp ny: setState(boolean)/getState(): truy nhp n trng thi ca nt. Cc phng thc xy dng Checkbox: Checkbox(): khi to mt nh du rng. Checkbox(String): khi to nh du c nhn xc nh. Checkbox(String, boolean): khi to nh du c nhn, c trng thi xc nh. Cc phng thc xy dng Radio button tng t nh Checkbox, ngoi tr vic phi ch ra nhm ca cc radio button: Checkbox(String, boolean, CheckboxGroup); Checkbox(String, CheckboxGroup, boolean); X l s kin thay i trng thi nt chn: Kiu s kin: ItemEvent Ci t giao tip: ItemListener Phng thc xa l: itemStateChange(ItemEvent) Chng trnh RadioDemo minh ho vic dng mt nhm radio button gm ba nt, tng ng vi ba mu (RED, BLUE, GREEN). Khi click vo nt no, th mu phn t s hin ln.
package chuong9; import java.awt.*; import java.awt.event.*; public class RadioDemo extends Frame implements ItemListener { Checkbox cbxRed, cbxBlue, cbxGreen; public RadioDemo() { super(Radio demo!);

Bin son : Bi Cng Giao --------------------------------------- 180 --------------------------------------

Chng 9: Lp trnh giao din // Ch hin th 3 dng, 1 ct this.setLayout(new GridLayout(3,1)); CheckboxGroup cbxg = new CheckboxGroup(); // Nhm radio cbxRed = new Checkbox(Red, cbxg, true); // Nt red cbxRed.addItemListener(this); // Bt s kin this.add(cbxRed); cbxBlue = new Checkbox(Blue, cbxg, false);// Nt blue cbxBlue.addItemListener(this); // Bt s kin this.add(cbxBlue); cbxGreen = new Checkbox(Green, cbxg, false);// Nt green cbxGreen.addItemListener(this); // Bt s kin this.add(cbxGreen); // Phng thc bt s kin click vo nt ng frame this.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } // Phng thc x l s kin thay i trng thi nt public void itemStateChanged(ItemEvent ie) { if(ie.getStateChange() == ItemEvent.SELECTED) { String item = (String)ie.getItem(); if (item.equals("Red")) { // i mu red cbxRed.setBackground(Color.red); cbxBlue.setBackground(Color.white); cbxGreen.setBackground(Color.white); } if (item.equals("Blue")) { // i mu blue cbxRed.setBackground(Color.white); cbxBlue.setBackground(Color.blue); cbxGreen.setBackground(Color.white); } if (item.equals("Green")) { // i mu green cbxRed.setBackground(Color.white);

Bin son : Bi Cng Giao --------------------------------------- 181 --------------------------------------

Chng 9: Lp trnh giao din cbxBlue.setBackground(Color.white); cbxGreen.setBackground(Color.green); } this.repaint(); // V li mu nn } } public static void main(String[] args) { // Khai bo i tng demo RadioDemo myFrame = new RadioDemo(); myFrame.setSize(300,150); // nh kch c frame myFrame.setVisible(true); // Hin th frame } }

Hnh 9.8 Kt qu demo Radio Button

9.2.2 La chn
Choice l i tng menu s xung, hin th mt danh sch cc item v cho php ngi dng chn mt trong s cc item (tng t i tng dropdown list ca window). Cc phng thc c bn ca lp Choice: Choice(): khi to i tng choice. addItem(String): thm mt item vo danh sch la chn. remove(int): xo item v tr th i trong danh sch (bt u l v tr 0). removeAll(): xo ton b item trong danh sch chn. select(int)/select(String): chn mt item theo s th t hoc theo tn. getSelectedIndex(): tr v ch s ca item c chn. getSelectedItem(): tr v tn ca item c chn. getItem(int): tr v tn ca item tng ng vi s th t a vo. X l s kin thay i trng thi nt chn: Kiu s kin: ItemEvent Ci t giao tip: ItemListener Phng thc x l: itemStateChange(ItemEvent) Chng trnh ChoiceDemo thay i mu nn theo phn t trong la chn c chn.

Bin son : Bi Cng Giao --------------------------------------- 182 --------------------------------------

Chng 9: Lp trnh giao din

package chuong9; import java.awt.*; import java.awt.event.*; public class ChoiceDemo extends Frame implements ItemListener { Choice myChoice; public ChoiceDemo() { super(Choice demo!); myChoice = new Choice(); // Khi to myChoice.addItem(Red); // Thm item red myChoice.addItem(Blue); // Thm item blue myChoice.addItem(Green); // Thm item green myChoice.addItemListener(this); // Bt s kin this.add(myChoice); // Gn vo frame // Phng thc bt s kin click vo nt ng frame this.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } // Phng thc x l s kin thay i trng thi item public void itemStateChanged(ItemEvent ie) { if (ie.getStateChange() == ItemEvent.SELECTED) { String item = (String)ie.getItem(); if(item.equals(Red)) // i mu red this.setBackground(Color.red); if(item.equals(Blue)) // i mu blue this.setBackground(Color.blue); if(item.equals(Green)) // i mu green this.setBackground(Color.green); this.repaint(); // V li mu nn } } public static void main(String[] args) {

Bin son : Bi Cng Giao --------------------------------------- 183 --------------------------------------

Chng 9: Lp trnh giao din // Khai bo i tng demo ChoiceDemo myFrame = new ChoiceDemo(); myFrame.setSize(300,150); // nh kch c frame myFrame.setVisible(true); // Hin th frame } }

Hnh 9.9 Kt qu demo Choice Button

9.2.3 Danh sch


List l mt danh sch hot ng tng t i tng choice. Tuy nhin, list cho php ngi dng c th chn mt hoc nhiu item cng mt lc. Cc phng thc c bn ca lp List: List(): khi to mt danh sch rng, mi ln ch c chn mt item. List(int): tng t, nhng c qui nh s dng c nhn thy. List(int, boolean): khi to mt danh sch c s dng c nhn thy xc nh, ch cho php chn mt hay nhiu item xc nh bi tham s th hai. add(String): thm mt item vo danh sch. add(String, int): chn mt item vo v tr xc nh trong danh sch. Nu ch s chn vt ra khi phm vi danh sch, item s c thm vo cui. replaceItem(String, int): thay th mt item v tr xc nh (tham s th hai) trong danh sch bng mt item mi (tham s th nht). remove(int): xo item v tr xc nh trong danh sch. removeAll(): xo ton b item hin c ca danh sch. getSeletedIndex(): tr v index ca item c chn (danh sch n chn). getSelectedItem(): tr v item c chn (danh sch n chn). getSelectedIndexs(): tr v ch s cc item c chn (danh sch a chn). getSelectedItems(): tr v cc item c chn (danh sch a chn). X l s kin khi thay i item c chn: Kiu s kin: ItemEvent Ci t giao tip: ItemListener Phng thc x l: itemStateChange(ItemEvent);

Bin son : Bi Cng Giao --------------------------------------- 184 --------------------------------------

Chng 9: Lp trnh giao din

Chng trnh ListDemo minh ho vic s dng i tng list vi kh nng a chn. Mi khi thay i item c chn, mt thng bo cc mu c chn s hin ra.
package chuong9; import java.awt.*; import java.awt.event.*; public class ListDemo extends Frame implements ItemListener { List myList; Label lbl; public ListDemo() { super(List demo!); // Khi to list a chn, ch nhn c mt dng myList = new List(1, true); myList.setSize(300,150); // Thm cc item l cc loi mu sc myList.add(White); myList.add(Red); myList.add(Orange); myList.add(Green); myList.add(Yellow); myList.add(Blue); myList.add(Black); myList.addItemListener(this); // Bt s kin this.setLayout(new GridLayout(2, 1)); this.add(myList); // Gn vo frame lbl = new Label(); // Khi to nhn this.add(lbl); // Gn vo frame // Phng thc bt s kin click vo nt ng frame this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e){ System.exit(0); } }); } // Phng thc x l s kin thay i trng thi item public void itemStateChanged(ItemEvent ie) {

Bin son : Bi Cng Giao --------------------------------------- 185 --------------------------------------

Chng 9: Lp trnh giao din if ((ie.getStateChange() == ItemEvent.SELECTED) || (ie.getStateChange() == ItemEvent.DESELECTED)) { String kq = Cac mau duoc chon:; String[] items = myList.getSelectedItems(); for(int i=0; i<items.length; i++) kq += items[i] + , ; lbl.setText(kq); } } public static void main(String[] args) { // Khai bo i tng demo ListDemo myFrame = new ListDemo(); myFrame.setSize(300,150); // nh kch c frame myFrame.setVisible(true); // Hin th frame } }

Hnh 9.10 Kt qu demo Listbox

9.3 Cc k thut trnh by


Ni dung phn ny s tp trung trnh by cc k thut trnh by cc i tng giao din trn frame theo cc thit k khc nhau bng cch dng b qun l trnh by. Bao gm cc k thut sau: Trnh by theo dng (Flow layout) Trnh by theo bng (Grid layout) Trnh by theo Border (Border layout) Trnh by theo GridBag (GridBag layout) Trnh by t do (Null layout)

9.3.1 Trnh by Flow Layout


Cch trnh by Flow Layout s xp cc i tng trn mt hng theo dng. Nu i tng mi thm khng ch (chiu rng) th n s t ng thm vo u dng mi. Cc phng thc:

Bin son : Bi Cng Giao --------------------------------------- 186 --------------------------------------

Chng 9: Lp trnh giao din

FlowLayout(): khi to i tng trnh by. FlowLayout(int): khi to i tng trnh by vi cch cn l xc nh. FlowLayout(int, int, int): khi to vi ba tham s: Th nht l cch cn l, th hai l khong cch gia hai dng (chiu cao), th ba l khong cch gia hai i tng (chiu ngang). Tham s cn l c th nhn mt trong ba gi tr: FlowLayout.LEFT: cn l tri, l gi tr mc nh. FlowLayout.CENTER: cn l gia. FlowLayout.RIGHT: cn l phi. Chng trnh FlowLayoutDemo minh ho cch trnh by flow layout: To ra mt dy 10 nt nhn v gn vo mt frame theo kiu flow layout.
package chuong9; import java.awt.*; public class FlowLayoutDemo { public static void main(String[] args) { // Khai bo v khi to frame c tiu Frame myFrame = new Frame(Frame has somes buttons!); myFrame.setSize(300,150); // nh kch c frame myFrame.setLayout(new FlowLayout( ));// Thit lp cch trnh by // Khai bo v khi to button for(int i=0; i<10; i++) myFrame.add(new Button(Click+i));// Gn vo frame myFrame.setVisible(true); // Hin th frame } }

Hnh 9.11 Kt qu demo Flow layout

9.3.2 Trnh by Grid Layout


Cch trnh by Grid Layout s sp xp cc i tng theo dng bng, c xc nh s hng v s ct. Cc phng thc xy dng:

Bin son : Bi Cng Giao --------------------------------------- 187 --------------------------------------

Chng 9: Lp trnh giao din

GridLayout(int, int): khi to mt i tng trnh by. Hai tham s u vo ln lt l s hng v s ct ca grid trnh by. GridLayout(int, int, int, int): khi to mt i tng trnh by, hai tham s u xc nh s hng v s ct trnh by. Hai tham s sau xc nh khong cch gia cc dng v cc ct ca bng. Lu : khi s lng i tng c chn nhiu hn vo frame, ta mun chng trnh t tnh s hng, hoc t tnh s ct hin th, th ta tham s tng ng l 0. V d:
setLayout(new GridLayout(3,0));

s c nh s hng trnh by l 3, s ct l tu thuc vo s i tng trong frame.


setLayout(new GridLayout(0,2));

s c nh s ct l 2, s dng l mm do theo s cc i tng trong frame. Chng trnh GridLayoutDemo minh ho cch trnh by grid layout: to ra mt dy 10 nt nhn v gn vo mt frame theo kiu grid layout.
package chuong9; import java.awt.*; public class GridLayoutDemo { public static void main(String[] args) { // Khai bo v khi to frame c tiu Frame myFrame = new Frame(Frame has somes buttons!); myFrame.setSize(300,150); // nh kch c frame myFrame.setLayout(new GridLayout(0,2));// Thit lp cch trnh by // Khai bo v khi to button for(int i=0; i<10; i++) myFrame.add(new Button(Click+i));// Gn vo frame myFrame.setVisible(true); // Hin th frame } }

Hnh 9.12 Kt qu demo Grid layout

Bin son : Bi Cng Giao --------------------------------------- 188 --------------------------------------

Chng 9: Lp trnh giao din

9.3.3 Trnh by Border Layout


Cch hin th Border Layout s chia frame thnh 5 vng c nh v t ng ko dn cc vng sao cho chim ht b mt ca frame: West: vng pha ty, tc l pha l bn tri. East: vng pha ng, tc l pha l bn phi. North: vng pha bc, tc l pha l trn. South: vng pha nam, tc l pha l di. Center: vng trung tm, chnh gia frame. Phng thc c bn ca lp BorderLayout: BorderLayout(): Khi to mt i tng trnh by theo cch border. Khi mt frame c trnh by theo cch border, ta c th dng phng thc sau gn cc i tng vo cc vng ca frame:
<i tng frame>.add(<Vng border>, <i tng component>);

V d:
myFrame.add(Center, new Button(Click));

s gn vo vng trung tm ca myFrame mt nt nhn c tn l Click. Lu : Cch trnh by border lun chia frame thnh 5 vng xc nh. Nu gn nhiu i tng vo cng mt vng, ch c i tng gn sau l nhn thy c. Nu mun trong mt vng cha c nhiu i tng, ta c th gn vo mi vng mt Panel. Sau trong panel, ta chn cch trnh by ring cho panel v gn cc i tng vo panel. Chng trnh BorderLayoutDemo minh ho cch trnh by border: ta s gn vo nm vng ca frame nm nt nhn khc nhau.
package chuong9; import java.awt.*; public class BorderLayoutDemo { public static void main(String[] args) { // Khai bo v khi to frame c tiu Frame myFrame = new Frame(Frame has somes buttons!); myFrame.setSize(300,150); // nh kch c frame myFrame.setLayout(new BorderLayout()); // nh cch trnh by

Bin son : Bi Cng Giao --------------------------------------- 189 --------------------------------------

Chng 9: Lp trnh giao din // Khai bo v khi to button myFrame.add(West, new Button(West)); // Gn vo vng west myFrame.add(East, new Button(East)); // Gn vo vng east myFrame.add(North, new Button(North)); // Gn vo vng north myFrame.add(South, new Button(South)); // Gn vo vng south // Gn vo vng center myFrame.add(Center, new Button(Center)); myFrame.setVisible(true); // Hin th frame } }

Hnh 9.13 Kt qu demo Border layout

9.3.4 Trnh by GridBag Layout


Cch trnh by GridBag Layout cng trnh by cc i tng tng t nh Grid Layout: cc i tng s c nh v theo v tr cc ca mt khung li. Tuy nhin, GridBag cho php ta nh kch thc ca i tng s chim bao nhiu v s c t v tr no trong khung li. Cc phng thc c bn: GridBagLayout(): khi to mt i tng trnh by theo cch gridbag. setConstraints(Component, GridBagConstraints): t v tr v kch thc ca i tng component theo cc rng buc trong gridbagConstraints. GridBagConstraints y l lp cha cc rng buc cho cc i tng c trnh by theo cch GridBag. Cc phng thc v thuc tnh c bn ca lp GridBagConstraints: GridBagConstraints(): khi to mt i tng rng buc ca GridBag. gridx/gridy: v tr ca cell m ta mun t i tng vo (theo chiu X v chiu Y). gridwidth/gridheight: kch thc (vng trnh by) ca i tng (Theo chiu rng v chiu cao). fill: Xc nh cch t i tng, theo 4 cch: GridBagConstraints.NONE: i tng khng thay i kch thc theo cc n chim. GridBagConstraints.VERTICAL: i tng c chiu cao kn vng n chim

Bin son : Bi Cng Giao --------------------------------------- 190 --------------------------------------

Chng 9: Lp trnh giao din

GridBagConstraints.HORIZONAL: i tng c chiu rng kn vng n chim GridBagConstraints.BOTH: i tng c chiu cao v chiu rng ph kn vng n chim.

ipadx/ipady: nh n v tng gim kch thc ca i tng khi khung cha b thay i kch thc (theo chiu X v chiu Y). insets: xc nh khong cch gia cc cell theo bn hng: trn, di, tri, phi. anchor: xc nh v tr neo i tng khi kch thc khung cha thay i. Bao gm: NORTH, NORTHEAST, NORTHWEST, EAST, SOUTH, SOUTHEAST, SOUTHWEST. weightx/weighty: nh khong cch ln ra tng i gia cc i tng vi nhau. Chng trnh GridBagLayoutDemo minh ho cch trnh by GridBag: To ra ba nt nhn trong frame, mi nt c mt s rng buc khc nhau v kch thc v v tr.
package chuong9; import java.awt.*; public class GridBagLayoutDemo { public static void main(String[] args) { // Khai bo v khi to frame c tiu Frame myFrame = new Frame(Frame has somes buttons!); myFrame.setSize(300,150); // nh kch c frame GridBagLayout layout = new GridBagLayout(); myFrame.setLayout(layout); // nh cch trnh by // Khai bo i tng rng buc GridBagConstraints cts = new GridBagConstraints(); cts.fill = GridBagConstraints.BOTH; // Button1: v tr (1,1), kch thc (1,1) Button btn1 = new Button(Click1); cts.gridx = 1; cts.gridy = 1; cts.gridheight = 1; cts.gridwidth = 1; layout.setConstraints(btn1, cts); // nh rng buc myFrame.add(btn1); // Gn vo frame // Button2: v tr (2,2), kch thc (1,1)

Bin son : Bi Cng Giao --------------------------------------- 191 --------------------------------------

Chng 9: Lp trnh giao din Button btn2 = new Button(Click2); cts.gridx = 2; cts.gridy = 2; cts.gridheight = 1; cts.gridwidth = 1; layout.setConstraints(btn2, cts); // nh rng buc myFrame.add(btn2); // Gn vo frame // Button3: v tr (3,3), kch thc (1,1) Button btn3 = new Button(Click3); cts.gridx = 3; cts.gridy = 3; cts.gridheight = 1; cts.gridwidth = 1; layout.setConstraints(btn3, cts); // nh rng buc myFrame.add(btn3); // Gn vo frame myFrame.setVisible(true); // Hin th frame } }

Hnh 9.14 Kt qu demo Gridbag layout

9.3.5 Trnh by Null Layout


Cch trnh by Null Layout s trnh by cc i tng khng theo mt quy tc no. Tt c u do ngi dng t nh v v thit lp kch thc cho mi i tng. nh v i tng bng phng thc setLocation(): <i tng>.setLocation(Point); nh kch thc i tng bng phng thc setSize(): <i tng>.setSize(int, int); Ngoi ra, c th va nh v, va nh kch thc cho i tng thng qua phng thc: <i tng>.setBounds(int, int, int, int); Trong , hai tham s du nh v i tng, hai tham s sau nh kch thc i tng.

Bin son : Bi Cng Giao --------------------------------------- 192 --------------------------------------

Chng 9: Lp trnh giao din

Chng trnh NullLayoutDemo minh ho cch trnh by t do Null layout: to ra hai nt nhn v gn vo frame theo hai cch khc nhau.
package chuong9; import java.awt.*; public class NullLayoutDemo { public static void main(String[] args) { // Khai bo v khi to frame c tiu Frame myFrame = new Frame(Frame has somes buttons!); myFrame.setSize(300,150); // nh kch c frame myFrame.setLayout(null); // nh cch trnh by // Button1: v tr (10,30), kch thc (100,40) Button btn1 = new Button(Click1); btn1.setSize(100, 40); btn1.setLocation(new Point(10, 30)); myFrame.add(btn1); // Gn vo frame // Button2: v tr (70,120), kch thc (50,20) Button btn2 = new Button(Click2); btn2.setBounds(70, 120, 50, 20); myFrame.add(btn2); // Gn vo frame myFrame.setVisible(true); // Hin th frame } }

Hnh 9.15 Kt qu demo Null layout

9.4 Applet
Applet l mt chng trnh Java c th chy trong cc trnh duyt web c h tr Java. Tt c cc applet u l cc lp con ca lp Applet. to applet, ta cn import hai gi sau:
import java.applet.*; import java.awt.*;

Bin son : Bi Cng Giao --------------------------------------- 193 --------------------------------------

Chng 9: Lp trnh giao din

9.4.1 Cu trc ca mt Applet


Cu trc tng qut ca mt applet nh sau:
public class <Tn lp applet> extends Applet { // Cc thuc tnh public void init(){} public void start(){} public void stop(){} public void destroy(){} // Cc phng thc khc }

Cc phng thc c bn ca mt applet: init(): Khi to cc tham s, nu c, ca applet. start(): Applet bt u hot ng. stop(): Chm dt hot ng ca applet. destroy(): Thc hin cc thao tc dn dp trc khi thot khi applet. Lu : Khng phi tt c cc applet u phi ci t y 4 phng thc c bn trn. Applet cn c th ci t mt s phng thc tu chn (khng bt buc) sau: paint(Graphics): phng thc v cc i tng giao din bn trong applet. Cc thao tc v ny c thc hin bi i tng ho Graphics (l tham s u vo). repaint(): dng v li cc i tng trong applet. Phng thc ny s t ng gi phng thc update(). update(Graphics): phng thc ny c gi sau khi thc hin phng thc paint nhm tng hiu qu v. Phng ny s t ng gi phng thc paint(). Chng trnh SimpleApplet ci t mt applet n gin, mi phng thc s in ra thng bo rng applet ang trong thi im tng ng.
package chuong9; import java.awt.*; import java.applet.*; public class SimpleApplet extends Applet { private StringBuffer buffer; // Chui thng bo public void init() { // Khi to buffer = new StringBuffer(); addBuffer(initializing);

Bin son : Bi Cng Giao --------------------------------------- 194 --------------------------------------

Chng 9: Lp trnh giao din } public void start() { // Kch hot addBuffer(starting); } public void stop() { // Dng addBuffer(stopping); } public void destroy() { // Thot addBuffer(unloading); } private void addBuffer(String newBuffer) { buffer.append(newBuffer); // Thm thng bo repaint(); } public void paint(Graphics g) { g.drawString(buffer.toString(), 5, 15); // Hin thng bo } }

Hnh 9.16 Kt qu demo Applet

9.4.2 S dng Applet


Applet khng th chy nh mt ng dng Java c lp (n khng c hm main), m n ch chy c khi c nhng trong mt trang HTML (ui .htm, .html) v chy bng mt trnh duyt web thng thng. Cc bc xy dng v s dng mt applet bao gm: Ci t chng trnh c dng mt applet nh mc trn Bin dch m ngun thnh lp .class Nhng m .class ca applet vo trang html.

Bin son : Bi Cng Giao --------------------------------------- 195 --------------------------------------

Chng 9: Lp trnh giao din

nhng mt applet vo mt trang html, ta dng th (tag) <Applet> nh sau:


<APPLET CODE = Tn_file_applet.class WIDTH = Chiu_rng HEIGHT = Chiu_cao> </APPLET>

Trong : Tn applet l tn file m ngun bin dch thnh file chy c ui .class ca Java. Chiu rng v chiu cao l kch thc ca vng trn trang html m applet s c t vo. V d, trong trang myHtml.htm c cha ni dung nh sau:
<HTML> <HEAD> <TITLE> A simple applet </TITLE> </HEAD> <BODY> This is the output of applet: <APPLET CODE = SimpleApplet.class WIDTH=200 HEIGHT=20> </APPLET> </BODY> </HTML>

s nhng applet c nh ngha trong chng trnh SimpleApplet vo mt vng c kch thc 200*20 trong trang myHtml. By gi, ta c th kim nghim chng trnh applet ca mnh bng cch m trang myHtml trn cc trnh duyt thng thng. Chng trnh AppletDemo ci t mt applet c chc nng tng t nh chng trnh EventDemo, thc hin cc thao tc tnh ton c bn trn hai s. Ngoi tr vic y l mt applet, nn c th chy trn mt trang HTML.
package chuong9; import java.awt.*; import java.awt.event.*; import java.applet.*; public class AppletDemo extends Applet implements ActionListener { Label lbl1, lbl2, lblKq; TextField txt1, txt2; Button btnCong, btnTru, btnNhan, btnChia, btnThoat; public void init() { this.setLayout(new GridLayout(6,2)); //Ch hin th 6 dng, 2 ct lbl1 = new Label(So thu nhat:); // Nhn s th nht

Bin son : Bi Cng Giao --------------------------------------- 196 --------------------------------------

Chng 9: Lp trnh giao din this.add(lbl1); txt1 = new TextField(); // vn bn s th nht this.add(txt1); lbl2 = new Label(So thu hai:); // Nhn s th hai this.add(lbl2); txt2 = new TextField(); // vn bn s th hai this.add(txt2); lblKq = new Label(); // Nhn kt qu this.add(lblKq); this.add(new Label()); // Cc nt nhn btnCong = new Button(Cong); // Nt cng btnCong.addActionListener(this); // Bt s kin this.add(btnCong); btnTru = new Button(Tru); // Nt tr btnTru.addActionListener(this); this.add(btnTru); btnNhan = new Button(Nhan); // Nt nhn btnNhan.addActionListener(this); this.add(btnNhan); btnChia = new Button(Chia); // Nt chia btnChia.addActionListener(this); this.add(btnChia); btnThoat = new Button(Thoat); // Nt thot btnThoat.addActionListener(this); this.add(btnThoat); } // Phng thc x l s kin nt c nhn public void actionPerformed(ActionEvent ae) { float x = Float.parseFloat(txt1.getText()); float y = Float.parseFloat(txt2.getText()); float kq = 0; if(ae.getSource() == btnCong) // Cng hai s kq = x + y; if(ae.getSource() == btnTru) // Tr hai s

Bin son : Bi Cng Giao --------------------------------------- 197 --------------------------------------

Chng 9: Lp trnh giao din kq = x - y; if(ae.getSource() == btnNhan) // Nhn hai s kq = x*y; if (ae.getSource() == btnChia) // Chia hai s if (y != 0) kq = x / y; else { lblKq.setText("So chia bang 0"); return; } if(ae.getSource() == btnThoat) // Thot khi chng trnh System.exit(0); // Thay i ni dung kt qu lblKq.setText(Ket qua la: + String.valueOf(kq)); repaint(); // V li cc i tng } }

Hnh 9.17 Kt qu demo Applet bng tnh Lu : s khc nhau gia mt application v mt applet: Application l mt ng dng Java c lp, n c th chy c lp trn my o Java. Trong khi , applet ch chy c khi nhng trong mt trang html, chy nh vo cc trnh duyt web c h tr Java. Application chy da vo hm main(). Trong khi , applet khng c hm main(). hin th cc thng bo, application dng System.out.println(). Trong khi , applet dng phng thc drawString() ca lp Graphics.

Bin son : Bi Cng Giao --------------------------------------- 198 --------------------------------------

Chng 9: Lp trnh giao din

9.4.3 Truyn tham s cho Applet


Trong nhiu trng hp, applet phi ph thuc vo cc tham s bn ngoi truyn vo. Khi ta c th dng th PARAM ca html truyn tham s cho applet. C php:
<APPLET CODE = Tn_file_applet.class WIDTH = Chiu_rng HEIGHT = Chiu_cao> <PARAM NAME=Tn_bin VALUE=Gi_tr> // Cc tham s khc </APPLET>

Khi , trong m ngun ca applet, ta dng phng thc getParameter() c gi tr cc tham s c truyn vo:
getParameter(Tn_bin);

Chng trnh ParamDemo minh ho vic truyn tham s cho mt applet: Applet m phng giao din tm kim: mt nhn hng dn, mt vn bn v mt nt nhn. Tu vo ngn ng m nhn v nt nhn c gi tr text khc nhau. Bin ngn ng l mt tham s truyn t trnh duyt vo. (y l m phng giao din, c ch tm kim khng hot ng).
package chuong9; import java.awt.*; import java.applet.*; public class ParamDemo extends Applet { Label lbl; TextField txt; Button btn; public void init() { this.setLayout(new GridLayout(2,2)); //Ch hin th 2 dng, 2 ct String langue = getParameter(langue);// Loi ngn ng if (langue.equals(vn)) { // Ting Vit lbl = new Label(Nhap tu khoa); // Nhn s th nht btn = new Button(Tim kiem); // Nt cng } else if (langue.equals(fr)) { // Ting Php lbl = new Label(Tapez des mots); btn = new Button(Chercher); } else { // Ting Anh, mc nh lbl = new Label(Enter keys);

Bin son : Bi Cng Giao --------------------------------------- 199 --------------------------------------

Chng 9: Lp trnh giao din btn = new Button(Search); } txt = new TextField(); this.add(lbl); this.add(txt); this.add(btn); } }

Khi , applet phi c nhng vo trang html vi on m nh sau:


<APPLET CODE = ParamDemo.class WIDTH = 400 HEIGHT = 200> <PARAM NAME=langue VALUE=vn> </APPLET>

Hnh 9.18 Kt qu demo Applet c tham s Ta c th thay th value ca param bng cc gi tr vn, fr v en thy c cc ch ngn ng khc nhau c hin th trong applet.

9.5 SWING
Swing l th vin lp trnh m rng ca Java. N m rng cc i tng giao din ho c bn ca Java. Swing cn c gi l th vin JFC. Khi mun s dng cc i tng ho ca th vin ny, ta phi khai bo ch th:
import javax.swing.*;

Bin son : Bi Cng Giao --------------------------------------- 200 --------------------------------------

Chng 9: Lp trnh giao din

9.5.1 M rng cc i tng component


JFC m rng cc i tng c bn ca Java thnh cc lp tng ng, thm k t J u mi tn lp: Button JButton Label JLabel TextField JTextField TextArea JTextArea Checkbox JCheckbox List JList Cc lp m rng ny c y cc phng thc ca cc i tng lp c bn ca th vin java.awt. Ngoi ra, chng c b sung mt s phng thc to hiu ng giao din. JButton Chng trnh JButtonDemo minh ho vic s dng i tng JButton. i tng JButton c m rng thm mt s tnh nng sau: JButton(String, Icon): Khi to mt nt nhn vi mt tn nhn v mt nh nn. nh nn c kiu icon (tham s th hai). setMnemonic(char): nh phm tt cho nt lnh. Khi ngi dng nhn Ctrl+phm tt th nt lnh cng thc thi tng t nh kkhi ta click chut vo nt lnh. setBorder(new MatteBorder(int, int, int, int, Icon)): Thit lp khung nn cho nt vi cc tham s: Khong cch t ch n bin ( rng bin) theo cc chiu trn di, tri phi, cui cng l nh nn cho nt. setBorder(new LineBorder(int)): Thit lp vin cho nt dng hnh ch nht, tham s xc nh mu cho vin ca nt. Ngoi ra, tham s ca phng thc ny cn c th l cc lp SoftBevelBorder, EtchedBorder v TitleBorder. setToolTipText(String): Thit lp dng tooltip cho i tng. Dng ny s hin ra khi ta di chut ln i tng trn ca s.
package chuong9; import javax.swing.*; import javax.swing.border.MatteBorder; public class JButtonDemo extends JFrame { public static void main(String[] args) { // Khai bo v khi to frame c tiu JFrame myFrame = new JFrame(Frame has somes buttons!); myFrame.setSize(300,150); // nh kch c frame

Bin son : Bi Cng Giao --------------------------------------- 201 --------------------------------------

Chng 9: Lp trnh giao din // Gi s ta c file nh myImage trong cng th mc ImageIcon myIcon = new ImageIcon(myImage.gif); // Button1: c nn l nh JButton btn1 = new JButton(Back Image, myIcon); // Gn tooltip cho nt btn1.setToolTipText(Buttons background is an image); myFrame.getContentPane().add(btn1); // Gn vo frame // Button2: c bin l nh JButton btn2 = new JButton(Border Image); // Gn tooltip cho nt btn2.setToolTipText(Buttons border is an image); btn2.setBorder(new MatteBorder(10,10,10,10, myIcon)); myFrame.getContentPane().add(btn2); // Gn vo frame myFrame.setVisible(true); // Hin th frame } }

Hnh 9.19 Kt qu demo JButton Trong chng trnh ny, c dng lnh gn cc i tng vo frame bng cch getContentPane(). y l phng thc m rng cho cc i tng khung cha container. S m rng ny s c trnh by chi tit trong phn tip theo.

Bin son : Bi Cng Giao --------------------------------------- 202 --------------------------------------

Chng 9: Lp trnh giao din

9.5.2 M rng cc i tng container


Tng t nh cc i tng component, cc i tng container cng c m rng trong JFC thnh cc lp c tn tng ng v thm k t J u: Frame JFrame Panel JPanel Dialog JDialog Menu JMenu Chng trnh JFrameDemo minh ho vic s dng cc i tng m rng ca khung cha Frame thnh JFrame. Khung cha JFrame c nhiu tng trnh din khc nhau, cc tng l trong sut v chng kht ln nhau, khin cho ta vn c cm gic cc i tng c trnh by trn cng mt mt phng nh khung cha Frame ca th vin chun AWT. Mt s tng hay s dng ca lp JFrame (theo th t t trong ra ngoi): ContentPane: l tng thng dng nht, tng ny dng cha cc i tng component c bn nh button, label, text, list MenubarPane: tng dnh cha cc loi menu ca frame nh Menubar, PopupMenu. GlassPane: tng ngoi cng, thng dng cha cc tooltip ca cc i tng trong tng Content. Khi ta set tooltipText cho mt i tng, tooltip s t ng c add vo tng Glass. truy nhp vo mt tng bt k, ta dng phng thc c tn:
get + <Tn ca tng>();

V d:
JFrame myFrame = new JFrame(My JFrame); myFrame.getContentPane().add(Center, new JButton(Test));

s gn mt nt nhn c nhn Test vo tng Content ca khung cha myFrame. Chng trnh JFrameDemo minh ho vic gn cc i tng vo cc tng khc nhau: Gn mt nt nhn vo tng ContentPane. Gn mt thanh Menubar c cha mt menu File vo tng MenubarPane.
package chuong9; import javax.swing.*; import java.awt.event.*; public class JFrameDemo extends JFrame implements ActionListener {

Bin son : Bi Cng Giao --------------------------------------- 203 --------------------------------------

Chng 9: Lp trnh giao din private JMenuBar myBar; private JMenu myMenu; public JFrameDemo() { super("JFrame demo"); JButton btn = new JButton("My Button"); this.getContentPane().add("Center", btn); //Gn nt nhn vo tng ContentPane myBar = new JMenuBar(); myMenu = new JMenu("File"); myBar.add(myMenu); // Gn menubar vo tng MenubarPane this.setJMenuBar(myBar); setItemMenu("Open", "open"); setItemMenu("New", "new"); myMenu.add(new JSeparator()); setItemMenu("Save", "save"); setItemMenu("Save as", "saveas"); myMenu.add(new JSeparator()); myMenu.add(new JSeparator()); setItemMenu("Exit", "exit"); // Phng thc bt s kin click vo nt ng frame this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } private void setItemMenu(String label, String command) { JMenuItem item = new JMenuItem(label); item.addActionListener(this); item.setActionCommand(command); myMenu.add(item);

Bin son : Bi Cng Giao --------------------------------------- 204 --------------------------------------

Chng 9: Lp trnh giao din } // Phng thc x l s kin public void actionPerformed(ActionEvent ae) { JMenuItem item = (JMenuItem) ae.getSource(); String cmd = item.getActionCommand(); if (cmd.equals("exit")) { System.exit(0); } else { JOptionPane.showMessageDialog(this, cmd + " was selected."); } } public static void main(String[] args) { JFrameDemo myFrame = new JFrameDemo(); myFrame.setSize(300, 150); // nh kch c frame myFrame.setVisible(true); // Hin th frame } }

Java cung cp trnh n trong th vin AWT v cc tnh nng nng cao trong SWING. Sau y ta xem xt trnh n mt cch chi tit trong SWING.

Hnh 9.20 Kt qu demo gn cc i tng vo cc tng JMenu Trnh n c dng trn cc thanh cng c ca cc ca s hoc l popup menu xut hin khi ta click chut phi vo mt i tng. Cc thnh phn cn bn ca trnh n: Menubar: thanh trnh n Menu: trnh n xung PopupMenu: trnh n xut hin khi click chut phi. MenuItem: cc mc chn ca trnh n.

Bin son : Bi Cng Giao --------------------------------------- 205 --------------------------------------

Chng 9: Lp trnh giao din

JMenubar JMenubar l thanh cng c dng cha cc trnh n JMenu. Cc phng thc c bn ca lp JMenubar: JMenubar(): khi to mt thanh cng c cho trnh n add(JMenu): thm mt trnh n Menu ln menubar. t mt menubar ln mt JFrame, ta gi phng thc ca JFrame:
<i tng JFrame>.setJMenuBar(<i tng menubar>);

JMenu Trnh n JMenu l i tng s s xung khi click chut ln i tng hin th ca JMenu. JMenu cn c gi l menu con ca mt thanh trnh n. Cc phng thc c bn ca lp JMenu: JMenu(String): khi to mt JMenu, vi tn xc nh. add(MenuItem): thm mt MenuItem vo JMenu add(JMenu): thm mt menu con vo JMenu c, dng khi mun to menu c nhiu mc. addSeparator(): thm mt ng phn vng vo menu ( nhm cc item vi nhau). X l s kin ca lp JMenu: Kiu s kin: ActionEvent Giao tip ci t: ActionListener Phng thc x l: actionPerformed(ActionEvent); MenuItem JMenuItem l i tng item trong cc trnh n JMenu. Mi item, khi c click vo s c tc dng nh mt nt lnh. Cc phng thc c bn ca lp MenuItem: MenuItem(String): khi to mt item. CheckboxJMenuItem(String): khi to mt item c mc chn nh checkbox. getState(): tr v trng thi ca item. Ch dng cho item c mc chn. enable(): cho php item hot ng (l ch mc nh). disable(): khng cho php item hot ng (lm m item i). X l s kin ca lp MenuItem: Kiu s kin: ActionEvent Giao tip ci t: ActionListener Phng thc x l: actionPerformed(ActionEvent); Chng trnh JMenuDemo minh ho vic s dng cc loi menu: To mt JFrame

Bin son : Bi Cng Giao --------------------------------------- 206 --------------------------------------

Chng 9: Lp trnh giao din

To mt JPanel v gn vo JFrame To mt ActionListener cho JPanel To mt JMenubar ca JFrame Trn JMenubar, to mt JMenu File v Edit. Khi click vo s s xung mt menu vi cc item: New, Open, Save, Save As, Exit, v Cut, Copy, Paste tng ng To mt JMenuPopup trn JPanel Khi click chut phi vo JPanel, s s ra mt JMenuPopup gm cc item: Open v Colors. Khi chn Colors mt JMenu cha mt nhm Button xut hin. Khi chn mu th JPanel s i mu Khi click chut vo item no trn cc menu, mt thng bo s hin th tn ca item va c chn. Chng trnh kt thc khi click vo item Exit hoc ng ca s.
package chuong9; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class JMenuDemo { public static void main(String[] args) { JFrame frame = new JFrame("Menu Demo"); final JPanel panel = new JPanel(); frame.add(panel); ActionListener listener = new MenuItemActionListener(panel); JMenu file = new JMenu("File"); file.setMnemonic('F'); file.add(menuItem("New", listener, "new", 'N', KeyEvent.VK_N)); file.add(menuItem("Open...", listener, "open", 'O', KeyEvent.VK_O)); file.add(menuItem("Save", listener, "save", 'S', KeyEvent.VK_S)); file.add(menuItem("Save As...", listener, "saveas", 'A', KeyEvent.VK_A)); file.addSeparator(); file.add(menuItem("Exit", listener, "exit", 'E', KeyEvent.VK_E)); JMenu edit = new JMenu("Edit");

Bin son : Bi Cng Giao --------------------------------------- 207 --------------------------------------

Chng 9: Lp trnh giao din edit.setMnemonic('E'); edit.add(menuItem("Cut", listener, "cut", 0, KeyEvent.VK_X)); edit.add(menuItem("Copy", listener, "copy", 'C', KeyEvent.VK_C)); edit.add(menuItem("Paste", listener, "paste", 0, KeyEvent.VK_V)); JMenuBar menubar = new JMenuBar(); menubar.add(file); menubar.add(edit); frame.setJMenuBar(menubar); // to poppup final JPopupMenu popup = new JPopupMenu(); popup.add(menuItem("Open...", listener, "open", 0, 0)); popup.addSeparator(); // Thm mt ng phn cch gia cc item JMenu colors = new JMenu("Colors"); // To mt submenu popup.add(colors); // to nhm radio ButtonGroup colorgroup = new ButtonGroup(); colors.add(radioItem("Red", listener, "color(red)", colorgroup)); colors.add(radioItem("Green", listener, "color(green)", colorgroup)); colors.add(radioItem("Blue", listener, "color(blue)", colorgroup)); // Kt thc ng dng khi click ng ca s frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); panel.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { // Nu click chut phi if (e.getButton()==3) popup.show((Component)e.getSource(), e.getX(), e.getY()); } }); // Thm n ti popup menu

Bin son : Bi Cng Giao --------------------------------------- 208 --------------------------------------

Chng 9: Lp trnh giao din frame.setSize(450, 300); frame.setVisible(true); } public static JMenuItem menuItem(String label, ActionListener listener, String command, int mnemonic, int acceleratorKey) { JMenuItem item = new JMenuItem(label); item.addActionListener(listener); item.setActionCommand(command); if (mnemonic != 0) item.setMnemonic((char) mnemonic); if (acceleratorKey != 0) item.setAccelerator(KeyStroke.getKeyStroke(acceleratorKey, java.awt.Event.CTRL_MASK)); return item; } public static JMenuItem radioItem(String label, ActionListener listener, String command, ButtonGroup mutExGroup) { JMenuItem item = new JRadioButtonMenuItem(label); item.addActionListener(listener); item.setActionCommand(command); mutExGroup.add(item); return item; } public static class MenuItemActionListener implements ActionListener { Component parent; public MenuItemActionListener(Component parent) { this.parent = parent; } public void actionPerformed(ActionEvent e) { JMenuItem item = (JMenuItem) e.getSource(); String cmd = item.getActionCommand(); if (cmd.equals("exit")) System.exit(0); else if (cmd.equals("color(red)")) this.parent.setBackground(Color.red); else

Bin son : Bi Cng Giao --------------------------------------- 209 --------------------------------------

Chng 9: Lp trnh giao din if (cmd.equals("color(blue)")) this.parent.setBackground(Color.blue); else if (cmd.equals("color(green)")) this.parent.setBackground(Color.green); else JOptionPane.showMessageDialog(parent, cmd + " was selected."); } } }

Hnh 9.21 Kt qu demo JMenu Lu : V cc i tng m rng ca th vin JFC c b sung kh nhiu tnh nng, c bit l cc tnh nng ho, do , cc i tng ny c nhc im l rt cng knh. V l do nng ti, cho nn hin nay, cc i tng ca th vin JFC vn t c ph bin trong cc ng dng applet.

9.6 Case Study


Trong phn ny, ta s minh ho cch s dng cc i tng ho ca th vin chun AWT vit mt chng trnh m phng mt my tnh Calculator nh sau: To mt frame lm khung chng trnh, tiu l Java Calculator Pha trn l mt Label (hoc vn bn u c, nhng nu dng vn bn th khng cho edit) hin cc s c nhp vo v kt qu tnh ton. Pha di l cc nt nhn tng ng vi cc ch s v php ton. Nhng nhm cc nt nhn cho ng b v layout p mt, ta nhm chng vo mt Panel. Khi , frame s cha trc tip hai i tng: label v frame. Ta s dng layout kiu null, v xc nh v tr chnh xc cho label v panel.

Bin son : Bi Cng Giao --------------------------------------- 210 --------------------------------------

Chng 9: Lp trnh giao din

i vi Panel, ta cng dng GridLayout. V c 10 nt nhn s v cc nt nhn ton t: nt cng, nt nhn, nt chia, nt tr, nt cn bc hai, nt phy thp phn, nt bng, nt lu tha, nt nghch o, nt reset. Nn s to thnh 4 dng, 5 ct: mi dng gm c 3 nt s v hai nt chc nng: o Dng 1: cc nt 7, 8, 9, cng, reset (C). o Dng 2: cc nt 4, 5, 6, tr, lu tha. o Dng 3: cc nt 1, 2, 3, nhn, nghch o. o Dng 4: cc nt 0, thp phn, nt bng, nt chia, nt cn bc hai. Vi cc nt s v nt thp phn, khi click vo nt th k t tng ng c hin ln trn label. Vi cc nt chc nng, khi click vo th thc hin php ton v hin kt qu ra mn hnh, nu c. Khi click vo nt bng (kt qu) th hin kt qu trn label. Chng trnh CalculatorDemo ci t chi tit chng trnh ny.
package chuong9; import java.awt.*; import java.awt.event.*; import java.lang.Math; public class CalculatorDemo extends Frame implements ActionListener { private boolean operatorState; // Trng thi ca php ton private int operator; // Ton t thc hin private float oldIterator; // S hng trc private Label lbl; private Panel pnl; private Button btn0, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btnPoint, btnReset, btnAdd, btnSub, btnMul, btnDiv, btnPow, btnSqrt, btnRev, btnResult; public CalculatorDemo() { super(Java Calculator); this.setSize(250, 250); this.setResizable(false); // Khng cho thay i size this.setLayout(null); // Thit lp layout lbl = new Label("0"); // Nhn kt qu lbl.setAlignment(2);

Bin son : Bi Cng Giao --------------------------------------- 211 --------------------------------------

Chng 9: Lp trnh giao din lbl.setSize(240, 30); lbl.setLocation(5, 25); this.add(lbl); Panel pnl = new Panel(); // Panel cha cc nt pnl.setSize(240, 190); pnl.setLocation(5, 55); pnl.setLayout(new GridLayout(4, 5)); // Thit lp layout this.add(pnl); btn7 = new Button(7); // Nt s 7 btn7.addActionListener(this); // Bt s kin click chut pnl.add(btn7); // Gn vo panel btn8 = new Button(8); // Nt s 8 btn8.addActionListener(this); pnl.add(btn8); btn9 = new Button(9); // Nt s 9 btn9.addActionListener(this); pnl.add(btn9); btnAdd = new Button(+); // Nt php ton cng btnAdd.addActionListener(this); pnl.add(btnAdd); btnReset = new Button(C); // Nt reset btnReset.addActionListener(this); pnl.add(btnReset); btn4 = new Button(4); // Nt s 4 btn4.addActionListener(this); pnl.add(btn4); btn5 = new Button(5); // Nt s 5 btn5.addActionListener(this); pnl.add(btn5); btn6 = new Button(6); // Nt s 6 btn6.addActionListener(this); pnl.add(btn6); btnSub = new Button(-); // Nt php ton tr btnSub.addActionListener(this); pnl.add(btnSub); btnPow = new Button(x^y); // Nt php ton lu tha

Bin son : Bi Cng Giao --------------------------------------- 212 --------------------------------------

Chng 9: Lp trnh giao din btnPow.addActionListener(this); pnl.add(btnPow); btn1 = new Button(1); // Nt s 1 btn1.addActionListener(this); pnl.add(btn1); btn2 = new Button(2); // Nt s 2 btn2.addActionListener(this); pnl.add(btn2); btn3 = new Button(3); // Nt s 3 btn3.addActionListener(this); pnl.add(btn3); btnMul = new Button(*); // Nt php ton nhn btnMul.addActionListener(this); pnl.add(btnMul); btnRev = new Button(1/x); // Nt php ton nghch o btnRev.addActionListener(this); pnl.add(btnRev); btn0 = new Button(0); // Nt s 0 btn0.addActionListener(this); pnl.add(btn0); btnPoint = new Button(.); // Nt du thp phn btnPoint.addActionListener(this); pnl.add(btnPoint); btnResult = new Button(=); // Nt kt qu btnResult.addActionListener(this); pnl.add(btnResult); btnDiv = new Button(/); // Nt php ton chia btnDiv.addActionListener(this); pnl.add(btnDiv); btnSqrt = new Button(Sqrt); // Nt php ton cn bc hai btnSqrt.addActionListener(this); pnl.add(btnSqrt); operatorState = true; operator = -1; oldIterator = 0; this.addWindowListener(new WindowAdapter() {

Bin son : Bi Cng Giao --------------------------------------- 213 --------------------------------------

Chng 9: Lp trnh giao din public void windowClosing(WindowEvent e) { System.exit(0); } }); } // Phng thc x l s kin public void actionPerformed(ActionEvent ae) { float result; float newIterator = Float.parseFloat(lbl.getText()); if(ae.getSource() == btnResult) { switch(operator) { case 0: result = oldIterator + newIterator; lbl.setText(String.valueOf(result)); break; case 1: result = oldIterator - newIterator; lbl.setText(String.valueOf(result)); break; case 2: result = oldIterator * newIterator; lbl.setText(String.valueOf(result)); break; case 3: if(newIterator != 0) { result = oldIterator/newIterator; lbl.setText(String.valueOf(result)); } break; case 4:result = (float)Math.pow(oldIterator, newIterator); lbl.setText(String.valueOf(result)); break; } operator = -1; operatorState = true; return; } if(ae.getSource() == btnRev) { newIterator = Float.parseFloat(lbl.getText()); if(newIterator != 0) {

Bin son : Bi Cng Giao --------------------------------------- 214 --------------------------------------

Chng 9: Lp trnh giao din result = (float)1/newIterator; lbl.setText(String.valueOf(result)); } operator = -1; operatorState = true; return; } if(ae.getSource() == btnSqrt) { newIterator = Float.parseFloat(lbl.getText()); if(newIterator >= 0) { result = (float)Math.sqrt(newIterator); lbl.setText(String.valueOf(result)); } operator = -1; operatorState = true; return; } if(ae.getSource() == btnPoint) { lbl.setText(lbl.getText() + .); return; } if(ae.getSource() == btnAdd) { operator = 0; operatorState = true; oldIterator = Float.parseFloat(lbl.getText()); return; } if(ae.getSource() == btnSub) { operator = 1; operatorState = true; oldIterator = Float.parseFloat(lbl.getText()); return; } if(ae.getSource() == btnMul) { operator = 2; operatorState = true; oldIterator = Float.parseFloat(lbl.getText());

Bin son : Bi Cng Giao --------------------------------------- 215 --------------------------------------

Chng 9: Lp trnh giao din return; } if(ae.getSource() == btnDiv) { operator = 3; operatorState = true; oldIterator = Float.parseFloat(lbl.getText()); return; } if(ae.getSource() == btnPow) { operator = 4; operatorState = true; oldIterator = Float.parseFloat(lbl.getText()); return; } if(ae.getSource() == btnReset) { operator = -1; operatorState = true; oldIterator = 0; lbl.setText("0"); return; } // Trng hp click vo nt s if(operatorState) { // Bt u s mi lbl.setText(ae.getActionCommand()); operatorState = false; } else // G tip s c lbl.setText(lbl.getText() + ae.getActionCommand()); } public static void main(String[] args) { // Khai bo v khi to frame CalculatorDemo myFrame = new CalculatorDemo(); myFrame.setVisible(true); // Hin th frame }

Bin son : Bi Cng Giao --------------------------------------- 216 --------------------------------------

Chng 9: Lp trnh giao din }

Chng trnh s cho kt qu nh sau:

Hnh 9.22 Kt qu demo Case Study

TNG KT CHNG 9
Ni dung chng ny trnh by phng php lp trnh giao din vi cc i tng trong th vin chun AWT ca Java: Cc i tng c chc nng lm vt cha cho cc i tng giao din: Frame, Panel, Dialog. Cc i tng l thnh phn giao din: Label, Button, TextField, TextArea, Checkbox, List, Menu. Phng php nm bt v x l cc s kin c th ca tng i tng giao din. Cc phng php trnh by trn cc vt cha: FlowLayout, GridLayout, BorderLayout, GridBagLayout, NullLayout. Gii thiu mt phng php lp trnh giao din Java c nhng trong cc trang web, l lp trnh applet: Cch to ra mt applet vi cc phng thc c bn. Cch nhng mt applet vo mt trang web. Cch kim nghim mt applet sau khi nhng vo trang web bng cc trnh duyt. Ngoi ra, chng ny cng gii thiu cch s dng th vin cc i tng ho m rng JFC ca Java. Cc i tng ca th vin JFC c chc nng hon ton tng t cc i tng tng ng trong th vin chun AWT. Ngoi ra, chng cn c b sung thm mt s kh nng ho cao cp.

BI TP
1. Vit chng trnh thay i mu nn ca frame theo la chn ca ngi dng: To ra cc nt nhn c tn theo cc mu: Blue, Cyan, Gray, Green, Magenta, Orange, Pink, Red, White, Yellow.

Bin son : Bi Cng Giao --------------------------------------- 217 --------------------------------------

Chng 9: Lp trnh giao din

Khi click chut vo nt no, mu nn ca frame s i theo mu . 2. Vit chng trnh thay i mu nn trong bi 1 bng vn bn. To ra mt vn bn duy nht, khi ngi dng g vo mt trong s cc mu trong bi 1 v g enter, mu nn ca frame s i theo mu . Nu ngi dng g sai mu, khng lm g c. 3. Vit chng trnh thay i mu nn trong bi 1 bng nt chn radio. To mt nhm cc nt radio tng ng vi cc loi mu. Khi mu no c chn, mu nn ca frame s thay i theo mu . 4. Vit chng trnh thay i mu nn trong bi 1 bng danh sch chn list. To mt List c cc item tng ng vi cc loi mu. Khi mu no c chn, mu nn ca frame s thay i theo mu . 5. Vit chng trnh thay i mu nn trong bi 1 bng menu. To mt menubar, trn c gn mt menu tn l color, khi click chut vo mune color, s s xung cc mu tng ng trong bi 1. Khi mu no c chn, mu nn ca frame s thay i theo mu .
6. Vit chng trnh thay i mu nn trong bi 1 bng menu popup. To mt menu

popup trong frame, khi click chut phi ln frame, s hin ra menu gm cc mu tng ng trong bi 1. Khi mu no c chn, mu nn ca frame s thay i theo mu .
7. Vit li cc chng trnh trong cc bi tp 1 n 6 di dng applet v nhng

chng vo trang myHtml.htl chy. (Trang ny phi cng th mc vi cc lp va ci t v bin dch).

Bin son : Bi Cng Giao --------------------------------------- 218 --------------------------------------

Chng 10: Lung x l

Chng 10.

Lung x l

Ni dung chng ny nhm gii thiu: nh ngha mt lung Hiu c vng i ca lung To v qun l lung Gii thch thit lp lung u tin nh th no M t a lung M t mt lung ngm Gii thch c s cn thit ca s ng b Gii thch vai tr ca cc phng thc wait(), notify() v notifyAll(). M t mt iu kin b tc (deadlock condition) M t c ch thu rc

10.1 Gii thiu lung


Mt lung (thread) l n v nh nht ca on m c th thi hnh c m thc hin mt cng vic ring bit. Java h tr a lung, m c kh nng lm vic vi nhiu lung. Mt ng dng c th bao hm nhiu lung. Mi lung c ng k mt cng vic ring bit, m chng c thc thi ng thi vi cc lung khc. a lung gi thi gian nhn ri ca h thng thnh nh nht. iu ny cho php ta vit cc chng trnh c hiu qu cao vi s tn dng CPU l ti a. Mi phn ca chng trnh c gi mt lung, mi lung nh ngha mt ng dn khc nhau ca s thc hin. y l mt thit k chuyn dng ca s a nhim. Trong s a nhim, nhiu chng chng trnh chy ng thi, mi chng trnh c t nht mt lung trong n. Mt vi x l thc thi tt c cc chng trnh. Cho d n c th xut hin m cc chng trnh c thc thi ng thi, trn thc t CPU nhy qua li gia cc tin trnh. Mt lung i qua cc giai on khc nhau trong vng i ca n. V d, mt lung c sinh ra, bt u, chy, v sau cht. Hnh 10.1 cho thy vng i hon chnh ca mt lung. New: mt lung mi bt u chu k sng ca n trong trng thi mi. Runnable: sau khi mt lung va c sinh ra l bt u, lung s tr thnh Runnable. Mt lung trng thi ny c coi l ang thc hin nhim v ca mnh.

Bin son : Bi Cng Giao --------------------------------------- 219 --------------------------------------

Chng 10: Lung x l

Waiting: i khi mt lung chuyn sang trng thi ch i trong khi mt lung khc thc hin nhim v. Lung ch i chuyn v trng thi thc hin khi ch khi mt lung khc pht tn hiu ti n tip tc thc hin. Timed waiting: mt lung Runnable c th nhp trng thi ch i hn gi trong mt khong thi gian nht nh. Mt lung trong qu trnh chuyn i trnng thi ch ny v trng thi Runnable khi m khong thi gian ht hn hoc khi cc s kin n i xy ra. Terminated: mt lung Runnable i vo trng thi chm dt khi n hon thnh nhim v ca mnh.

Hnh 10.1 Vng i ca lung

10.2 To v qun l lung


10.2.1 To lung
Khi cc chng trnh Java c thc thi, lung chnh lun c thc hin v Cc lung con s c to ra t n. N l lung cui cng kt thc vic thc hin. Ngay khi lung chnh ngng thc thi, chng trnh b chm dt. Cho d lung chnh c to ra mt cch t ng vi chng trnh thc thi, n c th c iu khin thng qua mt lung i tng.

Bin son : Bi Cng Giao --------------------------------------- 220 --------------------------------------

Chng 10: Lung x l

Cc lung c th c to ra bng hai cch: Trnh by lp nh l mt lp con ca lp lung, ni m phng thc run() ca lp lung cn c ghi , v d:
class Mydemo extends Thread { public void run() { //thc thi } }

Trnh by mt lp m lp ny thc hin lp Runnable. Ri th nh ngha phng thc run().


class Mydemo implements Runnable { public void run() { //thc thi } }

Chng trnh MyThread s hin th thng tin v lung chnh


package chuong10; import java.io.*; public class MyThread extends Thread { public static void main(String args[]){ Thread t = Thread.currentThread(); System.out.println("The current Thread is :" + t); t.setName("MyJavaThread"); System.out.println("The thread is now named: " + t); try { for (int i = 0; i <3;i++) { System.out.println(i); Thread.sleep(1500); } } catch (InterruptedException e) { System.out.println("Main thread interupted"); } } }

Bin son : Bi Cng Giao --------------------------------------- 221 --------------------------------------

Chng 10: Lung x l

Kt qu chng trnh trn The current Thread is :Thread[main,5,main] The thread is now named: Thread[MyJavaThread,5,main] 0 1 2 Trong kt qu xut ra trn

[main,5,main]
Nhm lung m n ph thuc Quyn u tin c t bi JVM Tn ca lung Lp lung c vi phng thc xy dng, hai trong s cc phng thc xy dng c cp n di y:
public Thread(String threadname) public Thread()

Cu trc mt lung vi tn l threadname Cu trc mt lung vi tn Thread v i km mt s; ly v d, Thread-1, Thread-2, Chng trnh bt u thc thi lung vi vic gi phng thc start(), m phng thc ny ph thuc vo lp lung. Phng thc ny, ln lt, vin dn phng thc run(), ni m phng thc nh ngha tc v c thc thi. Phng thc ny c th vit ln lp con ca lp lung, hoc vi mt i tng Runnable. Chng trnh ChildThread minh ho vic to lung con:
package chuong10; class ChildThread extends Thread { public static void main(String args[]) { ChildThread Objex = new ChildThread(); Objex.create(); System.out.println("This is the main thread"); } public void create() { Thread Objth = new Thread(this);

Bin son : Bi Cng Giao --------------------------------------- 222 --------------------------------------

Chng 10: Lung x l Objth.start(); } public void run() { for (int i = 0; i< 3; i++) { try { System.out.println("This is the child thread"); Thread.sleep(500); } catch (InterruptedException e) { } } } }

Kt qu chng trnh trn This is the child thread This is the main thread This is the child thread This is the child thread

10.2.2 Phng thc ca lp lung


Phng thc enumerate(Thread [ ] t) getName() isAlive() getPriority() setName(String name) join() isDaemon() sleep() start() activeCount() yield() Mc ch Chp tt c cc lung hin hnh vo mng t nhm lung v cc nhm con ca n. Tr v tn ca lung Tr v true, nu lung vn cn tn ti (sng) Tr v quyn u tin ca lung t tn lung. i cho n khi lung cht. Kim tra nu lung l lung mt lung ngm. Hon lung mt khong thi gian. Gi phng thc run() bt u mt lung. S lung ang hot ng Tm thi dng lung ang thc hin v cho php lung

setDaemon(boolean on) Thit lp l lung ngm hay lung ngi dng

Bin son : Bi Cng Giao --------------------------------------- 223 --------------------------------------

Chng 10: Lung x l

khc thc hin. Bng 10.1 Cc phng thc ca mt lp lung Cc nguyn nhn lm lung khng chy: Lung khng c u tin cao Lung i vo trng thi ng khi dng phng thc sleep() Lung i vo trng thi ch khi dng phng thc wait() Lung nhng quyn chim hu CPU khi dng yield() N b ngn chn khi thc hin vic nhp xut Chng trnh ThreadTest sau minh ho cch s dng vi phng thc ca lung
package chuong10; public class ThreadTest implements Runnable { Thread t; public ThreadTest() { System.out.println(Thread.currentThread().getName()); t = new Thread(this); t.setName("My Thread"); t.start(); } public void run() { System.out.println(Thread.currentThread().getName()); System.out.println(Thread.activeCount()); System.out.println(t.isAlive()); } public static void main(String args[]) { new ThreadTest(); } }

Kt qu chng trnh trn main My Thread 2 true

Bin son : Bi Cng Giao --------------------------------------- 224 --------------------------------------

Chng 10: Lung x l

10.2.3 Quyn u tin ca lung


Khi c nhiu lung cng hot ng th mi lung nhn mt phn nh thi gian CPU, c gi l nh lng. Lung c th thc thi tc v ca chnh n trong sut khong thi gian nh lng y. Sau khong thi gian ny, lung khng tip tc thc hin, ngay c nu n khng c hon thnh cng vic ca n. Lung k tip ca lung c quyn u tin bng nhau ny s s hu CPU. Mi lung trong chng trnh Java c ng k cho mt quyn u tin. JVM khng bao gi thay i quyn u tin ca lung. Mi lung c mt gi tr u tin nm trong khong t Thread.MIN_PRIORITY : 1 ti Thread.MAX_PRIORITY : 10. Mc nh lung c s u tin l Thread.NORM_PRIORITY : 5. Phng thc yield() thch hp cho cc h thng khng chia nh thi gian (non-timesliced), ni m cc lung hin thi hon thnh vic thc hin trc khi cc lung c quyn u tin ngang nhau k tip tip qun. y, ta s gi phng thc yield() ti nhng khon thi gian ring bit c th tt c cc lung c quyn u tin ngang nhau chia s thi gian thc thi CPU. Chng trnh PriorityDemo minh ho quyn u tin ca lung:
package chuong10; public class PriorityDemo { Priority t1, t2, t3; public PriorityDemo() { t1 = new Priority(); t1.start(); t2 = new Priority(); t2.start(); t3 = new Priority(); t3.start(); } public static void main(String args[]){ new PriorityDemo(); } } class Priority extends Thread implements Runnable { int sleep; int prio = 3; public Priority() { sleep += 100;

Bin son : Bi Cng Giao --------------------------------------- 225 --------------------------------------

Chng 10: Lung x l setPriority(Thread.activeCount()); } public void run() { try { Thread.sleep(sleep); System.out.println("Name getPriority()); } catch(InterruptedException e) { System.out.println(e.getMessage()); } } } "+ getName()+" Priority = "+

Kt qu chng trnh nh sau: Name Thread-2 Priority = 3 Name Thread-0 Priority = 1 Name Thread-1 Priority = 2

10.2.4 Lung ngm


C hai kiu lung trong mt chng trnh Java: Cc lung ngi s dng Lung ngm (daemon thread) Ngi s dng to ra cc lung ngi s dng, trong khi cc lung chy pha sau (background) cung cp cc dch v cho cc lung khc gi l lung ngm. Khi my o Java khm ph rng ch c lung ngm ang chy th n s thot. My o Java c t nht mt lung ngm c bit n nh l lung thu rc (thu lm nhng d liu v ngha). Lung thu rc thc thi ch khi h thng khng c tc v no. N l mt lung c quyn u tin thp. Lp lung c hai phng thc lm vic vi cc lung ngm:
public void setDaemon(boolean on) public boolean isDaemon()

Chng trnh TestDaemon sau minh ho cho lung ngm


package chuong10; class TestDaemon implements Runnable { Thread Objth1, Objth2; public TestDaemon() {

Bin son : Bi Cng Giao --------------------------------------- 226 --------------------------------------

Chng 10: Lung x l Objth1 = new Thread(this); Objth1.start(); Objth2 = new Thread(this); Objth2.setDaemon(true); } public void run() { System.out.println(Thread.activeCount()); System.out.println(Objth1.isDaemon()); System.out.println(Objth2.isDaemon()); } public static void main(String args[]) { new TestDaemon(); } }

Kt qu chng trnh nh sau: 2 false true

10.2.5 a lung vi Applet


Trong khi a lung l rt hu dng trong cc chng trnh ng dng c lp, n cng ng c quan tm vi cc ng dng trn Web. a lung c s dng trn web, trong cc tr chi a phng tin, cc bc nh sinh ng, hin th cc dng ch chy qua li trn biu ng, hin th ng h thi gian nh l mt phn ca trang Web Cc chc nng ny to thnh cc trang web quyn r v bt mt. Trong a lung vi Applet, lp java.applet.Applet l lp con c to ra bi ngi s dng nh ngha applet. Chng trnh MyApplet ch ra iu ny thc thi nh th no:
package chuong10; import java.awt.*; import java.applet.*; public class MyApplet extends Applet implements Runnable { int i; Thread t;

Bin son : Bi Cng Giao --------------------------------------- 227 --------------------------------------

Chng 10: Lung x l public void init() { t = new Thread(this); t.start(); } public void paint(Graphics g) { g.drawString(" i = "+i,30,30); } public void run(){ for(i = 1;i<=20;i++) { try { repaint(); Thread.sleep(500); } catch(InterruptedException e) { System.out.println(e.getMessage()); } } } }

Hnh 10.2 a lung vi Applet Trong chng trnh ny, chng ta to ra mt Applet c gi l MyApplet, v thc thi giao din Runnable cung cp kh nng a lung cho applet. Sau , chng ta to ra mt th hin cho lp lung, vi th hin applet hin thi nh l mt tham s khi to. Ri th ta cho lung thc hin bng phng thc start(). Mn hnh s xut ra s t 1 n 20 vi thi gian tr l 500 miligiy gia mi s bng phng thc sleep(). Kt qu chng trnh nh hnh 10.2.

Bin son : Bi Cng Giao --------------------------------------- 228 --------------------------------------

Chng 10: Lung x l

10.3 Nhm lung 10.3.1 Gii thiu nhm lung


Nhm lung dng qun l cc lung nh l mt n v thng nht. N rt c ch trong cc trng hp ta mun ngn li hay chy li nhiu lung c lin quan vi nhau. V d, hy tng tng mt chng trnh trong c mt tp hp cc lung c s dng in mt ti liu, tp hp khc c s dng hin th cc ti liu trn mn hnh, v tp hp khc lu vo mt tp tin a. Nu in c hy b, bn s mun c mt cch d dng ngn chn tt c cc ch lin quan n in. Nhm lung cung cp tin li ny. Hai kiu nhm lung thit lp (khi to) l:
public ThreadGroup(String str)

y, str l tn ca nhm lung mi nht c to ra.


public ThreadGroup(ThreadGroup tgroup, String str)

y, tgroup ch ra nhm lung lung cha, str l tn ca nhm lung ang c to ra. Mt s cc phng thc trong nhm lung c cho nh sau:
public synchronized int activeCount()

Tr v s lng cc lung kch hot hin hnh trong nhm lung


public sunchronized int activeGroupCount()

Tr v s lng cc nhm hot ng trong nhm lung


public final String getName()

Tr v tn ca nhm lung
public final ThreadGroup getParent()

Tr v cha ca nhm lung Chng trnh sau y to ra hai nhm lung, mi nhm c hai lung minh ha cch s dng nhm lung:
package chuong10; class NewThread extends Thread { boolean suspendFlag; NewThread(String threadname, ThreadGroup tgOb) { super(tgOb, threadname); System.out.println("New thread: " + this); suspendFlag = false; start(); }

Bin son : Bi Cng Giao --------------------------------------- 229 --------------------------------------

Chng 10: Lung x l public void run() { try { for (int i = 5; i > 0; i--) { System.out.println(getName() + ": " + i); Thread.sleep(1000); synchronized (this) { while (suspendFlag) wait(); } } } catch (Exception e) { System.out.println("Exception in " + getName()); } System.out.println(getName() + " exiting."); } void mysuspend() { suspendFlag = true; } synchronized void myresume() { suspendFlag = false; notify(); } } class ThreadGroupDemo { public static void main(String args[]) { ThreadGroup groupA = new ThreadGroup("Group A"); ThreadGroup groupB = new ThreadGroup("Group B"); NewThread ob1 = new NewThread("One", groupA); NewThread ob2 = new NewThread("Two", groupA); NewThread ob3 = new NewThread("Three", groupB); NewThread ob4 = new NewThread("Four", groupB); System.out.format("%nHere is output from list():"); groupA.list(); groupB.list(); System.out.println(); System.out.println("Suspending Group A"); Thread tga[] = new Thread[groupA.activeCount()];

Bin son : Bi Cng Giao --------------------------------------- 230 --------------------------------------

Chng 10: Lung x l

// Chp tt c cc lung trong nhm lung A vo mng lung. groupA.enumerate(tga); for (int i = 0; i < tga.length; i++) ((NewThread) tga[i]).mysuspend(); // treo tng lung try { Thread.sleep(4000); } catch (InterruptedException e) { System.out.println("Main thread interrupted."); } System.out.println("Resuming Group A"); for (int i = 0; i < tga.length; i++) // khi ng li tng lung trong mng lung ((NewThread) tga[i]).myresume(); // Ch cc lung kt thc try { System.out.println("Waiting for threads to finish."); ob1.join(); ob2.join(); ob3.join(); ob4.join(); } catch (Exception e) { System.out.println("Exception in Main thread"); } System.out.println("Main thread exiting."); } }

Kt qu chng trnh nh sau: New thread: Thread[One,5,Group A] New thread: Thread[Two,5,Group A] New thread: Thread[Three,5,Group B] New thread: Thread[Four,5,Group B] Here is output from list():Four: 5

Bin son : Bi Cng Giao --------------------------------------- 231 --------------------------------------

Chng 10: Lung x l

Two: 5 Three: 5 One: 5 java.lang.ThreadGroup[name=Group A,maxpri=10] Thread[One,5,Group A] Thread[Two,5,Group A] java.lang.ThreadGroup[name=Group B,maxpri=10] Thread[Three,5,Group B] Thread[Four,5,Group B] Suspending Group A Four: 4 Three: 4 Four: 3 Three: 3 Four: 2 Three: 2 Three: 1 Four: 1 Resuming Group A Two: 4 Waiting for threads to finish. One: 4 Four exiting. Two: 3 Three exiting. One: 3 Two: 2 One: 2 Two: 1 One: 1 Two exiting. One exiting. Main thread exiting.

Bin son : Bi Cng Giao --------------------------------------- 232 --------------------------------------

Chng 10: Lung x l

Bin son : Bi Cng Giao --------------------------------------- 233 --------------------------------------

Chng 10: Lung x l

10.3.2 S ng b lung
Trong khi ang lm vic vi nhiu lung, c th nhiu hn mt lung mun thm nhp cng mt bin ti cng thi im. Ly v d, mt lung c th c gng c d liu, trong khi lung khc c gng thay i d liu. Trong trng hp ny, d liu c th b sai lc. Trong nhng trng hp ny, ta cn cho php mt lung hon thnh trn vn tc v ca n (thay i gi tr), v ri th cho php cc lung k tip thc thi. Khi hai hoc nhiu hn cc lung cn thm nhp n mt ti nguyn c chia s, ta cn chc chn rng ti nguyn s c s dng ch bi mt lung ti mt thi im. Tin trnh ny c gi l s ng b (synchronization). Java cung cp c ch ng b bo cho h thng t mt kha ln mt ti nguyn c bit. Mu cht ca s ng b ha l khi nim monitor (s gim st). Mt monitor xem nh l mt hp nh ch cha mt lung ti mt thi im. Tt c cc lung khc c gng thm nhp vo monitor s b tr hon, cho n khi lung bn trong monitor thot ra. Cc lung khc c bo ch i monitor. Nu cn thit lung c monitor c th thm nhp tr li cng monitor .

10.3.3 M ng b
Tt c cc i tng trong Java c lin kt vi cc monitor ca ring n. i vi mt lung i vo monitor ca mt i tng, ta s dng t kha synchronized trc mt phng thc. Khi mt lung ang c thc thi trong phm vi mt phng thc ng b, bt k lung khc hoc phng thc ng b khc c gng gi n trong cng th hin s phi i. Chng trnh Sync chng minh s lm vic ca t kha synchronized (s ng b). y, lp Target c mt phng thc display() (hin th) m phng thc ny ly mt tham s kiu int. S ny c hin th theo dng < s s>. Phng thc Thread.sleep(1000) tm dng lung hin ti sau khi phng thc display() c gi. Phng thc xy dng ca lp Source ly mt tham chiu n mt i tng t ca lp Target, v mt bin s nguyn. y, mt lung mi c to ra. Lung ny gi phng thc run() ca i tng t. Lp chnh Synch to i tng ca lp Target, v ba i tng ca lp Source. i tng target c truyn cho mi i tng Source. Phng thc join() lm lung gi i cho n khi vic lung kt thc.
package chuong10; class Target { synchronized void display(int num) { System.out.print("< "+num); try {

Bin son : Bi Cng Giao --------------------------------------- 234 --------------------------------------

Chng 10: Lung x l Thread.sleep(1000); } catch(InterruptedException e) { System.out.println("Interrupted"); } System.out.println( + num+ ">"); } } class Source implements Runnable { int number; Target target; Thread t; public Source(Target targ,int n) { target = targ; number = n; t = new Thread(this); t.start(); } public void run(){ target.display(number); } } public class Sync { public static void main(String args[]){ Target target = new Target(); int digit = 10; Source s1 = new Source(target,digit++); Source s2 = new Source(target,digit++); Source s3 = new Source(target,digit++); try { s1.t.join(); s2.t.join(); s3.t.join(); } catch(InterruptedException e) { System.out.println("Interrupted"); }

Bin son : Bi Cng Giao --------------------------------------- 235 --------------------------------------

Chng 10: Lung x l } }

Kt qu hin th nh sau <10 10> <12 12> <11 11> Trong chng trnh trn, c mt dy s ng nhp c hin th bi display(). iu ny c ngha l vic thm nhp b hn ch mt lung ti mi thi im. Nu ta b t kha synchronized t trc phng thc display() ca lp Target, tt c lung trn c th cng lc gi cng phng thc, trn cng i tng. iu kin ny c bit n nh l tnh trng tranh ua (race condition). Trong trng hp ny, vic xut ra ngoi s nh sau <10<11<12 10> 12> 11>

10.3.4 S dng khi ng b


To ra cc phng thc ng b trong phm vi cc lp l mt con ng d dng v c hiu qu ca vic thc hin s ng b. Tuy nhin, iu ny khng lm vic trong tt c cc trng hp. Hy xem mt trng hp ta mun s ng b c thm nhp vo cc i tng ca lp m khng c thit k cho thm nhp a lung. Tc l, lp khng s dng cc phng thc ng b. Hn na, m ngun nh ngha lp khng c cho chng ta thm synchronized trc phng thc ng b. ng b s truy nhp mt phng thc ca i tng t ni gi ta s dng chung mt khi ng b (synchronized block) nh sau:
synchronized(object) } { // cc cu lnh ng b

y, object l mt tham chiu n i tng c ng b. Mt khi ng b bo m rng n gi n cc phng thc (m l thnh phn ca i tng) ch sau khi lung hin hnh c thm nhp thnh cng vo monitor ca i tng.

Bin son : Bi Cng Giao --------------------------------------- 236 --------------------------------------

Chng 10: Lung x l

Chng trnh SynchBlock ch ra cu lnh ng b s dng nh th no:


package chuong10; class TargetSynchBlock { void display(int num) { System.out.print("<"+num); try { Thread.sleep(1000); } catch(InterruptedException e) { System.out.println("Interrupted"); } System.out.println( + num+ ">"); } } class SourceSynchBlock implements Runnable{ int number; TargetSynchBlock target; Thread t; public Source(TargetSynchBlock targ,int n) { target = targ; number = n; t = new Thread(this); t.start(); } // ng b gi phng thc display() public void run(){ synchronized(target) { target.display(number); } } } public class SynchBlock { public static void main(String args[]){ TargetSynchBlock target = new TargetSynchBlock (); int digit = 10;

Bin son : Bi Cng Giao --------------------------------------- 237 --------------------------------------

Chng 10: Lung x l SourceSynchBlock s1 = new SourceSynchBlock (target,digit++); SourceSynchBlock s2 = new SourceSynchBlock (target,digit++); SourceSynchBlock s3 = new SourceSynchBlock (target,digit++); try { s1.t.join(); s2.t.join(); s3.t.join(); } catch(InterruptedException e){ System.out.println("Interrupted"); } } }

y, t kha synchronized khng hiu chnh phng thc display(). T kha ny c s dng trong phng thc run() ca lp TargetSynchBlock. Kt qu xut ra mn hnh nh sau: <10 10> <11 11> <12 12> S khng thun li ca cc phng thc ng b Ngi lp trnh thng vit cc chng trnh trn cc n th lung. Tt nhin cc trng thi ny chc chn khng li ch cho a lung. Ly v d, lng khng tn dng vic thc thi ca trnh bin dch. Trnh bin dch Java t Sun khng cha nhiu phng thc ng b. Cc phng thc ng b khng thc thi tt nh l cc phng thc khng ng b. Cc phng thc ny chm hn t ba n bn ln so vi cc phng thc tng ng khng ng b. Trong trng thi ni m vic thc thi l c gii hn, cc phng thc ng b b ngn chn.

10.3.5 K thut i thng bo


Java cung cp mt c ch lin lc bn trong s dng cc phng thc wait(), notify() v notifyAll(). Cc phng thc ny c thc hin nh l cc cc phng thc final trong lp Object, tt c lp c th truy xut chng. Ba phng thc ny c th c gi ch t trong mt phng thc ng b. Phng thc wait() bo cho lung ang gi thot khi monitor i vo trng thi sleep cho n khi mt s lung khc vo cng monitor v gi phng thc notify().

Bin son : Bi Cng Giao --------------------------------------- 238 --------------------------------------

Chng 10: Lung x l

Phng thc notify() nh thc hay thng bo cho lung u tin m gi phng thc wait(). Phng thc notifyAll() nh thc hay thng bo tt c cc lung m gi phng thc wait(). Khi tt c lung i vo trng thi sleep, lung c quyn u tin cao nht s chy u tin. Chng trnh Dining biu th cho vic s dng cc phng thc notify() v wait():
package chuong10; class ChopStick { boolean available; ChopStick() { available = true; } public synchronized void takeup(int philo_num, String side) { while (!available) { try { System.out.println("Philosopher is waiting for the + side+ chopstick"); wait(); } catch (InterruptedException e) { } } System.out.println("Philosopher is taking up the + side+ chopstick"); available = false; } public synchronized void putdown(int philo_num, String side) { System.out.println("Philosopher "+ philo_num + " is putting down the " + side+ " chopstick"); available = true; notify(); } } class Philosopher extends Thread { ChopStick left, right; int philo_num; Philosopher(int num, ChopStick chop1, ChopStick chop2) {

Bin son : Bi Cng Giao --------------------------------------- 239 --------------------------------------

Chng 10: Lung x l philo_num = num; left = chop1; right = chop2; } public void eat() { left.takeup(philo_num+ 1, "left"); right.takeup(philo_num+ 1, "right"); System.out.println("Philosopher " + (philo_num + 1) + " is eating"); } public void think() { left.putdown(philo_num+ 1, "left"); right.putdown(philo_num+ 1, "right"); System.out.println("Philosopher " + (philo_num + 1) + " is thinking"); } public void run() { while (true) { eat(); try { sleep(1000); } catch (InterruptedException e) { } think(); try { sleep(1000); } catch (InterruptedException e) { } } } } public class Dining { static ChopStick[] chopsticks = new ChopStick[5]; static Philosopher[] philos = new Philosopher[5]; public static void main(String args[]) { for (int count = 0; count <= 4; count++) { chopsticks[count] = new ChopStick(); }

Bin son : Bi Cng Giao --------------------------------------- 240 --------------------------------------

Chng 10: Lung x l for (int count = 0; count <= 4; count++) philos[count] = new Philosopher(count, chopsticks[count], chopsticks[(count + 1) % 5]); for (int count = 0; count <= 4; count++) { philos[count].start(); } } }

Kt qu xut ra mn hnh nh sau: Philosopher 1 is taking up the left chopstick Philosopher 1 is taking up the right chopstick Philosopher 1 is eating Philosopher 3 is taking up the left chopstick Philosopher 3 is taking up the right chopstick Philosopher 3 is eating Philosopher 5 is taking up the left chopstick Philosopher 5 is waiting for the right chopstick Philosopher 2 is waiting for the left chopstick Philosopher 4 is waiting for the left chopstick Philosopher 1 is putting down the left chopstick Philosopher 1 is putting down the right chopstick Philosopher 1 is thinking Philosopher 3 is putting down the left chopstick Philosopher 3 is putting down the right chopstick Philosopher 3 is thinking .

10.3.6 S b tt
Mt s b tt (deadlock) xy ra khi hai lung c mt ph thuc vng trn mt cp i tng ng b. V d, khi mt lung thm nhp vo monitor trn i tng ObjA, v mt lung khc thm nhp vo monitor trn i tng ObjB. Nu lung trong ObjA c gng gi bt k phng thc ng b trn ObjB, mt b tt xy ra. Kh g li mt b tt bi n him khi xy ra.

Bin son : Bi Cng Giao --------------------------------------- 241 --------------------------------------

Chng 10: Lung x l

Xt chng trnh SimpleDeadLock sau:


package chuong10; public class SimpleDeadLock extends Thread { public static Object l1 = new Object(); public static Object l2 = new Object(); private int index; public static void main(String[] a) { Thread t1 = new Thread1(); Thread t2 = new Thread2(); t1.start(); t2.start(); } private static class Thread1 extends Thread { public void run() { synchronized (l1) { System.out.println("Thread 1: Holding lock 1..."); try { Thread.sleep(10); } catch (InterruptedException e) { } System.out.println("Thread 1: Waiting for lock 2..."); synchronized (l2) { System.out.println("Thread 2: Holding lock 1 & 2..."); } } } } private static class Thread2 extends Thread { public void run() { synchronized (l2) { System.out.println("Thread 2: Holding lock 2..."); try {

Bin son : Bi Cng Giao --------------------------------------- 242 --------------------------------------

Chng 10: Lung x l Thread.sleep(10); } catch (InterruptedException e) { } System.out.println("Thread 2: Waiting for lock 1..."); synchronized (l1) { System.out.println("Thread 2: Holding lock 2 & 1..."); } } } } }

Kt qu ca chng trnh ny c hin th nh sau: Thread 1: Holding lock 1... Thread 2: Holding lock 2... Thread 2: Waiting for lock 1... Thread 1: Waiting for lock 2.. Nh kt qu xut ra, sau khi c kha 1, lung t1 b treo li ch i tng l2 m i tng ny c gi bi lung t2 v n s khng bao gi c nh ra, bi v t2 cng b treo li ch i tng l1 m i tng ny c gi bi t1. V vy, khng lung no c th di chuyn tip. T phi nhn Ctrl-C dng chng trnh.

10.4 Thu rc
Thu rc (garbage collection) ci to hoc lm trng b nh dnh cho cc i tng m cc chng khng c s dng trong thi gian di. Trong ngn ng lp trnh hng i tng khc nh C++, lp trnh vin phi t gii phng b nh. Cn Java t ng tin trnh thu rc gii quyt vn ny. Mt i tng tr nn thch hp cho s thu rc nu khng c tham chiu n n, hoc nu n ng k rng. S thu rc thc thi nh l mt lung ring bit c quyn u tin thp. Ta c th vin dn mt phng thc gc() ca mt i tng kiu Runtime vin dn s thu rc. Ta c th chy phng thc thu rc, nhng khng bo m rng n s thu rc ngay lp tc. Tham chiu khng phi l mc tiu thu rc; ch cc i tng mi c thu rc. V d:
Object a = new Object();

Bin son : Bi Cng Giao --------------------------------------- 243 --------------------------------------

Chng 10: Lung x l Object b = a; a = null;

y, s l sai khi ni rng b l mt i tng. N ch l mt i tng tham chiu. Trong on m trn mc d a c gn l null, nhng i tng c to ra bi
new Object() khng th c thu rc, bi v n vn cn c mt tham chiu (b) n n.

Tuy nhin, trong v d cho di y, gi nh rng khng c tham chiu n i tng th n tr nn thch hp cho thu rc.
Object a = new Object(); a = null;

Mt v d khc:
Object m = new Object(); Object m = null;

i tng bt u c th c thu rc Mt v d khc:


Object m = new Object(); m = new Object();

By gi, i tng u tin c th c thu rc do m ang ang tham chiu ti i tng khc. Chng trnh GCTest minh ho cho thu rc.
package chuong10; public class GCTest { final int CAPACITY = 50000; void eatMemory() { int[] intArray = new int[CAPACITY]; for (int i = 0; i < CAPACITY; i++) intArray[i] = i; } public static void main(String[] args) { GCTest gct = new GCTest(); // to i tng kiu Runtime Runtime r = Runtime.getRuntime(); // xc nh kch thc b nh trng

Bin son : Bi Cng Giao --------------------------------------- 244 --------------------------------------

Chng 10: Lung x l System.out.println("free memory before creating array: " + r.freeMemory()); // cp pht b nh gct.eatMemory(); // xc nh kch thc b nh trng sau khi cp pht System.out.println("free memory after creating array: " + r.freeMemory()); // thu rc ri kim tra b nh trng r.gc(); System.out.println("free memory after running gc(): r.freeMemory()); } } "+

Kt qu xut ra mn hnh ca chng trnh trn nh sau: free memory before creating array: 16047416 free memory after creating array: 15847400 free memory after running gc(): 16103664

TNG KT CHNG 10
Mt lung l n v nh nht ca on m thc thi c m mt tc v ring bit. a lung gi cho thi gian ri l nh nht. iu ny cho php ta vit cc chng trnh c kh nng s dng ti a CPU. Lung bt u thc thi sau khi phng thc start() c gi Lp trnh vin, my o Java, hoc h iu hnh bo m rng CPU c chia s gia cc lung. C hai loi lung trong mt chng trnh Java: Lung ngi dng Lung ngm. Mt nhm lung dng qun l mt nhm cc lung. ng b cho php ch mt lung thm nhp mt ti nguyn c chia s ti mt thi im.

Bin son : Bi Cng Giao --------------------------------------- 245 --------------------------------------

Chng 10: Lung x l

trnh kim sot vng, Java bao gm mt thit k tt trong tin trnh k thut truyn thng s dng cc phng thc wait(), notify() v notifyAll() Mt b tt xy ra khi hai lung c mt ph thuc xoay vng trn mt phn ca cc i tng ng b Thu rc l mt tin trnh nh b nh c nh v cc i tng m khng s dng trong thi gian di, c th ci to hoc lm rnh b nh.

BI TP
1. Kim tra li s hiu bit a. Mt ng dng c th cha ng nhiu lung b. Cc lung con c to ra t lung chnh ng/Sai ng/Sai

c. Mi lung trong mt chng trnh Java c ng k mt quyn u tin m my o Java c th thay i. ng/Sai d. Phng thc____________ c th tm thi ngng vic thc thi lung e. Mc nh, mt lung c mt quyn u tin ________ mt hng s ca _______ f. _________ lung c dng cho cc lung nn, cung cp dch v cho lung khc. g. Trong lung ng b, mt __________ l mt i tng m c s dng nh l mt kha ring bit ln nhau. h. ___________ thng thc thi bi mt vng lp m c s dng lp li vic kim tra mt s iu kin. 2. Vit mt chng trnh m hin th mt s m li tng giy cho n khng, nh hnh sau:

Ban u, s 300 s c hin th. Gi tr s c gim dn cho n 1 n khi ngoi gi tr 0. Gi tr s c tr li 300 mt ln na gim n tr thnh 0. 3. Vit mt chng trnh hin th nh hnh di y:

Bin son : Bi Cng Giao --------------------------------------- 246 --------------------------------------

Chng 10: Lung x l

To ba lung v mt lung chnh trong main. Thc thi mi lung nh mt chng trnh thc thi. Khi chng trnh kt thc, cc cu lnh thot cho mi lung s c hin th. S dng k thut nm bt li.

Bin son : Bi Cng Giao --------------------------------------- 247 --------------------------------------

Tham kho
[1] Jacquie Barker, Beginning Java Objects: From Concepts to Code, Second Edition, Apress, 2005 [2] Trn nh Qu v Nguyn Mnh Hng, Bi ging Lp trnh Hng i tng, Hc vin Cng ngh Bu chnh Vin thng [3] Gio trnh Aptech Java Simplified I [4] Introduction to File Input and Output, http://www.seas.upenn.edu/~cis1xx/resources/java/fileIO/introToFileIO.html [5] http://vi.wikipedia.org/wiki/Java(ngn_ng_lp_trnh) [6] Nhp mn Java vi JDBC v MySQL, http://www.aptech.vn/news/laptrinhvien/612/ [7] Menu Demo, http://www.java2s.com/Code/Java/Swing-JFC/MenuDemo.htm [8] Link List Example in Java, http://www.roseindia.net/java/beginners/linked-listdemo.shtml [9] ThreadGroup Sample in Java, http://www.javasamples.com/showtutorial.php?tutorialid=233 [10] Java Thread Deadlock Demo Program, http://www.herongyang.com/Java-Tools/jstack-Java-Thread-Deadlock-DemoProgram.html [11] Java Runtime class - Invoke the Java garbage collector, http://www.devdaily.com/java/edu/pj/pj010008 [12] Overloading, Overriding, Runtime Types and Object Orientation - Overloading Methods, http://www.janeg.ca/scjp/overload/overloadingMethods.html [13] http://www.congdongjava.com [14] Trnh Thanh Bnh, Trng Anh Hong, Nguyn Vit H, Kim chng giao thc tng tc gia cc thnh phn trong chng trnh a lung s dng lp trnh hng kha cnh, Tp ch thng tin, khoa hc cng ngh ca B thng tin truyn thng, 112010, trang 37

Bin son : Bi Cng Giao --------------------------------------- 248 --------------------------------------

You might also like