Lập trình Java trung cấp Roy W. MillerIBM

Embed Size (px)

Citation preview

  • Lp trnh Java trung cp

    Roy W. MillerIBM

    Tm tt: Ngn ng Java cung cp hu ht nhng g m cc lp trnh vin chuyn nghip mong i i vi mt ngn ng lp trnh v thm ch l i vi mt ngn ng hng-i tng. Th nhng, ngoi nhng iu cn bn, ngn ng Java cn cung cp mt s cng c c ch to ra cc chng trnh tinh vi hn. Hng dn ny s gii thiu cho bn mt s trong cc c tnh nng cao hn ny ca ngn ng Java thng c thy trong cc d n pht trin cng ngh Java in hnh.

    Trc khi bn bt u

    V hng dn ny

    Hng dn ny gii thiu cho bn v cc kh nng ca ngn ng Java tinh t hn nhng kh nng trnh by trong hng dn "Gii thiu v lp trnh Java" (xem Ti nguyn tm lin kt n hng dn ny v cc ti liu khc c tham chiu trong ). hc c nhiu nht t hng dn ny, bn nn tm hiu xong hng dn nhp mn hoc lm quen vi cc khi nim c trnh by trong n.

    Ngn ng Java cung cp mt b cng c khng l c th gip cho mt lp trnh vin hon thnh hu ht mi nhim v. Trong hng dn ny, chng ti s trnh by mt s trong cc cng c cao cp hn thng c dng trong cc d n pht trin Java, bao gm nh sau:

    Tha k v tru tng ha.

    Cc giao din.

    Cc lp lng trong.

    Cc biu thc chnh quy.

    Cc su tp.

    Ngy thng.

    Vo/Ra (I/O).

  • Cc iu kin cn trc

    Ni dung ca hng dn ny hng ti cc lp trnh vin Java mi c t kinh nghim, nhng ngi c th cha quen vi mt s trong nhiu c tnh ngn ng c lin quan. N gi nh rng bn c kin thc thng thng v vic ti v v ci t phn mm v mt kin thc chung v lp trnh hng i tng (OOP) vi ngn ng Java. Bn c th khng s dng cc c tnh cao cp hn ca ngn ng Java m chng ti s ni v chng ti y trong mi ng dng -- v thc s, c l bn khng nn lm th -- nhng s l sng sut khi mt lp trnh vin chuyn nghip bit v chng v c th s dng chng khi ph hp.

    Ngoi vic lm quen vi cc khi nim c trnh by trong hng dn "Gii thiu v lp trnh Java", xem Ti nguyn), bn s cn phi ci t cc phn sau y chy cc v d hay m mu trong hng dn ny:

    JDK 1.4.2 hoc cao hn (khuyn co s dng phin bn 5.0).

    Mi trng pht trin tch hp (IDE) Eclipse.

    Tt c cc m v d trong hng dn ny c kim tra vi JDK 5.0 trn nn tng Windows XP, nhng n cng s hot ng c m khng cn sa i khi s dng JDK 1.4.x. Bn c th ti v m ngun cho hng dn t phn Ti nguyn. N c cha trong tp tin intermediate.jar m bn c th nhp khu vo trong vng lm vic trong Eclipse ca bn.

    Cc tp tin JAR mu khng nht thit phi cha m ca mi v d trong hng dn ny dng hon tt cui cng. Thay vo , n cha cc ct li ca nhng g m chng ti s trnh by, tr mt s cc sa i dn tng bc m chng ti s p dng cho cc m theo din tin ca bi vit ny. Vic sa i phn m ct li khm ph cc c tnh ngn ng m chng ti s trnh by trong hng dn ny c dnh li nh l mt bi tp cho bn.

  • Tha k v tru tng ha

    Tha k l g?

    Cc lp trong m Java tn ti trong mt h thng th bc. Cc lp bc trn mt lp cho trong mt h thng th bc l cc lp bc trn (superclasses) ca lp . Lp c th l mt lp con (subclass) ca tt c cc lp bc cao hn. Mt lp con tha k t cc lp bc trn ca n. Lp Object trn nh ca mi h thng th bc cc lp. Ni cch khc, mi lp l mt lp con ca (v tha k t) Object.

    V d, gi s chng ta c mt lp Adult trng nh sau:

    public class Adult {

    protected int age = 0;

    protected String firstname = "firstname";

    protected String lastname = "lastname";

    protected String gender = "MALE";

    protected int progress = 0;

    public Adult() { }

    public void move() {

    System.out.println("Moved.");

    }

    public void talk() {

    System.out.println("Spoke.");

    }

    }

  • Lp Adult ca chng ta k tha ngm t lp Object. iu ny c tha nhn cho mi lp, v vy bn khng phi g extends Object trong nh ngha lp. Nhng ni rng lp ca chng ta tha k t (cc) lp bc trn ca n c ngha l g? N n gin c ngha l lp Adult c quyn truy cp vo cc bin v cc phng thc c trng ra (exposed) trong cc lp bc trn ca n. Trong trng hp ny, n mun ni rng lp Adult c th thy v s dng nhng phn sau y t bt k cc lp bc trn no ca n (chng ta ch c mt vo lc ny):

    Cc bin v phng thc cng khai (public).

    Cc bin v phng thc cng khai c bo v (protected).

    Cc bin v phng thc c bo v theo gi (Package protected) (c ngha l, chng khng c t c t (specifier) quyn truy cp), nu lp bc trn trong cng mt gi nh lp Adult

    Cc hm to l c bit. Chng khng phi l cc thnh vin hng i tng (OO) lng cnh, do chng khng c tha k.

    Nu mt lp con ghi mt phng thc hay mt bin t lp bc trn -- ni cch khc l khi lp con trin khai thc hin mt thnh vin c cng tn -- th n che du thnh vin ca lp bc trn. Chnh xc hn, vic ghi mt bin s che giu n v vic ghi mt phng thc ch n gin ghi n, nhng c hiu qu tng t nhau: thnh vin b ghi v c bn c n i. Bn vn c th truy cp n c cc thnh vin ca lp bc trn bng cch s dng t kha super:

    super.hiddenMemberName

    Trong trng hp lp Adult, tt c nhng g m n tha k vo lc ny l cc phng thc v Object (toString(), chng hn). Do , cc on m sau y l hon ton c th chp nhn c:

    Adult anAdult = new Adult();

  • anAdult.toString();

    Phng thc toString() khng tn ti r rng trn lp Adult, nhng lp Adult tha k n.

    Bn hy nn ghi nh rng y c cc v "Tm ra ri" (gotchas- ni v vic pht hin ra nguyn nhn ca mt hnh vi bt ng, khng nh mong i trong chng trnh, tuy nhin khng phi l li, v tt c u ng nh ti liu hng dn). Trc ht, rt d dng t tn cc bin v cc phng thc trong mt lp con vi tn ging nh cc bin v cc phng thc trong cc lp bc trn ca lp , ri sau b ln ln khi bn khng th gi ra mt phng thc c tha k. Hy nh rng, khi bn a ra mt phng thc c cng tn trong mt lp con ging nh mt lp tn ti trong mt lp bc trn, bn che giu n. Th hai, cc hm to khng c tha k, nhng chng c gi ra. C mt li gi ngm n hm to ca lp bc trn trong bt k hm to no ca lp con c bn vit v l iu u tin m hm to ca lp con thc hin. Bn phi sng chung vi iu ny; bn khng th lm g thay i n. V d, hm to Adult ca chng ta thc s trng nh di y khi thc chy, mc d chng ta khng g bt c ci g trong phn thn:

    public Adult() {

    super();

    }

    Dng trong phn thn ca hm to s gi hm to khng c i s ca lp bc trn. Trong trng hp ny, l hm to ca Object.

    nh ngha mt h thng th bc cc lp

    Gi chng ta c mt lp c tn l Baby. N trong ging nh th ny:

  • public class Baby {

    protected int age = 0;

    protected String firstname = "firstname";

    protected String lastname = "lastname";

    protected String gender = "MALE";

    protected int progress = 0;

    public Baby() {

    }

    public void move() {

    System.out.println("Moved.");

    }

    public void talk() {

    System.out.println("Spoke.");

    }

    }

    Cc lp Adult and Baby ca chng ta trng rt ging nhau. Trong thc t, chng hu nh ng nht. Vic sao p m nh th lm cho vic bo tr m thm kh khn hn mc cn thit. Chng ta c th to ra mt lp bc trn, di chuyn tt c cc phn t chung ln lp v loi b phn m sao p. Lp bc trn ca chng ta c th c t tn l Person v n c th trng ging nh sau:

  • public class Person {

    protected int age = 0;

    protected String firstname = "firstname";

    protected String lastname = "lastname";

    protected String gender = "MALE";

    protected int progress = 0;

    public Person() {

    }

    public void move() {

    System.out.println("Moved.");

    }

    public void talk() {

    System.out.println("Spoke.");

    }

    }

    By gi chng ta c th cho Adult v Baby lm lp con ca Person, v lm cho hai lp y thnh kh n gin vo lc ny:

    public class Adult {

    public Adult() {

    }

  • }

    public class Baby {

    public Baby() {

    }

    }

    Mt khi chng ta c h thng th bc, chng ta c th tham chiu mt c th ca mi lp con nh l mt c th ca bt k cc lp bc trn no ca n trong h thng th bc. V d:

    Adult anAdult = new Adult();

    System.out.println("anAdult is an Object: " + (Adult instanceof Object));

    System.out.println("anAdult is a Person: " + (Adult instanceof Person));

    System.out.println("anAdult is anAdult: " + (Adult instanceof Adult));

    System.out.println("anAdult is a Baby: " + (Adult instanceof Baby));

    M ny s cho chng ta ba kt qu ng v mt kt qu sai. Bn cng c th p kiu (cast) mt i tng thnh bt k kiu bc cao hn no trong h thng th bc ca n, nh di y:

    Adult anAdult = new Adult();

    Person aPerson = (Person) anAdult;

    aPerson.move();

  • M ny s bin dch m khng c vn g. Chng ta c th p kiu mt Adult thnh kiu Person, sau gi mt phng thc Person trn .

    Do chng ta c h thng th bc ny, nn m trn cc lp con ca chng ta n gin hn. Nhng bn c thy mt vn y khng? By gi tt c cc Adult v v tt c cc Baby (th li v vic dng t s nhiu khng ng) s ni nng v i li theo cng mt cch. Ch c duy nht mt trin khai thc hin cho mi hnh vi. khng phi l nhng g m chng ta mun, bi v nhng ngi trng thnh khng ni nng hoc i li ging nh tr con. Chng ta c th ghi move() v talk() trong cc lp con, nhng sau v c bn chng ta khng s dng c hnh vi "tiu chun" nh ngha trong lp bc trn ca chng ta. Ci m chng ta thc s mun l mt cch bt buc cc lp con ca chng ta i li v ni nng theo cch c th ring ca chng. l nhng g m cc lp tru tng s lm.

    Tru tng ha

    Trong bi cnh hng i tng, tru tng ha cp n hot ng tng qut ha d liu v hnh vi thnh mt kiu bc cao hn so vi lp hin ti trong h thng th bc. Khi bn di chuyn cc bin hoc cc phng thc t mt lp con vo mt lp bc trn, bn ang tru tng ha cc thnh vin ny.

    l cc thut ng chung v chng cng c p dng trong ngn ng Java. Nhng ngn ng Java cng b sung thm cc khi nim v cc lp tru tng v cc phng thc tru tng. Lp tru tng l mt lp khng c th ha c. V d, bn c th to ra mt lp c tn l Animal. Vic to ra mt c th t lp nh vy s khng c ngha: Trong thc t, bn ch mun to ra cc c th ca mt lp c th nh Dog. Nhng tt c cc Animal c mt s im chung, chng hn nh kh nng ku. Vic ni rng mt Animal ku khng cho bn bit g nhiu. Ting ku th no ph thuc vo loi ng vt. Lm th no m hnh ha iu ? Bn nh ngha cc im chung trong cc lp tru tng v bn bt buc cc lp con trin khai thc hin hnh vi c th c th cho loi ca chng.

    Bn c th c c lp tru tng v lp c th trong h thng th bc ca bn.

  • S dng lp tru tng

    Lp Person ca chng ta cha mt s phng thc hnh vi m chng ta cn cha bit l chng ta cn hay khng. Hy g b n v bt buc cc lp con trin khai thc hin hnh vi mt cch a dng. Chng ta c th lm iu bng cch nh ngha cc phng thc ca Person l tru tng. Sau , cc lp con ca chng ta s phi trin khai thc hin cc phng thc .

    public abstract class Person {

    ...

    abstract void move();

    abstract void talk();

    }

    public class Adult extends Person {

    public Adult() {

    }

    public void move() {

    System.out.println("Walked.");

    }

    public void talk() {

    System.out.println("Spoke.");

    }

    }

  • public class Baby extends Person {

    public Baby() {

    }

    public void move() {

    System.out.println("Crawled.");

    }

    public void talk() {

    System.out.println("Gurgled.");

    }

    }

    Chng ta thc hin nhng g trong bn Listing ny?

    Chng ta thay i Person lm cho cc phng thc thnh tru tng, bt buc cc lp con trin khai thc hin chng.

    Chng ta lm cho Adult thnh lp con ca Person v trin khai thc hin cc phng thc.

    Chng ta lm cho Baby thnh lp con ca Person v trin khai thc hin cc phng thc.

    Khi bn khai bo mt phng thc l tru tng, bn cn cc lp con thc hin phng thc, hoc chnh lp con li tip tc l tru tng v chuyn giao trch nhim trin khai thc hin ti cc lp con bc di na. Bn c th thc hin mt s phng thc trn lp tru tng v buc cc lp con thc hin nhng phng thc khc. iu ny ty thuc vo bn. n gin ch cn khai bo nhng ci bn khng mun trin khai thc hin l tru tng v khng cung cp phn thn ca phng thc. Nu mt lp con khng thc hin mt phng thc tru tng t mt lp bc trn, th trnh bin dch s bo li.

  • V c hai Adult v Baby u l lp con ca Person, chng ta c th quy mt c th ca mi lp l thuc kiu Person.

    Cu trc li thnh hnh vi tru tng

    By gi chng ta c lp Person, Adult v Baby trong h thng th bc ca chng ta. Gi chng ta mun lm cho hai lp con thc t hn bng cch thay i cc phng thc move() ca chng nh sau:

    public class Adult extends Person {

    ...

    public void move() {

    this.progress++;

    }

    ...

    }

    public class Baby extends Person {

    ...

    public void move() {

    this.progress++;

    }

    ...

    }

  • By gi mi lp cp nht bin c th ca n phn nh mt tin trin no ang c thc hin mi khi chng ta gi move(). Tuy nhin, cn lu rng hnh vi li vn ging nhau. Cu trc li m loi b sao p m l c ngha. Vic cu trc li thch hp nht l di chuyn move() ti Person.

    ng, chng ta ang thm vic trin khai thc hin phng thc quay tr li lp bc trn m chng ta va ly n ra. y l mt v d rt n gin, do vic chuyn qua chuyn li ny c v qu lng ph. Nhng nhng g m chng ta va tri qua l ph bin khi bn vit m Java. Bn thng xuyn thy cc lp v cc phng thc thay i khi h thng ln ln v i khi bn i n ch c sao p m m bn c th cu trc li, a vo cc lp bc trn. Thm ch bn c th lm iu , sau quyt nh rng y l mt sai lm v a hnh vi quay tr li xung cc lp con. n gin l c th bn khng bit v tr thch ng ca tt c cc hnh vi ti thi im bt u qu trnh pht trin. Bn ch bit c v tr thch ng dnh cho hnh vi khi bn tin ln.

    Hy cu trc li cc lp ca chng ta t move() quay li lp bc trn:

    public abstract class Person {

    ...

    public void move() {

    this.progress++;

    }

    public abstract void talk();

    }

    public class Adult extends Person {

    public Adult() {

    }

  • public void talk() {

    System.out.println("Spoke.");

    }

    }

    public class Baby extends Person {

    public Baby() {

    }

    public void talk() {

    System.out.println("Gurgled.");

    }

    }

    By gi cc lp con ca chng ta trin khai thc hin cc phin bn khc nhau ca talk(), nhng chia s cng mt hnh vi move().

    Khi no tru tng ha... v khi no th khng

    Vic quyt nh khi no tru tng ha (hay to mt h thng th bc) l mt ch tranh lun nng trong gii hng i tng, c bit l gia cc lp trnh vin ngn ng Java. Chc chn c rt t cc cu tr li ng hoc sai v cch lm th no cu trc h thng th bc cc lp. y l mt lnh vc cc nh thc hnh c tay ngh v tn tm c th (v thng xuyn l) khng ng vi nhau. D sao i na, c mt s quy tc ngn tay ci thch hp phi theo i vi cc h thng th bc.

  • Th nht, khng tru tng ha ngay t u. Hy i cho n khi m thng bo cho bn rng bn nn tru tng ha. Cu trc li trn ng bn i n tru tng ha lun lun l cch tt hn l gi nh bn cn n ngay lc bt u. ng gi nh rng bn cn c mt h thng th bc. Nhiu lp trnh vin Java lm dng cc h thng th bc.

    Th hai, chng li vic s dng cc lp tru tng khi bn c th. Chng khng phi l xu, chng ch c cc hn ch. Chng ta thng s dng mt lp tru tng bt buc cc lp con ca chng ta trin khai hnh vi nht nh no . Mt giao din (m chng ta s tho lun trong phn Cc giao din ) c phi l mt tng tt hn khng? Hon ton c th. M ca bn s l d hiu hn nu n khng to nn mt h thng th bc phc tp vi mt hn hp cc phng thc trin khai thc hin v ghi . Bn c th c mt phng thc c nh ngha xuyn qua ba hoc bn lp, thnh mt dy. Thi im m bn s dng n trong mt lp con ca lp con ca lp con ca lp con (sub-sub-sub-subclass), bn c th phi tm kim lu pht hin phng thc ny s lm g. iu c th lm nn lng vic g ri.

    Th ba, hy s dng mt h thng th bc v/hoc cc lp tru tng khi lm nh th l p. C rt nhiu mu m lnh s dng cc khi nim phng thc tru tng v lp tru tng ca ngn ng Java, v d nh mu phng thc khun mu Gang of Four (xem Ti nguyn).

    Th t, hiu c gi m bn phi tr khi bn s dng mt h thng th bc mt cnh vi v. N thc s c th dn bn nhanh chng ri vo con ng sai lm, bi v c cc lp ri, c t tn nh vy, vi cc phng thc m chng c, lm cho rt d dng cho rng tt c nhng th nn l nh th. C l rng h thng th bc c ngha khi bn to ra n, nhng n c th khng c ngha g hn na. Sc c th chng li cc i thay.

    Ni tm li, hy khn kho khi s dng cc h thng th bc. Kinh nghim s gip bn khn ngoan hn, nhng n s khng lm cho bn lc no cng sng sut. Hy nh cu trc li.

  • Cc giao din

    Mt giao din l g?

    Ngn ng Java bao gm khi nim v mt giao din (interface), n ch n gin l mt tp hp c tn ca cc hnh vi c sn cng khai v/hoc cc phn t d liu khng thay i m trnh trin khai thc hin giao din phi cung cp m lnh. N khng ch r cc chi tit hnh vi. V bn cht (v vi trnh bin dch Java), mt giao din nh ngha mt kiu d liu mi v n l mt trong nhng c tnh mnh ca ngn ng ny.

    Cc lp khc trin khai thc hin giao din, c ngha l chng c th s dng bt k cc hng s trong giao din bng tn v chng phi ch r hnh vi cho cc nh ngha phng thc trong giao din.

    Bt k lp no trong h thng th bc cng c th thc hin mt giao din c th no . iu c ngha l cc lp khng lin quan nhau c th thc hin cng mt giao din.

    nh ngha giao din

    nh ngha mt giao din l n gin:

    public interface interfaceName {

    final constantType

    constantName = constantValue;

    ...

    returnValueType

    methodName( arguments );

    ...

    }

  • Mt khai bo giao din trng rt ging vi mt khai bo lp, tr vic bn s dng t kha interface. Bn c th t tn giao din l bt c th g bn mun, min l tn hp l, nhng theo quy c, cc tn ca giao din nhn ging nh cc tn lp. Bn c th bao gm cc hng s, cc khai bo phng thc, hoc c hai vo trong mt giao din.

    Cc hng s c nh ngha trong mt giao din ging nh cc hng s c nh ngha trong cc lp. Cc t kha public v static c gi nh sn cho cc hng s c nh ngha trong mt giao din, v vy bn khng cn phi g thm chng. (T kha final cng c gi nh sn, nhng hu ht cc lp trnh vin u g vo t kha ny).

    Cc phng thc c nh ngha trong mt giao din (ni chung) trng khc vi cc phng thc c nh ngha trong cc lp, bi v cc phng thc trong mt giao din khng c phn trin khai thc hin. Chng kt thc bng du chm phy sau khi khai bo phng thc v chng khng c phn thn. Bt k trnh thc hin no ca giao din c trch nhim cung cp phn thn ca cc phng thc. Cc t kha public v abstract c gi nh sn cho cc phng thc, v vy bn khng cn phi g thm chng.

    Bn c th nh ngha cc h thng th bc ca cc giao din ging nh bn nh ngha cc h thng th bc cc lp. Bn lm iu ny vi t kha extends nh sau:

    public interface interfaceName extends superinterfaceName, ... {

    interface body...

    }

    Mt lp c th l mt lp con ca ch mt lp bc trn, nhng mt giao din c th m rng nhiu giao din khc ty bn mun. Ch cn lit k chng sau t kha extends, phn cch bng du phy.

    Di y l v d v mt giao din:

    public interface Human {

  • final String GENDER_MALE = "MALE";

    final String GENDER_FEMALE = "FEMALE";

    void move();

    void talk();

    }

    Trin khai thc hin cc giao din

    s dng mt giao din, bn ch cn trin khai thc hin (implement) n, iu ny c ngha l cung cp hnh vi cho cc phng thc c nh ngha trong giao din. Bn lm iu vi t kha implements:

    public class className extends superclassName implements

    interfaceName, ... {

    class body

    }

    Theo quy c, mnh extends (nu c) ng trc, tip theo sau l mnh implements. Bn c th trin khai thc hin nhiu hn mt giao din bng cch lit k cc tn giao din, phn cch bng du phy.

    V d, chng ta c th yu cu lp Person ca chng ta thc hin giao din Human (ni tt "thc hin Human" cng c ngha tng t) nh sau:

  • public abstract class Person implements Human {

    protected int age = 0;

    protected String firstname = "firstname";

    protected String lastname = "lastname";

    protected String gender = Human.GENDER_MALE;

    protected int progress = 0;

    public void move() {

    this.progress++;

    }

    }

    Khi chng ta thc hin giao din, chng ta cung cp hnh vi cho cc phng thc. Chng ta phi thc hin cc phng thc ny vi cc ch k (signatures) khp vi cc ch k trong giao din, c thm t kha b ngha quyn truy cp public. Nhng chng ta ch trin khai thc hin phng thc move() trn Person. Chng ta c cn phi thc hin phng thc talk() khng? Khng, bi v Person l mt lp tru tng v t kha abstract c gi nh sn cho cc phng thc trong mt giao din. iu c ngha l bt k lp tru tng no trin khai thc hin cc giao din c th thc hin nhng g n mun v b qua phn cn li. Nu n khng thc hin mt hoc nhiu phng thc, n chuyn giao trch nhim n cc lp con ca n. Trong lp Person ca chng ta, chng ta chn thc hin move() v khng thc hin talk(), nhng chng ta c th chn khng trin khai thc hin phng thc no c.

    Cc bin c th trong lp ca chng ta khng c nh ngha trong giao din. Nhng trong giao din c nh ngha mt s hng s c ch v chng ta c th tham kho chng bng tn, trong bt k lp no thc hin giao din, ging nh chng ta lm khi chng ta khi to bin gii tnh (gender). Cng rt thng thy cc giao din ch cha cc hng s. Nu nh vy, bn khng cn phi thc hin giao din s dng cc hng s . n gin ch cn nhp khu giao din

  • (nu giao din v cc lp trin khai thc hin trong cng mt gi, bn thm ch khng cn phi lm iu ) v tham kho cc hng s nh sau:

    interfaceName.constantName

    S dng cc giao din

    Mt giao din nh ngha mt kiu d liu tham chiu mi. iu c ngha l bn c th tham chiu n mt giao din bt c ni no bn c th tham chiu mt lp, chng hn nh khi bn p kiu, nh c minh ha bng cc on m sau y ca phng thc main() m bn c th thm vo lp Adult:

    public static void main(String[] args) {

    ...

    Adult anAdult = new Adult();

    anAdult.talk();

    Human aHuman = (Human) anAdult;

    aHuman.talk();

    }

    C hai cuc gi ti talk() s hin th Spoke. trn mn hnh. Ti sao vy? Bi v mt Adult l mt Human mt khi n thc hin giao din . Bn c th p kiu mt Adult nh l mt Human, sau gi ra phng thc c nh ngha bi giao

  • din, cng ging nh bn c th p kiu anAdult thnh Person v gi cc phng thc Person trn anAdult.

    Lp Baby cng thc hin Human. Mt Adult khng phi l mt Baby v mt Baby khng phi l mt Adult, nhng c hai c th c m t nh c kiu Human (hoc l kiu Person trong h thng th bc ca chng ta). Hy xem xt m ny mt ni no trong h thng ca chng ta:

    public static void main(String[] args) {

    ...

    Human aHuman = getHuman();

    aHuman.move();

    }

    Human c l mt Adult hoc mt Baby khng?. Chng ta khng cn phi quan tm. Cho n khi m mi th ta nhn c t li gi getPerson() l c kiu Human, th trn chng ta c th gi move() v ch i n p ng thch hp. Chng ta thm ch khng cn phi quan tm cc lp ang trin khai thc hin giao din c trong cng h thng th bc hay khng.

    Ti sao cn dng cc giao din?

    C ba l do chnh s dng cc giao din:

    to cc vng tn gi t v thun tin.

    lin kt cc lp trong cc h thng th bc khc nhau.

    che giu cc chi tit kiu bn di khi m ca bn.

    Khi bn to mt giao din thu thp cc hng s lin quan, giao din ny cho bn mt tn gi t s dng khi tham chiu cc hng s ny. V d, bn c th c

  • mt giao din c tn l Language lu tr cc tn ca cc ngn ng, l mt chui k t khng i. Sau , bn c th tham chiu cc tn ngn ng nh l Language.ENGLISH v tng t. iu ny c th lm cho m ca bn d c hn.

    Ngn ng Java ch h tr tha k n (single inheritance). Ni cch khc, mt lp ch c th l lp con trc tip ca mt lp bc trn. i khi iu ny tr thnh kh hn ch. Vi cc giao din, bn c th lin kt cc lp trong cc h thng th bc khc nhau. l mt c tnh mnh ca ngn ng ny. V bn cht, mt giao din n gin ch nh ngha r mt tp hp cc hnh vi m tt c cc trnh trin khai thc hin giao din phi h tr. C th rng mi quan h duy nht s tn ti gia cc lp ang trin khai thc hin giao din l chng cng chia s cc hnh vi m giao din nh ngha. V d, gi s chng ta c mt giao din c gi l Mover:

    public interface Mover {

    void move();

    }

    By gi gi s rng Person m rng giao din . iu c ngha l bt k lp no ang trin khai thc hin Person cng l mt Mover. Adult v Baby s iu kin. Nhng Cat hoc Vehicle cng c th s nh th. V s l hp l khi cho rng Mountain s khng nh vy. Bt k lp no trin khai thc hin Mover s c hnh vi move(). Mt c th Mountain s khng th c hnh vi .

    Cui cng, nhng khng km quan trng, vic s dng giao din cho php bn b qua nhng chi tit ca kiu c th khi bn mun. Nh li v d ca chng ta khi gi getPerson(). Chng ta khng quan tm n ci m chng ta nhn c c kiu l g; chng ta ch mun n l mt th g m chng ta c th gi move() t .

    Tt c nhng iu ny l cc l do thch ng s dng cc giao din. S dng mt giao din ch n gin l v bn c th s dng chng khng phi l l do thch ng.

  • Cc lp lng trong

    Mt lp lng trong l g?

    Nh tn ca n gi , trong ngn ng Java mt lp lng trong l mt lp c khai bo trong mt lp khc. y l mt v d n gin:

    public class EnclosingClass {

    ...

    public class NestedClass {

    ...

    }

    }

    Thng thng, cc lp trnh vin gii nh ngha cc lp lng trong khi lp lng trong ch c ngha bn trong bi cnh ca lp bao bc bn ngoi. Mt s v d ph bin nh sau:

    Cc trnh x l s kin trong mt lp UI.

    Cc lp Helper cho cc thnh phn UI trong mt thnh phn UI khc.

    Cc lp Adapter bin i b phn bn trong ca mt lp thnh mt s dng khc cho ngi dng lp ny.

    Bn c th nh ngha mt lp lng trong l lp cng khai (public), ring t (private) hay c bo v (protected). Bn cng c th nh ngha mt lp lng trong l lp final ( ngn cho n khng b thay i), lp tru tng (abstract) (c ngha l n khng th khi to thnh c th c th) hoc lp tnh (static).

    Khi bn to ra mt lp static bn trong mt lp khc, bn ang to ra ci c gi mt cch ph hp nht l lp lng trong. Mt lp lng trong c nh ngha bn trong mt lp khc, nhng c th tn ti bn ngoi mt c th ca lp bao ngoi. Nu lp lng trong ca bn khng phi l lp static, n ch c th tn ti bn trong

  • mt c th ca lp bao ngoi v c gi mt cch ph hp hn l lp bn trong (inner class). Ni khc i, mi lp bn trong l lp lng trong nhng khng phi mi lp lng trong l lp bn trong. Phn ln cc lp lng trong m bn s gp phi trong s nghip ca bn s l lp bn trong hn l cc lp ch n gin lng trong.

    Bt k lp lng trong no u c quyn truy cp vo tt c cc thnh vin ca lp bao ngoi, ngay c khi chng c khai bo l private.

    nh ngha cc lp lng trong

    Bn nh ngha mt lp lng trong ng nh bn nh ngha mt lp thng thng khc, nhng bn thc hin n trong mt lp bao ngoi. Mt v d nh by sn l hy nh ngha mt lp Wallet bn trong lp Adult. Cho d trong thc t bn c th c mt Ci v (Wallet) tch khi mt Adult, nhng iu ny s khng c ch lm v iu c ngha hn l mi Adult u c mt Wallet (hoc t nht l mt th g gi tin, nhng nu dng MoneyContainer nghe hi l). Cng l c ngha khi cho rng Wallet s khng tn ti trong Person, bi v mt Baby khng c v v tt c cc lp con ca Person s tha k n nu n tn ti trong Person.

    Lp Wallet ca chng ta s kh n gin, v n ch phc v minh ha nh ngha v mt lp lng trong:

    protected class Wallet {

    protected ArrayList bills = new ArrayList();

    protected void addBill(int aBill) {

    bills.add(new Integer(aBill));

    }

  • protected int getMoneyTotal() {

    int total = 0;

    for (Iterator i = bills.iterator(); i.hasNext(); ) {

    Integer wrappedBill = (Integer) i.next();

    int bill = wrappedBill.intValue();

    total += bill;

    }

    return total;

    }

    }

    Chng ta s nh ngha lp ny bn trong Adult, ging nh sau:

    public class Adult extends Person {

    protected Wallet wallet = new Wallet();

    public Adult() {

    }

    public void talk() {

    System.out.println("Spoke.");

    }

    public void acceptMoney(int aBill) {

    this.wallet.addBill(aBill);

  • }

    public int moneyTotal() {

    return this.wallet.getMoneyTotal();

    }

    protected class Wallet {

    ...

    }

    }

    Lu rng chng ta thm acceptMoney() cho php mt Adult nhn thm tin. (Xin c t nhin m rng v d bt buc Adult ca bn phi chi tiu mt vi th, l vic ph bin trong cuc sng thc).

    Sau khi chng ta c lp lng trong v phng thc acceptMoney() mi, chng ta c th s dng chng nh sau:

    Adult anAdult = new Adult();

    anAdult.acceptMoney(5);

    System.out.println("I have this much money: " + anAdult.moneyTotal());

    Thc hin m ny s cho kt qu rng anAdult c mt tng s tin l 5.

    X l s kin rt n gin

  • Ngn ng Java nh ngha mt cch tip cn x l s kin vi cc lp kt hp cho php bn to v x l cc s kin ca ring bn. Nhng vic x l s kin c th n gin hn nhiu. Tt c nhng g m bn thc s cn l mt l gic no sinh ra mt "s kin" (m thc s khng cn phi hon ton l mt lp s kin) v mt l gic no lng nghe s kin v sau tr li mt cch thch hp. V d, gi s rng bt c khi no mt Person di chuyn, h thng ca chng ta to ra (hoc kch hot) mt MoveEvent, m chng ta c th chn x l hay khng x l. iu ny s yu cu mt s thay i cho h thng ca chng ta. Chng ta phi:

    To ra mt lp "ng dng" (application) khi chy h thng ca chng ta v minh ha vic s dng lp bn trong v danh.

    To mt MotionListener m ng dng ca chng ta c th thc hin v sau x l cc s kin trong trnh lng nghe (listener).

    Thm mt List ca cc trnh lng nghe vo Adult.

    Thm mt phng thc addMotionListener() vo Adult ng k trnh lng nghe.

    Thm mt phng thc fireMoveEvent() vo Adult n c th bo cho trnh lng nghe khi no th x l s kin.

    Thm m vo ng dng ca chng ta to ra mt Adult v t ng k nh l mt trnh x l

    Tt c iu ny d hiu. y l lp Adult ca chng ta vi cc th mi thm:

    public class Adult extends Person {

    protected Wallet wallet = new Wallet();

    protected ArrayList listeners = new ArrayList();

    public Adult() {

    }

    public void move() {

    super.move(); fireMoveEvent();

  • }

    ...

    public void addMotionListener(MotionListener aListener) {

    listeners.add(aListener);

    }

    protected void fireMoveEvent() {

    Iterator iterator = listeners.iterator();

    while(iterator.hasNext()) {

    MotionListener listener = (MotionListener) iterator.next();

    listener.handleMove(this);

    }

    }

    protected class Wallet {

    ...

    }

    }

    Lu rng by gi chng ta ghi move(), u tin gi move() trn Person, sau gi fireMoveEvent() bo cho trnh lng nghe tr li. Chng ta cng thm phng thc addMotionListener() thm mt MotionListener vo mt danh sch trnh lng nghe ang hot ng. y l nhng g ging vi mt MotionListener:

    public interface MotionListener {

  • public void handleMove(Adult eventSource);

    }

    Tt c nhng g cn li l to ra lp ng dng ca chng ta:

    public class CommunityApplication implements MotionListener {

    public void handleMove(Adult eventSource) {

    System.out.println("This Adult moved: \n" + eventSource.toString());

    }

    public static void main(String[] args) {

    CommunityApplication application = new CommunityApplication();

    Adult anAdult = new Adult();

    anAdult.addMotionListener(application);

    anAdult.move();

    }

    }

    Lp ny thc hin giao din MotionListener c ngha l n trin khai thc hin phng thc handleMove(). Tt c nhng iu m chng ta lm y l in mt thng bo minh ha nhng g xy ra khi mt s kin c kch hot.

  • Cc lp bn trong v danh

    Cc lp bn trong v danh cho php bn nh ngha mt lp ngay ti ch, m khng t tn n, cung cp mt s hnh vi trong bi cnh c th. l mt cch tip cn ph bin cho cc trnh x l s kin trong cc giao din ngi dng, bn v chng l mt ch vt ra ngoi phm vi ca hng dn ny. Nhng chng ta c th s dng mt lp bn trong v danh ngay c trong v d x l s kin rt n gin ca chng ta.

    Bn c th chuyn i v d t cc trang trc s dng mt lp bn trong v danh bng cch thay i li gi n addMotionListener() trong CommunityApplication.main() nh sau:

    anAdult.addMotionListener(new MotionListener() {

    public void handleMove(Adult eventSource) {

    System.out.println("This Adult moved: \n" + eventSource.toString());

    }

    });

    Thay v c CommunityApplication trin khai thc hin MotionListener, chng ta khai bo mt lp bn trong khng t tn (v nh vy l v danh) c kiu MotionListener v cung cp cho n mt trin khai thc hin handleMove(). S vic MotionListener l mt giao din, khng phi l mt lp, l khng quan trng. C hai u c th chp nhn c.

    M ny sinh ra chnh xc cng mt kt qu ging nh cc phin bn trc , nhng n s dng mt cch tip cn ph bin v ng mong mun hn. Bn s hu nh lun lun thy cc trnh x l s kin c trin khai thc hin vi cc lp bn trong v danh.

    S dng cc lp lng trong

  • Cc lp c lng trong c th rt c ch cho bn. Chng cng c th gy ra phin toi.

    S dng mt lp lng trong s khng ngha lm khi c th nh ngha lp bn ngoi ca mt lp bao ngoi. Trong v d ca chng ta, chng ta c th nh ngha Wallet bn ngoi Adult m khng cm thy qu t. Nhng hy tng tng mt th g kiu nh mt lp Personality. Bn c bao gi c mt Personality bn ngoi mt c th Person khng?. Khng, do hon ton cn thit phi nh ngha Personality nh l mt lp lng trong. Mt quy tc ngn tay ci ng n l bn nn nh ngha mt lp di dng lp khng lng trong cho n khi r rng l n phi c lng trong, sau cu trc li lng n.

    Cc lp bn trong v danh l cch tip cn tiu chun cho cc trnh x l s kin, v vy, hy s dng chng cho mc ch . Trong cc trng hp khc, cn thn trng vi chng. Tr khi cc lp bn trong v danh l nh, xoay quanh mt vic, v quen thuc, chng lm cho m kh hiu. Chng cng c th lm cho vic g li kh khn hn, mc d IDE ca Eclipse gip gim thiu s phin toi . Ni chung, hy th khng s dng cc lp bn trong v danh cho bt c th g tr cc trnh x l s kin.

  • Cc biu thc chnh quy

    Mt biu thc chnh quy l g?

    Mt biu thc chnh quy (regular expression) v bn cht l mt mu m t mt tp hp cc chui k t chia s chung mu ny. V d, y l mt tp hp cc chui k t c mt s iu chung:

    mt chui (a string).

    mt chui di hn (a longer string).

    mt chui rt di (a much longer string).

    Mi chui k t ny u bt u bng "a" v kt thc bng "string." API ca cc biu thc chnh quy ca Java (Java Regular Expression) gip bn th hin iu v lm nhiu vic l th vi cc kt qu.

    API ca biu thc chnh quy (Regular Expression - hoc vit tt l regex) ca Java l kh ging vi cc cng c biu thc chnh quy c sn trong ngn ng Perl. Nu bn l mt lp trnh vin ca Perl, bn s cm thy ng nh ang nh, t nht l vi c php mu biu thc chnh quy ca ngn ng Java. Tuy nhin, nu bn khng thng s dng biu thc chnh quy , chc l n c v trng hi l mt cht. ng lo lng: khng phi phc tp nh n c v th u.

    API ca biu thc chnh quy

    Nng lc v biu thc chnh quy ca ngn ng Java gm c ba lp ct li m bn s s dng hu nh mi lc:

    Pattern, trong m t mt mu chui k t.

    Matcher, kim tra mt chui k t xem n c khp vi mu khng.

    PatternSyntaxException, bo cho bn rng mt s th khng th chp nhn c vi mu m bn th nh ngha.

    Cch tt nht tm hiu v biu thc chnh quy l qua cc v d, do trong phn ny chng ta s to ra mt v d n gin trong CommunityApplication.main(). Tuy nhin, trc khi chng ta tin hnh, iu quan trng l hiu c mt s c php mu biu thc chnh quy . Chng ta s tho lun iu chi tit hn trong phn k tip.

  • C php mu

    Mt mu (pattern) biu thc chnh quy m t cu trc ca chui k t m mt biu thc s c gng tm kim trong mt chui k t u vo. y chnh l ti sao biu thc chnh quy nhn c v hi l thng. Tuy nhin, mt khi bn hiu c c php, gii m s t kh khn hn.

    Di y l mt s trong cc cu kin mu ph bin nht m bn c th s dng trong cc chui k t mu:

    Cu kin Ci c coi l n khp

    . Bt k k t no.

    ? Khng (0) hoc mt (1) ca k t ng trc.

    * Khng (0) hoc ln hn ca k t ng trc.

    + Mt (1) hoc ln hn ca k t ng trc.

    [] Mt di cc k t hay ch s.

    ^ Khng phi ci tip sau (tc l, "khng phi ").

    \d Bt k s no (ty chn, [0-9]).

    \D Bt k ci g khng l s (ty chn, [^0-9]).

  • \s Bt k khong trng no (ty chn, [ \n\t\f\r]).

    \S Khng c bt k khong trng no (ty chn, [^ \n\t\f\r]).

    \w Bt k t no (ty chn, [a-zA-Z_0-9]).

    \W Khng c bt k t no (ty chn, [^\w]).

    Mt s cu kin u tin y c gi l cc lng t ((quantifiers), bi v chng xc nh s lng ci ng trc chng. Cc cu kin nh l \d l cc lp k t c nh ngha trc. Bt k k t no m khng c ngha c bit trong mt mu s l mt trc kin v ch khp vi chnh n.

    So khp

    Sau khi trang b nhng hiu bit mi ca chng ta v cc mu, y l mt v d n gin v m s dng cc lp trong API ca biu thc chnh quy Java:

    Pattern pattern = Pattern.compile("a.*string");

    Matcher matcher = pattern.matcher("a string");

    boolean didMatch = matcher.matches();

    System.out.println(didMatch);

    int patternStartIndex = matcher.start();

  • System.out.println(patternStartIndex);

    int patternEndIndex = matcher.end();

    System.out.println(patternEndIndex);

    Trc tin, chng ta to ra mt Pattern. Chng ta lm iu bng cch gi compile(), mt phng thc tnh trn Pattern, vi mt ch chui k t biu din mu m chng ta mun so khp. Ch s dng c php mu biu thc chnh quy m by gi chng ta c th hiu c. Trong v d ny, khi dch thnh ngn ng thng thng, mu biu thc chnh quy c ngha l: "Tm mt chui k t c dng bt u l 'a', theo sau l khng hay nhiu k khc, kt thc bng 'string'".

    Tip theo, chng ta gi matcher() trn Pattern ca chng ta. Li gi ny to ra mt c th Matcher. Khi iu xy ra, Matcher tm kim chui k t m chng ta chuyn cho n so khp vi chui mu m chng ta dng to ra Pattern Nh bn bit, mi chui k t trong ngn ng Java l mt su tp cc k t c nh ch s, bt u t 0 v kt thc bng di chui tr mt. Matcher phn tch c php ca chui k t, bt u t 0 v tm cc kt qu khp vi mu.

    Sau khi hon tt qu trnh , Matcher cha rt nhiu thng tin v cc kt qu khp c tm thy (hoc khng tm thy) trong chui u vo ca chng ta. Chng ta c th truy cp thng tin bng cch gi cc phng thc khc nhau trn Matcher ca chng ta::

    matches() n gin cho chng ta bit rng ton b chui u vo c khp ng vi mu hay khng.

    start() cho chng ta bit gi tr ch s trong chui bt u khp ng vi mu.

    end() cho chng ta bit gi tr ch s kt thc khp ng vi mu, cng vi mt.

    Trong v d n gin ca chng ta, c mt kt qu khp bt u t 0 v kt thc ti 7. V vy, li gi matches() tr v kt qu ng (true), li gi start() tr v 0 v li gi end() tr v 8. Nu trong chui k t ca chng ta c nhiu k t hn trong

  • mu m chng ta tm kim, chng ta c th s dng lookingAt() thay cho matches(). lookingAt() tm kim chui con khp vi mu ca chng ta. V d, hy xem xt chui k t sau y:

    Here is a string with more than just the pattern.

    Chng ta c th tm kim mu a.*string v c c kt qu khp nu chng ta s dng lookingAt(). Nu chng ta s dng matches() thay th, n s tr v kt qu l sai (false), bi v c nhiu th trong chui u vo hn l ng nhng g c trong mu.

    Cc mu phc tp

    Nhng vic tm kim n gin l d dng vi cc lp biu thc chnh quy, nhng cng c th tm kim tinh vi hn nhiu.

    Bn c th quen thuc vi wiki, mt h thng da trn web cho php ngi dng chnh sa cc trang web lm n "ln ln". Cc Wiki, cho d c vit bng ngn ng Java hay khng, hu nh hon ton c da trn cc biu thc chnh quy. Ni dung ca chng c da trn chui k t m ngi s dng nhp vo, c cc biu thc chnh quy phn tch c php v nh dng. Mt trong nhng c tnh ni bt nht ca cc wiki l ch bt k ngi dng no cng c th to ra mt lin kt n mt ch khc trong wiki bng cch nhp vo mt t wiki , m thng l mt lot cc t c mc ni vi nhau, mi mt t trong bt u bng mt ch ci vit hoa, nh sau:

    MyWikiWord

    Gi s c chui k t sau:

  • Here is a WikiWord followed by AnotherWikiWord, then YetAnotherWikiWord.

    Bn c th tm kim cc t wiki trong chui ny vi mu biu thc chnh quy nh sau:

    [A-Z][a-z]*([A-Z][a-z]*)+

    Di y l mt s m tm kim cc t wiki:

    String input = "Here is a WikiWord followed by AnotherWikiWord, then SomeWikiWord.";

    Pattern pattern = Pattern.compile("[A-Z][a-z]*([A-Z][a-z]*)+");

    Matcher matcher = pattern.matcher(input);

    while (matcher.find()) {

    System.out.println("Found this wiki word: " + matcher.group());

    }

    Bn s thy ba t wiki trong mn hnh ca bn.

    Vic thay th

  • Tm kim cc kt qu khp ng l rt c ch, nhng chng ta cng c th thao tc chui k t sau khi tm thy mt kt qu khp. Chng ta c th thc hin iu bng cch thay th cc kt qu khp bng mt th g khc, cng ging nh bn c th tm kim mt on vn bn trong mt chng trnh x l van bn v thay th n bng mt ci g khc. C mt s phng thc trn Matcher gip cho chng ta:

    replaceAll(), thay th tt c cc kt qu khp bng mt chui k t m chng ta ch nh.

    replaceFirst(), ch thay th kt qu khp u tin bng mt chui k t m chng ta ch nh.

    S dng cc phng thc ny rt d hiu:

    String input = "Here is a WikiWord followed by AnotherWikiWord, then SomeWikiWord.";

    Pattern pattern = Pattern.compile("[A-Z][a-z]*([A-Z][a-z]*)+");

    Matcher matcher = pattern.matcher(input);

    System.out.println("Before: " + input);

    String result = matcher.replaceAll("replacement");

    System.out.println("After: " + result);

    M ny tm cc t wiki, nh trc y. Khi Matcher tm thy mt kt qu khp, n thay mi t wiki bng chui replacement. Khi bn chy m ny, bn s thy phn sau y trn mn hnh:

    Trc: Here is WikiWord followed by AnotherWikiWord, then SomeWikiWord.

    Sau: Here is replacement followed by replacement, then replacement.

  • Nu chng ta s dng replaceFirst(), chng ta s thy nh sau:

    Trc: Here is a WikiWord followed by AnotherWikiWord, then SomeWikiWord.

    Sau: Here is a replacement followed by AnotherWikiWord, then SomeWikiWord.

    Cc nhm

    Chng ta cng c th tng tng hn mt cht. Khi bn tm kim cc kt qu khp vi mt mu biu thc chnh quy, bn c th nhn c thng tin v nhng g bn tm thy. Chng ta thy iu ny vi cc phng thc start() v end() trn Matcher. Nhng chng ta cng c th tham kho cc kt qu khp thng qua cc nhm bt gi (capturing groups). Trong mi mu, bn thng to ra cc nhm bng cch bao quanh mt phn mu bng cp du ngoc n. Cc nhm c nh s t tri sang phi, bt u t 1 (nhm 0 i din cho kt qu khp ton b). Sau y l mt s m thay th mi t wiki bng mt chui k t "bc quanh" t:

    String input = "Here is a WikiWord followed by AnotherWikiWord, then SomeWikiWord.";

    Pattern pattern = Pattern.compile("[A-Z][a-z]*([A-Z][a-z]*)+");

    Matcher matcher = pattern.matcher(input);

    System.out.println("Before: " + input);

    String result = matcher.replaceAll("blah$0blah");

    System.out.println("After: " + result);

  • Vic chy m ny s to ra kt qu sau:

    Trc: Here is a WikiWord followed by AnotherWikiWord, then SomeWikiWord.

    Sau: Here is a blahWikiWordblah followed by blahAnotherWikiWordblah,

    then blahSomeWikiWordblah.

    Trong m ny, chng ta tham chiu kt qu khp ton b bng cch a thm $0 vo trong chui thay th. Bt k phn no ca chui k t thay th c dng $ s tham chiu n nhm c xc nh bi cc s nguyn (do $1 tr n nhm 1 v tip tc). Ni cch khc, $0 tng ng vi iu sau y:

    matcher.group(0);

    Chng ta c th hon thnh mc tiu thay th tng t bng cch s dng mt s cc phng thc khc, hn l gi replaceAll():

    StringBuffer buffer = new StringBuffer();

    while (matcher.find()) {

    matcher.appendReplacement(buffer, "blah$0blah");

    }

    matcher.appendTail(buffer);

    System.out.println("After: " + buffer.toString());

  • Chng ta li nhn c cc kt qu ny mt ln na:

    Trc: Here is a WikiWord followed by AnotherWikiWord, then SomeWikiWord.

    Sau: Here is a blahWikiWordblah followed by blahAnotherWikiWordblah,

    then blahSomeWikiWordblah.

    Mt v d n gin

    H thng th bc Person ca chng ta khng cung cp cho chng ta nhiu c hi x l cc chui k t, nhng chng ta c th to ra mt v d n gin cho php chng ta s dng mt s k nng v biu thc chnh quy m chng ta hc c.

    Hy thm mt phng thc listen():

    public void listen(String conversation) {

    Pattern pattern = Pattern.compile(".*my name is (.*).");

    Matcher matcher = pattern.matcher(conversation);

    if (matcher.lookingAt())

    System.out.println("Hello, " + matcher.group(1) + "!");

    else

    System.out.println("I didn't understand.");

    }

  • Phng thc ny cho php chng ta tin hnh mt s cuc i thoi vi mt Adult. Nu chui k t c dng c bit, Adult ca chng ta c th tr li bng mt li cho tt lnh. Nu khng, n c th ni rng n khng hiu c.

    Phng thc listen() kim tra chui k t u vo xem n c khp vi mt mu nht nh khng: mt hay nhiu k t, theo sau l "tn ti l" (my name is), tip theo l mt hoc nhiu k t, tip theo l mt du chm cu. Chng ta s dng lookingAt() tm kim mt chui con ca u vo khp vi mu. Nu chng ta tm thy mt kt qu khp, chng ta xy dng mt chui k t lm li cho bng cch nm bt ly nhng g i sau " my name is ", m chng ta cho rng s l tn ( l nhng g nhm 1 s cha). Nu chng ta khng tm thy mt kt qu khp no, chng ta tr li rng chng ta khng hiu. D nhin l Adult ca chng ta khng c nhiu kh nng i thoi lm vo lc ny.

    y l mt v d tm thng v cc kh nng x l biu thc chnh quy ca ngn ng Java, nhng n minh ha cch lm th no s dng chng.

    Lm r cc biu thc

    Cc biu thc chnh quy c v b him. Rt d b tht bi vi m trng rt ging nh ting Phn y. t tn cc th cho ng v xy dng cc biu thc cho tt cng c th gip nhiu.

    V d, y l mu ca chng ta cho mt t wiki:

    [A-Z][a-z]*([A-Z][a-z]*)+

    By gi bn hiu c php ca biu thc chnh quy, bn s c th c m khng phi tn cng qu nhiu, nhng m ca chng ta s d hiu hn nhiu nu chng ta khai bo mt hng s lu gi chui mu. Chng ta c th t tn n kiu nh WIKI_WORD. Phng thc listen() ca chng ta s bt u nh th ny:

  • public void listen(String conversation) {

    Pattern pattern = Pattern.compile(WIKI_WORD);

    Matcher matcher = pattern.matcher(conversation);

    ...

    }

    Mt th thut khc c th tr gip l nh ngha cc hng s cho mi phn ca cc mu, sau xy dng cc mu phc tp hn nh vic lp rp cc phn c tn. Ni chung, mu cng phc tp th cng kh khn gii m n v cng d xy ra li hn. Bn s thy rng khng c cch thc s no g li cc biu thc chnh quy khc hn cch th nghim v sa li. Hy lm cho cuc sng n gin hn bng cch t tn cc mu v cc thnh phn mu.

  • Cc su tp

    Gii thiu

    Khung cng tc ca cc su tp Java (Java Collections Framework) l rng ln. Trong hng dn Gii thiu v lp trnh Java, ti ni v lp ArrayList, nhng l ch bn s qua trn b mt. C rt nhiu lp v giao din trong khung cng tc. Ti y, chng ta s trnh by nhiu hn, d khng phi l tt c v chng.

    Cc giao din v cc lp su tp

    Khung cng tc ca cc su tp Java da trn trin khai thc hin c th mt s giao din nh ngha cc kiu su tp (collection):

    Giao din List nh ngha mt su tp cc phn t Object c th dn hng.

    Giao din Set nh ngha mt su tp khng c cc phn t trng lp.

    Giao din Map nh ngha mt su tp cc cp kha - gi tr.

    Chng ta s ni v mt vi trin khai thc hin c th trong hng dn ny. y khng phi l mt danh sch y , nhng nhiu kh nng bn thng xuyn thy nhng th sau y trong cc d n pht trin bng ngn ng Java:

    Giao din (Cc) trin khai thc hin

    List ArrayList, Vector

    Set HashSet, TreeSet

    Map HashMap

    Tt c cc giao din trong khung cng tc, tr Map l cc giao din con ca giao din Collection, trong nh ngha cu trc chung nht ca mt su tp. Mi su tp gm nhiu phn t. Vi vai tr l trnh thc hin cc giao din con ca Collection, tt c kiu su tp chia s chung (theo trc gic) mt s hnh vi:

  • Cc phng thc m t kch thc ca su tp (nh size() v isEmpty()).

    Cc phng thc m t ni dung ca su tp (nh contains() v containsAll()).

    Cc phng thc h tr thao tc v ni dung ca su tp (nh add(), remove() v clear()).

    Cc phng thc cho php bn chuyn i mt su tp thnh mt mng (nh toArray()).

    Mt phng thc cho php bn nhn c mt trnh vng lp (iterator) trn mng cc phn t (iterator()).

    Chng ta s ni v mt s phng thc trn trong phn ny. ng thi chng ta s tho lun trnh vng lp (iterator) l g v cch s dng n nh th no.

    Lu rng cc Map l c bit. Tht s chng hon ton khng l mt su tp. Tuy nhin, chng c hnh vi rt ging cc su tp, v vy chng ta cng ni v chng trong phn ny.

    Cc trin khai thc hin Danh sch (List)

    Cc phin bn c hn ca JDK cha mt lp c gi l Vector. N vn cn c trong cc phin bn mi hn, nhng bn ch nn s dng n khi bn cn c mt su tp ng b ho -- l, mt trong nhng yu t l an ton phn lung. (Ni v phn lung vt ra ngoi phm vi ca bi vit ny, chng ta s tho lun ngn gn v khi nim y trong phn Tm tt). Trong cc trng hp khc, bn nn s dng lp ArrayList. Bn vn c th s dng Vector, nhng n p t mt s chi ph thm m bn thng khng cn.

    Mt ArrayList l ci nh tn ca n gi : danh sch cc phn t theo th t. Chng ta thy lm th no to ra mt danh sch v lm th no thm cc phn t vo n, trong bi hng dn gii thiu trc. Khi chng ta to ra mt lp Wallet lng trong trong hng dn ny, chng ta tch hp vo mt ArrayList gi cc ho n thanh ton ca Adult:

  • protected class Wallet {

    protected ArrayList bills = new ArrayList();

    protected void addBill(int aBill) {

    bills.add(new Integer(aBill));

    }

    protected int getMoneyTotal() {

    int total = 0;

    for (Iterator i = bills.iterator(); i.hasNext(); ) {

    Integer wrappedBill = (Integer) i.next();

    int bill = wrappedBill.intValue();

    total += bill;

    }

    return total;

    }

    }

    Phng thc getMoneyTotal() s dng mt trnh vng lp (iterator) duyt qua danh sch cc ho n thanh ton v tnh tng gi tr ca chng. Mt Iterator tng t nh mt Enumeration trong cc phin bn c hn ca ngn ng Java. Khi bn nhn c mt trnh vng lp trn su tp (bng cch gi iterator()), trnh vng lp cho php bn duyt qua (traverse) ton b su tp bng cch s dng mt s phng thc quan trng, c minh ha trong m lnh trn:

  • hasNext() cho bn bit cn c mt phn t tip theo khc trong su tp khng.

    next() cho bn phn t tip theo .

    Nh chng ta tho lun trn, bn phi p kiu ng khi bn trch ra cc phn t t su tp khi s dng next().

    Tuy nhin, Iterator cn cho chng ta mt s kh nng b sung thm. Chng ta c th loi b cc phn t khi lp ArrayList bng cch gi remove() (hay removeAll(), hay clear()), nhng chng ta cng c th s dng Iterator lm iu . Hy thm mt phng thc rt n gin c gi l spendMoney() ti Adult:

    public void spendMoney(int aBill) {

    this.wallet.removeBill(aBill);

    }

    Phng thc ny gi removeBill() trn Wallet:

    protected void removeBill(int aBill) {

    Iterator iterator = bills.iterator();

    while (iterator.hasNext()) {

    Integer bill = (Integer) iterator.next();

    if (bill.intValue() == aBill)

    iterator.remove();

    }

    }

  • Chng ta nhn c mt Iterator trn cc ho n thanh ton ArrayList, v duyt qua danh sch tm mt kt qu khp vi gi tr ha n c chuyn qua (aBill). Nu chng ta tm thy mt kt qu khp, chng ta gi remove() trn trnh vng lp loi b ha n . Cng n gin, nhng cn cha phi l n gin ht mc. M di y thc hin cng mt cng vic v d c hn nhiu:

    protected void removeBill(int aBill) {

    bills.remove(new Integer(aBill));

    }

    C th bn s khng thng xuyn gi remove() trn mt Iterator nhng s rt tt nu c cng c khi bn cn n.

    Lc ny, chng ta c th loi b ch mt ha n ring l mi ln khi Wallet. S l tt hn nu s dng sc mnh ca mt List gip chng ta loi b nhiu ha n cng mt lc, nh sau:

    public void spendMoney(List bills) {

    this.wallet.removeBills(bills);

    }

    Chng ta cn phi thm removeBills() vo wallet ca chng ta thc hin vic ny. Hy th m di y:

    protected void removeBills(List billsToRemove) {

    this.bills.removeAll(bills);

    }

  • y l vic trin khai thc hin d dng nht m chng ta c th s dng. Chng ta gi removeAll() trn List cc ho n ca chng ta, chuyn qua mt Collection. Sau phng thc ny loi b tt c cc phn t khi danh sch c trong Collection. Hy th chy m di y:

    List someBills = new ArrayList();

    someBills.add(new Integer(1));

    someBills.add(new Integer(2));

    Adult anAdult = new Adult();

    anAdult.acceptMoney(1);

    anAdult.acceptMoney(1);

    anAdult.acceptMoney(2);

    List billsToRemove = new ArrayList();

    billsToRemove.add(new Integer(1));

    billsToRemove.add(new Integer(2));

    anAdult.spendMoney(someBills);

    System.out.println(anAdult.wallet.bills);

    Cc kt qu khng phi l nhng g m chng ta mun. Chng ta kt thc m khng cn ha n no trong v c. Ti sao? Bi v removeAll() loi b tt c cc kt qu khp. Ni cch khc, bt k v tt c cc kt qu khp vi mt mc trong

  • List m chng ta chuyn cho phng thc u b loi b. Cc ho n thanh ton m chng ta chuyn cho phng thc c cha 1 v 2. V ca chng ta c cha hai s 1 v mt s 2. Khi removeAll() tm kim kt qu khp vi phn t s 1, n tm thy hai kt qu khp v loi b chng c hai. khng phi l nhng g m chng ta mun! Chng ta cn thay i m ca chng ta trong removeBills() sa li iu ny:

    protected void removeBills(List billsToRemove) {

    Iterator iterator = billsToRemove.iterator();

    while (iterator.hasNext()) {

    this.bills.remove(iterator.next());

    }

    }

    M ny ch loi b mt kt qu khp ring r, ch khng phi l tt c cc kt qu khp. Nh cn thn vi removeAll().

    Trin khai thc hin tp hp

    C hai trin khai thc hin Tp hp (Set) thng c s dng ph bin:

    HashSet, khng m bo th t vng lp.

    TreeSet, bo m th t vng lp.

    Cc ti liu hng dn ngn ng Java gi rng bn s i n ch s dng trin khai thc hin th nht trong hu ht cc trng hp. Ni chung, nu bn cn phi chc chn rng cc phn t trong Set ca bn xp theo mt th t nht nh no khi bn duyt qua n bng mt trnh vng lp, th hy s dng trin khai thc hin th hai. Nu khng, s dng cch th nht. Th t ca cc phn t trong mt

  • TreeSet (c thc hin giao din SortedSet) c gi l th t t nhin (natural ordering); iu ny c ngha l, hu ht mi trng hp, bn s c kh nng sp xp cc phn t da trn php so snh equals().

    Gi s rng mi Adult c mt tp hp cc bit hiu. Chng ta thc s khng quan tm n chng c sp t th no, nhng cc bn sao s khng c ngha. Chng ta c th s dng mt HashSet lu gi chng. Trc tin, chng ta thm mt bin c th:

    protected Set nicknames = new HashSet();

    Sau chng ta thm mt phng thc thm bit hiu vo Set:

    public void addNickname(String aNickname) {

    nicknames.add(aNickname);

    }

    By gi hy th chy m ny:

    Adult anAdult = new Adult();

    anAdult.addNickname("Bobby");

    anAdult.addNickname("Bob");

    anAdult.addNickname("Bobby");

    System.out.println(anAdult.nicknames);

    Bn s thy ch c mt Bobby n l xut hin trn mn hnh.

  • Cc trin khai thc hin Map

    Map (nh x) l mt tp hp cc cp kha - gi tr. N khng th cha cc kha ging ht nhau. Mi kha phi nh x ti mt gi tr n l, nhng gi tr c th l bt k kiu g. Bn c th ngh v mt nh x nh l List c t tn. Hy tng tng mt List trong mi phn t c mt tn m bn c th s dng trch ra phn t trc tip. Kha c th l bt c ci g kiu Object, ging nh gi tr. Mt ln na, iu c ngha l bn khng th lu tr cc gi tr kiu nguyn thy (primitive) trc tip vo trong mt Map (bn c ght cc gi tr kiu nguyn thy khng y ?). Thay vo , bn phi s dng cc lp bao gi kiu nguyn thy lu gi cc gi tr .

    Mc d y l mt chin lc ti chnh mo him, chng ta s cung cp cho mi Adult mt tp hp cc th tn dng n gin nht c th chp nhn c. Mi th s c mt tn v mt s d (ban u l 0). Trc tin, chng ta thm mt bin c th:

    protected Map creditCards = new HashMap();

    Sau chung ta thm mt phng thc b sung thm mt th tn dng (CreditCard)ti Map:

    public void addCreditCard(String aCardName) {

    creditCards.put(aCardName, new Double(0));

    }

    Giao din ca Map khc vi cc giao din ca cc su tp khc. Bn gi put() vi mt kha v mt gi tr thm mt mc vo nh x. Bn gi get() vi kha

  • trch ra mt gi tr. Chng ta s lm vic ny trong mt phng thc hin th s d ca mt th:

    public double getBalanceFor(String cardName) {

    Double balance = (Double) creditCards.get(cardName);

    return balance.doubleValue();

    }

    Tt c nhng g cn li l thm phng thc charge() cho php cng thm vo s d ca chng ta:

    public void charge(String cardName, double amount) {

    Double balance = (Double) creditCards.get(cardName);

    double primitiveBalance = balance.doubleValue();

    primitiveBalance += amount;

    balance = new Double(primitiveBalance);

    creditCards.put(cardName, balance);

    }

    By gi hy th chy m di y, n s hin th cho bn 19.95 trn mn hnh.

    Adult anAdult = new Adult();

  • anAdult.addCreditCard("Visa");

    anAdult.addCreditCard("MasterCard");

    anAdult.charge("Visa", 19.95);

    adAdult.showBalanceFor("Visa");

    Mt th tn dng in hnh c mt tn, mt s ti khon, mt hn mc tn dng v mt s d. Mi mc trong mt Map ch c th c mt kha v mt gi tr. Cc th tn dng rt n gin ca chng ta rt ph hp, bi v chng ch c mt tn v mt s d hin ti. Chng ta c th lm cho phc tp hn bng cch to ra mt lp c gi l CreditCard, vi cc bin c th dnh cho tt c cc c tnh ca mt th tn dng, sau lu tr cc c th ca lp ny nh cc gi tr cho cc mc trong Map ca chng ta.

    C mt s kha cnh th v khc v giao din Map trnh by trc khi chng ta i tip (y khng phi l mt danh sch y ):

    Phng thc Hnh vi

    containsKey() Tr li Map c cha kha cho hay khng.

    containsValue() Tr li Map c cha gi tr cho hay khng.

    keySet() Tr v mt Set tp hp cc kha.

    values() Tr v mt Set tp hp cc gi tr.

    entrySet() Tr v mt Set tp hp cc cp kha - gi tr, c nh ngha nh

  • l cc c th ca cc Map.Entry.

    remove() Cho php bn loi b gi tr cho mt kha cho.

    isEmpty() Tr li Map c rng khng (rng c ngha l, khng cha kha no).

    Mt s trong cc phng thc ny, chng hn nh isEmpty() ch l cho tin thi, nhng mt s l rt quan trng. V d, cch duy nht thc hin vng lp qua cc phn t trong mt Map l thng qua mt trong cc tp hp c lin quan (tp hp cc kha, cc gi tr, hoc cc cp kha-gi tr).

    Lp Cc su tp (Collections)

    Khi bn ang s dng khung cng tc cc su tp Java, bn cn phi nm c nhng g c sn trong lp Collections. Lp ny gm c mt kho lu tr cc phng thc tnh h tr cc thao tc trn su tp. Chng ti s khng trnh by tt c chng y, bi v bn c th t mnh c API, nhng chng ti s trnh by hai phng thc thng xuyn xut hin trong m Java:

    copy()

    sort()

    Phng thc u tin cho php bn sao chp cc ni dung ca mt su tp ny ti mt su tp khc, nh sau:

    List source = new ArrayList();

    source.add("one");

    source.add("two");

    List target = new ArrayList();

  • target.add("three");

    target.add("four");

    Collections.copy(target, source);

    System.out.println(target);

    M ny sao chp t ngun (source) vo ch (target). ch phi c cng kch thc nh ngun, v th bn khng th sao chp mt List vo mt List rng.

    Phng thc sort() sp xp cc phn t theo th t t nhin ca chng. Tt c cc phn t phi trin khai thc hin giao din Comparable sao cho chng c th so snh vi nhau. Cc lp c sn ging nh String thc hin iu ny. V vy, i vi mt tp hp cc chui k t, chng ta c th sp xp chng theo th t tng dn theo kiu bin son t in bng m sau y:

    List strings = new ArrayList();

    strings.add("one");

    strings.add("two");

    strings.add("three");

    strings.add("four");

    Collections.sort(strings);

    System.out.println(strings);

  • Bn s nhn c [four, one, three, two] trn mn hnh. Nhng bn c th sp xp cc lp m bn to ra nh th no? Chng ta c th lm iu ny cho Adult. Trc tin, chng ta lm cho lp Adult c th so snh ln nhau:

    public class Adult extends Person implements Comparable {

    ...

    }

    Sau , chng ta ghi compareTo() so snh hai c th Adult Chng ta s duy tr vic so snh rt n gin lm v d, do n lm rt t vic:

    public int compareTo(Object other) {

    final int LESS_THAN = -1;

    final int EQUAL = 0;

    final int GREATER_THAN = 1;

    Adult otherAdult = (Adult) other;

    if ( this == otherAdult ) return EQUAL;

    int comparison = this.firstname.compareTo(otherAdult.firstname);

    if (comparison != EQUAL) return comparison;

    comparison = this.lastname.compareTo(otherAdult.lastname);

    if (comparison != EQUAL) return comparison;

  • return EQUAL;

    }

    Bt k s no nh hn 0 c ngha l "b hn", v -1 l gi tr thch hp s dng. Tng t, 1 l thun tin dnh cho "ln hn". Nh bn c th thy, 0 c ngha l "bng nhau". So snh hai i tng theo cch ny r rng l mt qu trnh th cng. Bn cn phi i qua cc bin c th v so snh tng bin. Trong trng hp ny, chng ta so snh tn v h v sp xp thc t theo h. Nhng bn nn bit, ti sao v d ca chng ta li rt n gin. Mi Adult c nhiu hn l ch tn v h. Nu chng ta mun lm mt php so snh su hn, chng ta s phi so snh cc Wallet ca mi Adult xem xem chng c bng nhau khng, ngha l chng ta s phi trin khai thc hin compareTo() trn Wallet v phn cn li. Ngoi ra, tht chnh xc khi so snh, bt c khi no bn ghi compareTo(), bn cn phi chc chn l php so snh l tng thch vi equals(). Chng ta khng trin khai thc hin equals(), v th chng ta khng lo lng v vic tng thch vi n, nhng chng ta c th phi lm. Trong thc t, ti thy m c bao gm mt dng nh sau, trc khi tr v EQUAL:

    assert this.equals(otherAdult) : "compareTo inconsistent with equals.";

    Cch tip cn khc so snh cc i tng l trch thut ton trong compareTo() vo mt i tng c kiu Trnh so snh (Comparator), sau gi Collections.sort() vi su tp cn sp xp v Comparator, nh sau:

    public class AdultComparator implements Comparator {

    public int compare(Object object1, Object object2) {

    final int LESS_THAN = -1;

  • final int EQUAL = 0;

    final int GREATER_THAN = 1;

    if ((object1 == null) ;amp;amp (object2 == null))

    return EQUAL;

    if (object1 == null)

    return LESS_THAN;

    if (object2 == null)

    return GREATER_THAN;

    Adult adult1 = (Adult) object1;

    Adult adult2 = (Adult) object2;

    if (adult1 == adult2)

    return EQUAL;

    int comparison = adult1.firstname.compareTo(adult2.firstname);

    if (comparison != EQUAL)

    return comparison;

    comparison = adult1.lastname.compareTo(adult2.lastname);

    if (comparison != EQUAL)

    return comparison;

  • return EQUAL;

    }

    }

    public class CommunityApplication {

    public static void main(String[] args) {

    Adult adult1 = new Adult();

    adult1.setFirstname("Bob");

    adult1.setLastname("Smith");

    Adult adult2 = new Adult();

    adult2.setFirstname("Al");

    adult2.setLastname("Jones");

    List adults = new ArrayList();

    adults.add(adult1);

    adults.add(adult2);

    Collections.sort(adults, new AdultComparator());

    System.out.println(adults);

  • }

    }

    Bn s thy "Al Jones" v "Bob Smith", theo th t , trong ca s mn hnh ca bn.

    C mt s l do thch ng s dng cch tip cn th hai. Cc l do k thut vt ra ngoi phm vi ca hng dn ny. Tuy nhin, t vin cnh ca pht trin hng i tng, y c th l mt tng tt khi tch bit phn m so snh vo trong i tng khc, hn l cung cp cho mi Adult kh nng t so snh vi nhau. Tuy nhin, v y thc s l nhng g m equals() thc hin, mc d kt qu l ton t boolean, c cc lp lun thch hp ng h cho c hai cch tip cn.

    S dng cc su tp

    Khi no bn nn s dng mt kiu su tp c th ? l mt phn xt cn n nng lc ca bn, v chnh v th m bn hy vng s c tr lng hu h khi l mt lp trnh vin.

    Bt chp nhng g m nhiu chuyn gia tin tng, c rt t cc quy tc chc chn v nhanh chng xc nh cn s dng nhng lp no trong mt tnh hung cho no . Theo kinh nghim c nhn ca ti, trong phn ln cc ln khi s dng cc su tp, mt ArrayList hoc mt HashMap (hy nh, mt Map khng tht s l mt su tp) u b chi khm. Rt c kh nng, bn cng tng c tri nghim nh vy. Di y l mt s quy tc ngn tay ci, mt s l hin nhin hn nhng ci cn li:

    Khi bn ngh rng mnh cn c mt su tp, hy bt u vi mt List, sau c cho cc m s bo cho bn bit c cn mt kiu khc khng.

    Nu bn ch cn nhm cc th g , hy s dng mt Set.

    Nu th t trong vng lp l rt quan trng khi duyt qua mt su tp, hy s dng Tree... mt hng v khc ca su tp, khi c sn.

  • Trnh s dng Vector, tr khi bn cn kh nng ng b ha ca n.

    Khng nn lo lng v vic ti u ha cho n khi (v tr khi) hiu nng tr thnh mt vn .

    Cc b su tp l mt trong nhng kha cnh mnh m nht ca ngn ng Java. ng ngi khi s dng chng, nhng cn cnh gic v cc v "Tm ra ri" (gotchas). V d, c mt cch thun tin chuyn i t mt Array thnh mt ArrayList:

    Adult adult1 = new Adult();

    Adult adult2 = new Adult();

    Adult adult3 = new Adult();

    List immutableList = Arrays.asList(new Object[] { adult1, adult2, adult3 });

    immutableList.add(new Adult());

    M ny a ra mt UnsupportedOperationException, v List c Arrays.asList() tr v l khng thay i c. Bn khng th thm mt phn t mi vo mt List khng thay i. Hy .

  • Cc ngy thng

    Gii thiu

    Ngn ng Java s mang li cho bn kh nhiu cng c x l cc ngy thng. Mt s trong cc cng c ny gy ra s bc bi hn l cc cng c c sn trong cc ngn ng khc. D sao chng na, vi cc cng c m ngn ng Java cung cp, hu nh khng c iu g m bn khng th lm to ra cc ngy thng v nh dng chng chnh xc theo cch m bn mun.

    To cc ngy thng

    Khi ngn ng Java cn tr, n c mt lp gi l Date kh hu ch cho vic to v thao tc cc ngy thng. Tht khng may, lp khng h tr tt cho yu cu quc t ha (internationalization), do Sun thm hai lp nhm ci thin tnh hnh:

    Lch (Calendar).

    nh dng ngy thng (Dateformat).

    u tin chng ta s ni v Calendar v DateFormat li v sau.

    Vic to ra mt Date vn cn tng i n gin:

    Date aDate = new Date(System.currentTimeMillis());

    Hoc chng ta c th s dng m ny:

    Date aDate = new Date();

    iu ny s cho chng ta mt c th Date biu din chnh xc ngy thng v gi pht lc y, theo nh dng thi gian a phng hin dng. nh dng quc t ha vt ra ngoi phm vi ca hng dn ny, nhng by gi, ch cn bit rng Date m bn nhn c tng thch vi v tr a l ca my tnh ti ch ca bn.

  • By gi khi chng ta c mt c th Date, chng ta c th lm g vi n? Rt t, nu trc tip. Chng ta c th so snh mt Date vi Date khc xem ci u l xy ra trc-before() hay xy ra sau-after() ci th hai. Chng ta cng c th thit lp li n thnh mt thi khc mi bng cch gi setTime() vi mt s nguyn di (long) biu din s mili giy tnh t na m ngy1 thng Ging nm 1970 ( l nhng g c System.currentTimeMillis() tr v). Ngoi ra, chng ta b tay.

    Cc lch (Calendars)

    Lp Date by gi gy ln xn hn l ch li, do hu ht hnh vi x l ngy thng ca n li thi. Bn quen vic c th ly ra v thit lp (get and set) tng phn ca Date (nh l nm, thng, vv). By gi chng ta phi s dng c hai Date v Calendar lm c vic y. Khi chng ta c mt c th Date, chng ta c th s dng Calendar ly ra v thit lp tng phn ca n. V d:

    Date aDate = new Date(System.currentTimeMillis());

    Calendar calendar = GregorianCalendar.getInstance();

    calendar.setTime(aDate);

    y chng ta to ra mt GregorianCalendar v thit lp thi gian ca n bng vi Date m chng ta to ra trc. Chng ta c th hon thnh cng mt mc tiu bng cch gi mt phng thc khc trn Calendar ca chng ta:

    Calendar calendar = GregorianCalendar.getInstance();

    calendar.setTimeInMillis(System.currentTimeMillis());

    c trang b mt Calendar, by gi chng ta c th truy cp v thao tc cc thnh phn Date. ca chng ta. Vic ly ra v thit lp cc phn ca Date l mt qu

  • trnh n gin. Ch cn gi cc getters v setters thch hp trn Calendar, ca chng ta, nh sau:

    calendar.set(Calendar.MONTH, Calendar.JULY);

    calendar.set(Calendar.DAY_OF_MONTH, 15);

    calendar.set(Calendar.YEAR, 1978);

    calendar.set(Calendar.HOUR, 2);

    calendar.set(Calendar.MINUTE, 15);

    calendar.set(Calendar.SECOND, 37);

    System.out.println(calendar.getTime());

    on m ny s in ra chui kt qu nh dng cho ngy 15 thng By nm 1978 lc 02:15:37 sng (July 15, 1978 at 02:15:37 a.m) (cng c cc phng thc trnh tr gip trn Calendar cho php chng ta thit lp mt s hoc gn nh tt c cc thnh phn cng mt lc). y, chng ta gi set(), n nhn hai tham s:

    Trng (field) (hoc thnh phn) ca Date m chng ta mun thit lp.

    Cc gi tr cho trng .

    Chng ta c th tham chiu cc trng bng cc hng s c tn trong chnh lp Calendar Trong mt s trng hp, c nhiu hn mt tn cho cng mt trng, nh vi Calendar.DAY_OF_MONTH, m n cng c th dng Calendar.DATE. Cc gi tr l d hiu, c l ch tr cc gi tr ca Calendar.MONTH v mt gi tr ca Calendar.HOUR. Trong ngn ng Java, cc thng c m bt u t s khng (tc l, thng Ging l 0), v th s l khn ngoan nu s dng cc hng s c tn t thay cho cc s, v ng thi cng lm cho thng hin th cc ngy thng mt cch chnh xc hn. Cc gi chy t 0 n 24.

    Sau khi chng ta thit lp Date, chng ta c th trch ra cc phn ca n:

  • System.out.println("The YEAR is: " + calendar.get(Calendar.YEAR));

    System.out.println("The MONTH is: " + calendar.get(Calendar.MONTH));

    System.out.println("The DAY is: " + calendar.get(Calendar.DATE));

    System.out.println("The HOUR is: " + calendar.get(Calendar.HOUR));

    System.out.println("The MINUTE is: " + calendar.get(Calendar.MINUTE));

    System.out.println("The SECOND is: " + calendar.get(Calendar.SECOND));

    System.out.println("The AM_PM indicator is: " + calendar.get(Calendar.AM_PM));

    nh dng ngy thng c sn

    Bn quen c th nh dng cc ngy thng vi Date. By gi bn phi s dng mt vi lp khc:

    DateFormat

    SimpleDateFormat

    DateFormatSymbols

    Chng ta s khng trnh by tt nhng iu phc tp ca vic nh dng ngy thng y. Bn c th t khm ph cc lp ny. Nhng chng ta s ni v nhng iu cn bn khi s dng cc cng c ny.

    Lp DateFormat cho php chng ta to ra mt trnh nh dng c th theo a phng, nh sau:

    DateFormat dateFormatter =

  • DateFormat.getDateInstance(DateFormat.DEFAULT);

    Date aDate = new Date();

    String formattedDate = dateFormatter.format(today);

    M ny to ra mt chui ngy thng nh dng vi khun dng mc nh cho a phng ny. Trong my tnh ca ti, n trng ging nh sau:

    Nov 11, 2005

    y l kiu dng mc nh, nhng n khng phi l tt c nhng g sn c. Chng ta c th s dng bt k ci no trong s cc kiu dng nh ngha trc. Chng ta cng c th gi DateFormat.getTimeInstance() t nh dng phn gi pht hoc DateFormat.getDateTimeInstance() nh dng c phn ngy thng v phn gi pht. y l kt qu vi cc kiu dng khc nhau, tt c u l cc a phng trong nc M:

    Kiu dng Ngy thng Thi gian Ngy thng /Thi gian

    DEFAULT Nov 11, 2005 7:44:56 PM Nov 11, 2005 7:44:56 PM

    SHORT 11/11/05 7:44 PM 11/11/05 7:44 PM

    MEDIUM Nov 11, 2005 7:44:56 PM Nov 11, 2005 7:44:56 PM

    LONG November 11, 2005 7:44:56 PM EST November 11, 2005 7:44:56 PM EST

  • FULL Thursday, November 11, 2005 7:44:56 PM EST

    Thursday, November 11, 2005 7:44:56 PM EST

    nh dng c ty chnh

    Cc khun dng nh ngha trc l tt p trong hu ht cc trng hp, nhng bn cng c th s dng SimpleDateFormat nh ngha cc nh dng ca ring bn. Vic s dng SimpleDateFormat rt d hiu:

    Khi to mt c th SimpleDateFormat vi mt chui kt nh dng mu (v mt tn a phng, nu bn mun).

    Gi format() trn c th ny vi mt Date c th.

    Kt qu l mt chui ngy thng c nh dng. Di y l mt v d:

    Date aDate = new Date();

    SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");

    String formattedDate = formatter.format(today);

    System.out.println(formattedDate);

    Khi bn chy m ny, bn s nhn c cc kt qu ging nh sau (tt nhin n s phn nh ngy thng hin ti khi bn chy cc m):

    11/05/2005

  • Chui c ngoc kp trong v d trn tun theo ng cc quy tc c php mu cho cc mu nh dng ngy thng. Java.sun.com c mt s tm tt tuyt vi v cc quy tc (xem Ti nguyn). Di y l mt s quy tc nh c ch:

    Bn c th ch r cc mu cho cc ngy thng v thi gian.

    Mt s c php mu khng phi l trc gic (v d, mm nh ngha mu pht c hai s; cn c c vit tt tn thng , bn s dng MM).

    Bn c th chn thm cc ch vo trong cc mu ca bn bng cch t chng trong mt du nhy n (v d, khi s dng "'on' MM/dd/yyyy" trn to ra on 11/05/2005).

    S cc k t trong mt thnh phn vn bn ca mt mu s p t vic dng dng vit tt hay dng vit di ("MM" to ra 11, nhng "MMM" to ra Nov v "MMMM" to ra November).

    S cc k t trong mt thnh phn s ca mt mu s p t s ti thiu cc ch s.

    Nu cc k hiu tiu chun ca SimpleDateFormat vn khng p ng c nhu cu nh dng tu chnh ca bn, bn c th s dng DateFormatSymbols ty chnh cc k hiu cho bt c thnh phn no ca Date hoc thi gian. V d, chng ta c th thc hin mt tp hp duy nht cc tn vit tt ca cc thng trong nm, nh sau (s dng chnh SimpleDateFormat nh trc):

    DateFormatSymbols symbols = new DateFormatSymbols();

    String[] oddMonthAbbreviations = new String[] {

    "Ja","Fe","Mh","Ap","My","Jn","Jy","Au","Se","Oc","No","De" };

    symbols.setShortMonths(oddMonthAbbreviations);

    formatter = new SimpleDateFormat("MMM dd, yyyy", symbols);

    formattedDate = formatter.format(now);

    System.out.println(formattedDate);

  • M ny gi mt hm to khc trn SimpleDateFormat, n nhn mt chui k t mu v mt DateFormatSymbols nh ngha cc dng vit tt c s dng khi mt tn thng vit tt xut hin trong mt mu. Khi chng ta nh dng ngy thng vi cc biu tng ny, kt qu s trng ging nh kt qu ca Date m chng ta thy trn:

    No 15, 2005

    Cc kh nng tu chnh ca SimpleDateFormat v DateFormatSymbols s l to ra bt k nh dng no m bn cn.

    Thao tc cc ngy thng

    Bn c th tin ln v li li theo trc thi gian bng cch tng v gim cc ngy thng hoc tng phn ca chng. Hai phng thc cho php bn lm iu ny:

    add()

    roll()

    Phng thc th nht cho php bn cng mt s lng (hoc tr i, nu l cng thm mt s lng m) thi gian vo mt trng Date c th. Vic thc hin iu s iu chnh tt c cc trng khc ca Date mt cch tng ng, da trn vic cng vo mt trng c th. V d, gi s chng ta bt u vi ngy 15 thng Mi Mt nm 2005 v tng trng ngy ln thm 20. Chng ta c th s dng m nh sau:

    Calendar calendar = GregorianCalendar.getInstance();

    calendar.set(Calendar.MONTH, 10);

    calendar.set(Calendar.DAY_OF_MONTH, 15);

  • calendar.set(Calendar.YEAR, 2005);

    formatter = new SimpleDateFormat("MMM dd, yyyy");

    System.out.println("Before: " + formatter.format(calendar.getTime()));

    calendar.add(Calendar.DAY_OF_MONTH, 20);

    System.out.println("After: " + formatter.format(calendar.getTime()));

    Kt qu s ging nh sau:

    Before: Nov 15, 2005

    After: Dec 05, 2005

    Kh n gin. Nhng vic cun (roll) mt Date mun ni ln iu g?. N c ngha l bn ang tng hoc gim mt trng c th ca ngy thng/thi gi mt lng cho, m khng nh hng n cc trng khc. V d, chng ta c th cun ngy thng ca chng ta t thng Mi Mt n thng Mi Hai nh sau:

    Calendar calendar = GregorianCalendar.getInstance();

    calendar.set(Calendar.MONTH, 10);

    calendar.set(Calendar.DAY_OF_MONTH, 15);

    calendar.set(Calendar.YEAR, 2005);

    formatter = new SimpleDateFormat("MMM dd, yyyy");

    System.out.println("Before: " + formatter.format(calendar.getTime()));

  • calendar.roll(Calendar.MONTH, true);

    System.out.println("After: " + formatter.format(calendar.getTime()));

    Lu rng thng c cun ln (hoc tng ln) thm 1. C hai dng roll():

    roll(int field, boolean up)

    roll(int field, int amount)

    Chng ta s dng dng th nht. gim mt trng bng cch s dng dng ny, bn gn gi tr false cho i s th hai. Dng th hai ca phng thc cho php bn nh r s lng tng ln hay gim i. Nu mt hnh ng cun to ra mt gi tr ngy thng khng hp l (v d, 09/31/2005), cc phng thc ny iu chnh cc trng khc cho ph hp, da trn cc gi tr hp l ln nht v nh nht cho cc ngy thng, gi, vv. Bn c th cun v pha trc dng cc gi tr dng v cun li li khi dng mt gi tr m.

    Th d on hnh ng cun ca bn s lm g cng tt, v bn chc chn c th lm nh th, nhng thng th cch tt nht vn l th v sa li. i khi bn s on ng, nhng i khi bn s phi th nghim xem ci g s to ra kt qu ng.

    S dng cc ngy thng

    Mi ngi u c mt ngy sinh. Hy thm mt ngy sinh vo lp Person ca chng ta. Trc tin, chng ta thm mt bin c th vo Person:

    protected Date birthdate = new Date();

    Tip theo, chng ta thm cc ph kin cho bin:

  • public Date getBirthdate() {

    return birthdate;

    }

    public void setBirthdate(Date birthday) {

    this.birthdate = birthday;

    }

    Tip theo, chng ta s loi b bin c th age bi v by gi chng ta s tnh ton n. Chng ta cng loi b phng thc truy cp setAge() v by gi age s l mt gi tr tnh ra c. Chng ta thay th phn thn ca getAge() bng cc m sau y:

    public int getAge() {

    Calendar calendar = GregorianCalendar.getInstance();

    calendar.setTime(new Date());

    int currentYear = calendar.get(Calendar.YEAR);

    calendar.setTime(birthdate);

    int birthYear = calendar.get(Calendar.YEAR);

    return currentYear - birthYear;

    }

  • Trong phng thc ny, chng ta tnh ton gi tr ca age da vo nm sinh ca Person v nm hin ti.

    By gi chng ta c th kim tra n bng cc m sau:

    Calendar calendar = GregorianCalendar.getInstance();

    calendar.setTime(new Date());

    calendar.set(Calendar.YEAR, 1971);

    calendar.set(Calendar.MONTH, 2);

    calendar.set(Calendar.DAY_OF_MONTH, 23);

    Adult anAdult = new Adult();

    anAdult.setBirthdate(calendar.getTime());

    System.out.println(anAdult);

    Chng ta t mt ngy sinh cho mt Adult vo ngy 23 thng Ba nm 1971. Nu chng ta chy m ny trong thng Ging nm 2005, chng ta s nhn c kt qu ny:

    An Adult with:

    Age: 33

    Name: firstname lastname

    Gender: MALE

    Progress: 0

  • C mt vi chi tit vn vt khc ti dnh li cho cc bn nh l bi tp:

    Cp nht compareTo() trn Adult phn nh s hin din ca mt bin c th mi.

    Nu ta trin khai thc hin n, chng ta s phi cp nht equals() cho Adult phn nh s hin din ca mt bin c th mi.

    Nu chng ta trin khai thc hin equals(), chng ta cng phi trin khai thc hin hashCode() v chng ta s phi cp nht hashCode() phn nh s hin din ca mt bin c th mi.

  • VO/RA (I/O)

    Gii thiu

    Cc d liu m mt chng trnh ngn ng Java s dng phi n t mt ni no . N thng hay n t mt s ngun d liu bn ngoi. C rt nhiu loi ngun d liu khc nhau, bao gm c c s d liu, chuyn giao byte trc tip qua mt cm (socket) v cc tp tin. Ngn ng Java s mang li cho bn rt nhiu cng c bn c th nhn c cc thng tin t cc ngun bn ngoi. Cc cng c ny phn ln nm trong gi java.io.

    Trong tt c cc ngun d liu sn c, cc tp tin l ph bin nht v thng thun tin nht. Vic hiu bit cch s dng cc API c sn ca ngn ng Java tng tc vi cc tp tin l mt k nng c bn ca lp trnh vin.

    Nhn chung, ngn ng Java cung cp cho bn mt lp bao gi (File) cho kiu tp tin trong h iu hnh ca bn. c tp tin , bn phi s dng cc lung (streams) phn tch c php cc byte u vo thnh cc kiu ca ngn ng Java. Trong phn ny, chng ti s ni v tt c cc i tng m bn s thng s dng c cc tp tin.

    Cc tp tin (File)

    Lp File nh ngha mt ngun ti nguyn trn h thng tp tin ca bn. N gy phin toi, c bit l cho vic kim th, nhng l thc t m cc lp trnh vin Java phi i ph vi n.

    y l cch bn khi to mt c th File:

    File aFile = new File("temp.txt");

    on m ny to ra mt c th File vi ng dn temp.txt trong th mc hin ti. Chng ta c th to mt File vi chui k t ng dn bt k nh mong mun, min l n hp l. Lu rng khi c i tng File ny khng c ngha l tp tin m n i din thc s tn ti trn h thng tp tin v tr d kin. i tng ca chng ta ch i din cho mt tp tin thc t c th c hoc c th khng c . Nu tp tin lin quan khng tn ti, chng ta s khng pht hin ra l c mt vn cho n khi chng ta c c hay vit vo n. l mt cht kh chu, nhng n c ngha. V d, chng ta c th hi xem File ca ta c tn ti hay khng:

  • aFile.exists();

    Nu n khng tn ti, chng ta c th to n:

    aFile.createNewFile();

    Khi s dng cc phng thc khc trn File, chng ta cng c th xa cc tp tin, to cc th mc, xc nh xem mt ti nguyn trong h thng tp tin l mt th mc hay l mt tp tin, v.v.. Tuy nhin, hot ng s thc s xy ra, khi chng ta ghi vo v c ra t tp tin. lm iu , chng ta cn phi hiu thm mt cht v cc lung.

    Cc lung

    Chng ta c th truy cp cc tp tin trn h thng tp tin bng cch s dng cc lung (streams). mc thp nht, cc lung cho php mt chng trnh nhn cc byte t mt ngun v/hoc gi kt qu n mt ch n. Mt s lung x l tt c cc loi k t 16-bit, cc k t ( l cc lung kiu Reader v Writer). Cc lung khc x l ch cc byte 8-bit ( l cc lung kiu InputStream v OutputStream). Trong cc h thng th bc ny c mt s lung vi hng v khc (tt c nm trong gi java.io). mc tru tng cao nht, c cc lung k t v cc lung byte.

    Cc lung byte c (InputStream v cc lp con ca n) v vit (OutputStream v cc lp con ca n) cc byte 8-bit. Ni cch khc, cc lung byte c th c coi l mt kiu lung th hn. Kt qu l, rt d dng hiu l do ti sao hng dn Java.sun.com v cc lp ngn ng Java ch yu (xem Ti nguyn) ni rng cc lung byte thng c s dng cho cc d liu nh phn, chng hn nh cc hnh nh. y l mt danh sch la chn cc lung byte:

  • Cc lung Cch s dng

    FileInputStream FileOutputStream

    c cc byte t mt tp tin v ghi cc byte vo mt tp tin.

    ByteArrayInputStream ByteArrayOutputStream

    c cc byte t mt mng trong b nh v ghi cc byte vo mt mng trong b nh.

    Cc lung k t c (Reader v cc lp con ca n) v vit (Writer v cc lp con ca n) cc k t 16-bit. Cc lp con hoc c hoc vit t/n cc b nh (sinks) d liu hoc x l cc byte c chuyn qua n. y l mt danh sch chn lc ca cc lung k t:

    Cc lung Cch s dng

    StringReader StringWriter

    Cc lung ny c v vit cc k t t/n cc String trong b nh.

    InputStreamReader InputStreamWriter (and subclasses FileReader FileWriter)

    Cu ni gia cc lung byte v cc lung k t. Reader flavors read bytes from a byte stream and convert them to characters. The Writer chuyn i cc k t thnh cc byte t chng vo cc lung byte.

    BufferedReader and BufferedWriter

    L b m d liu trong khi c hoc vit mt lung khc, cho php cc hot ng c v ghi c hiu qu hn. Bn gi mt lung khc trong mt lung c b m.

    Cc lung l mt ch ln v chng ta khng th trnh by ton b chng y. Thay vo , chng ta s tp trung vo cc lung c khuyn co dng c v vit cc tp tin. Trong hu ht trng hp, y s l cc lung k t, nhng chng ti s s dng c cc lung k t v cc lung byte minh ha cc kh nng ny.

  • c v vit cc tp tin

    C mt s cch c ra t v vit vo mt File. Ngi ta c th cho rng cch tip cn n gin nht din ra nh sau:

    To mt FileOutputStream trn File vit vo n.

    To mt FileInputStream trn File c t n.

    Gi read() c t File v write() vit vo File.

    ng cc lung, dn dp sch s nu cn thit.

    Cc m c th trng ging nh sau:

    try {

    File source = new File("input.txt");

    File sink = new File("output.txt");

    FileInputStream in = new FileInputStream(source);

    FileOutputStream out = new FileOutputStream(sink);

    int c;

    while ((c = in.read()) != -1)

    out.write(c);

    in.close();

  • out.close();

    } catch (Exception e) {

    e.printStackTrace();

    }

    y chng ta to ra hai i tng File: mt FileInputStream c t tp tin ngun v mt FileOutputStream vit ti File kt qu. (Lu : V d ny c iu chnh t v d CopyBytes.java trong Java.sun.com; xem Ti nguyn). Chng ta sau c vo tng byte ca d liu u vo v ghi n vo kt qu u ra. Sau khi xong, chng ta ng cc lung. C l l khn ngoan khi t mt li gi close() vo trong khi cui cng (finally). Tuy nhin, trnh bin dch ca ngn ng Java s cn yu cu bn phi nm bt nhiu trng hp ngoi l khc c th xy ra, iu ny c ngha l cn mt mnh catch khc na nm trong khi finally ca bn. C chc chn ng lm khng? C th.

    Vy l by gi chng ta c mt cch tip cn c bn c v vit. Nhng s la chn khn ngoan hn, v v mt vi kha cnh, s la chn d dng hn, l s dng mt s lung khc m chng ta s tho lun trong phn tip theo.

    Cc lung c b m

    C mt s cch c ra v ghi vo mt File, nhng cch tip cn in hnh v thun tin nht din ra nh sau:

    To mt FileWriter trn File.

    Gi FileWriter trong mt BufferedWriter.

    Gi write() trn BufferedWriter mi khi cn thit vit cc ni dung ca File, thng cui mi dng cn vit k t kt thc dng ( l, \n).

    Gi flush() trn BufferedWriter lm rng n.

  • ng BufferedWriter, dn dp sch nu cn thit.

    Cc m c th trng ging nh sau:

    try {

    FileWriter writer = new FileWriter(aFile);

    BufferedWriter buffered = new BufferedWriter(writer);

    buffered.write("A line of text.\n");

    buffered.flush();

    } catch (IOException e1) {

    e1.printStackTrace();

    }

    y, chng ta to ra mt FileWriter trn aFile, sau chng ta gi n trong mt BufferedWriter. Thao tc vit c b m hiu qu hn l n gin vit mi ln mt byte. Khi chng ta thc hin vit tng dng (m chng ta t kt thc bng \n), chng ta gi flush() trn BufferedWriter. Nu chng ta khng lm nh vy, chng ta s khng nhn thy bt k d liu no trong tp tin ch, bt chp mi cng sc c gng vit tp tin ny.

    Khi chng ta c d liu trong tp tin, chng ta c th c n bng cc m tng t n gin:

    String line = null;

    StringBuffer lines = new StringBuffer();

    try {

    FileReader reader = new FileReader(aFile);

  • BufferedReader bufferedReader = new BufferedReader(reader);

    while ( (line = bufferedReader.readLine()) != null) {

    lines.append(line);

    lines.append("\n");

    }

    } catch (IOException e1) {

    e1.printStackTrace();

    }

    System.out.println(lines.toString());

    Chng ta to ra mt FileReader, sau gi n trong mt BufferedReader. iu cho php chng ta s dng phng thc thun tin readLine(). Chng ta c tng dng cho n khi khng c g cn li, vit thm mi dng vo cui StringBuffer. ca chng ta. Khi c t mt tp tin, mt IOException c th xy ra, do chng ta bao quanh tt c logic c tp tin ca chng ta bng mt khi try/catch.

  • Tm tt

    Chng ti trnh by mt phn quan trng ca ngn ng Java trong hng dn "Gii thiu v lp trnh Java" (xem Ti nguyn) v hng dn ny, nhng ngn ng Java l rt ln nn ch mt hng dn nguyn khi (hoc thm ch mt s hng dn nh hn) khng th bao gm tt c mi vn . Di y nht ra mt s lnh vc m chng ti cn cha nu ra:

    Ch M t ngn gn

    Threads C mt chng trnh ch thc hin mt vic ti mt thi im c th l c ch, nhng hu ht cc chng trnh ngn ng Java tinh vi c nhiu lung (threads) thc thi chy cng mt lc. V d, cc tc v in n hoc tm kim c th chy mt sau. Lp Thread v cc lp c lin quan trong java.lang c th cung cp cho bn kh nng phn lung mnh m v linh hot trong chng trnh ca bn. developerWorks c cc trang Web vi nhiu ti nguyn tt v phn lung trong m Java ca bn, nhng mt im bt u thch hp l cc hng dn "Gii thiu v cc lung Java" v "Tng tranh trong JDK 5.0" v lot cc bi vit ny ca Brian Goetz.

    Reflection

    Mt trong nhng kha cnh mnh ca ngn ng Java (v thng l mt trong nhng iu m nh nht) l s phn chiu hay kh nng xem thng tin v chnh m ca bn. Gi java.lang.reflect bao gm cc lp nh Class v Method cho php tra xt cu trc m ca bn. V d, bn c th tm thy mt phng thc bt u vi get, sau gi n bng cch gi invoke() trn i tng Method -- rt mnh. Phn 2 ca lot bi "Cc ng lc trong lp trnh Java" ca Dennis M. Sosnoski ni v vic s dng phn chiu.

    NIO

    K t JDK 1.4, ngn ng Java kt hp mt s kh nng I/O tinh vi hn, da trn mt API hon ton mi gi l I/O mi hoc vit tt l NIO. S khc bit chnh l ch I/O ca ngn ng Java truyn thng l da trn cc lung (nh chng ta tho lun trn), trong khi NIO da trn mt khi nim gi l khi I/O, cc knh v cc b m. Khi I/O ny c xu hng c hiu qu hn vic gi tng byte n l thng qua mt lung. Mt hn ch l NIO l khi nim kh. "Khi u vi I/O mi (NIO)" ca Greg Travis l mt hng dn tuyt vi v ch

  • ny.

    Sockets

    Cc chng trnh ngn ng Java ca bn c th giao tip vi hu nh bt k chng trnh no trn mt thit b c kh nng IP. Tt c nhng g bn cn lm l m mt kt ni cm (socket) vi mt a ch IP v mt cng trn thit b . API cc cm (Sockets API) ca ngn ng Java h tr vic ny. Xem hng dn "101 cc cm ca Java" ca Roy Miller v Adam Williams c gii thiu v API cc cm. Hng dn "S dng JSSE cho giao tip cm an ton" ca Greg Travis cho bn thy lm th no thc hin bo mt giao tip cm ca bn.

    Swing

    Ngn ng Java bao gm cc h tr rng ln cho vic pht trin GUI di dng Swing. B Swing ca cc API bao gm cc lp cho cc vt dng v cc phn t khc to ra cc giao din ngi dng c y c tnh. C mt s ti nguyn quan trng trn developerWorks lin quan n Swing, nhng mt im thch hp bt u l bi vit gii thiu "Giao din ngi dng ca Java 2" ca Matt Chapman. Chuyn mc Magic vi Merlin ca John Zukowski tp trung vo nhng thay i v cp nht Swing gn y. John cng ch tr trang web Din n tho lun lp trnh Java pha khch, v vy bn c th nhn c s h tr cho vic lp trnh Swing . Hng dn "Di chuyn ng dng Swing ca bn n SWT" tho lun cch lm th no di chuyn t Swing n SWT ca IBM, mt gii php thay th gn nh nhng vn rt mnh m.

    JNI

    Khi chng trnh Java ca bn cn phi giao tip vi mt chng trnh khc, v d vit bng ngn ng C, Java cho bn mt cch lm iu , l: Giao din bn a Java (JNI). API ny cho php bn chuyn i cc li gi phng thc ca Java thnh cc li gi n cc hm C ( tng tc vi cc h iu hnh v tng t). Hng dn "Lp trnh Java vi JNI" ca developerWorks tho lun v cc c cu ca JNI vi m Java, C v C++.

    RMI API v vin dn phng thc t xa ca ngn ng Java (RMI - Remote Method Invocation) cho php mt chng trnh bng ngn ng Java, hoc trong mt tin trnh hoc trn mt my tnh, truy cp vo chng trnh ngn ng Java khc ang chy trong mt tin trnh khc v/hoc

  • trn my tinh khc. Ni cch khc, RMI h tr cc cuc gi phng thc phn tn gia cc chng trnh ang chy trong cc my o Java khc nhau. Hng dn "Cc i tng phn tn ca Java: S dng RMI v CORBA" ca Brad Rubin cung cp mt s m u vng chc v RMI v tho lun v RMI v CORBA cng vi nhau. Bn cng nn xem bi vit ny ca Edward Harned tm hiu l do ti sao RMI khng phi l mt my ch ng dng lm sn.

    Security

    Ngn ng Java bao gm cc API bo mt tinh vi h tr xc thc v cp php. Lm th no bn c th chc chn rng nhng ngi no s dng chng trnh ca bn c php thc hin ? Lm th no bn c th bo v cc thng tin khi nhng con mt t m? Cc API bo mt c th tr gip. Trn developerWorks cung cp nhiu ni dung c lin quan n bo mt Java. Di y ch l mt vi v d: Trang web Din n tho lun bo mt Java c John Peck, mt lp trinh vin v chuyn gia bo mt Java k cu, ch tr; "Bn trong c ch cp php Java" ca Abhijit Belapurkar; v "Bo mt Java, Phn 1: Nhng iu cn bn v mt m ha" v "Bo mt Java , Phn 2: Xc thc v cp php" c hai u ca Brad Rubin.