Lập trình hướng đối tượng Java PTIT

173 372 4
Lập trình hướng đối tượng Java  PTIT

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Tài liệu gồm 6 chương : Chương 1: Tổng quan về tiếp cận hướng đối tượng Chương 2: Khái niệm cơ bản của lập trình hướng đối tượng Chương 3: Ngôn ngữ Java Chương 4: Kế thừa và đa hình trên Java Chương 5: Cài đặt cấu trúc dữ liệu lên Java Chương 6: Lập trình giao diện trên Java

1 P TRÌNH HNG I TNG PGS.TS. Trn ình Qu KS. Nguyn Mnh Hùng Các khái nim c bn ca Lp trình hng đi tng Lp trình hng đi tng vi Java 2 GII THIU Trong nhng nm gn đây, lp trình hng đi tng đã tr nên gn gi nh s ra đi liên tip ca các ngôn ng lp trình hng đi tng. Sc mnh ca phng pháp lp trình hng đi tng th hin  ch kh nng mô hình hoá h thng da trên các đi tng thc t, kh nng đóng gói và bo v an toàn d liu, kh nng s dng li mã ngun đ tit kim chi phí và tài nguyên; đc bit là kh nng chia s mã ngun trong cng đng lp trình viên chuyên nghip. Nhng đim mnh này ha hn s thúc đy phát trin mt môi trng lp trình tiên tin cùng vi nn công nghip lp ráp phn mm vi các th vin thành phn có sn. Tài liu này nhm gii thiu cho các sinh viên m t cái nhìn tng quan v phng pháp lp trình hng đi tng cùng cung cp nhng kin thc, các k thut c bn cho phát trin các ng dng ca mình da trên ngôn ng lp trình Java - mt trong nhng ngôn ng lp trình hng đi tng thông dng nht hin nay. Ni dung ca tài liu này bao gm hai phn chính: • Phn th nht trình bày nhng khái nim và các vn đ c bn c a lp trình hng đi tng bao gm tng quan v cách tip cn hng đi tng và các khái nim đi tng, lp, k tha, đóng gói, đa hình… • Phn th hai trình bày chi tit phng pháp lp trình hng đi tng vi ngôn ng lp trình Java. Ni dung ca tài liu bao gm 6 chng: Chng 1: Tng quan v cách tip cn hng đi tng. Trình bày s ti n hoá ca cách tip cn t lp trình truyn thng đn cách tip cn ca lp trình hng đi tng và xu hng phát trin ca lp trình hng đi tng hin nay. Chng 2: Nhng khái nim c bn ca lp trình hng đi tng. Trình bày các khái nim c bn nh: đi tng, lp đi tng vi các thuc tính và phng thc, tính k th a và đa hình, tính đóng gói ca lp trình hng đi tng. Chng này cng gii thiu tng quan mt s ngôn ng lp trình hng đi tng thông dng hin nay. Chng 3: Ngôn ng Java. Gii thiu nhng khái nim và nhng quy c ban đu ca ngôn ng lp trình Java: Cu trúc chng trình, cách biên dch, cách đt tên bin, kiu d liu, các toán t và cu trúc lnh ca ngôn ng Java. Ch ng 4: K tha và đa hình trên Java. Trình bày các k thut lp trình hng đi tng da trên ngôn ng Java: Khai báo lp, các thuc tính và phng thc ca lp; k thut tha k, các lp tru tng, cài đt np chng và đa hình trên Java. Chng 5: Biu din và cài đt các cu trúc d liu tru tng trên Java. Trình bày k thut cài đt và s dng mt s cu trúc d li u quen thuc trong Java: ngn xp, hàng đi, danh sách liên kt, cây nh phân và đ th. Chng 6: Lp trình giao din trên Java. Trình bày các k thut lp trình giao din trên Java: Lp trình vi các giao din c bn trong th vin AWT, lp trình giao din vi Applet và HTML, lp trình giao din nâng cao vi th vin SWING. Tài liu này đc vit nhm phc v môn hc “Lp trình hng đi tng” ging dy tip theo sau môn hc Ngôn ng lp trình C++ và nh vy khi hc môn hc này sinh viên s d nm bt đc nhng đc trng khác bit ca ngôn ng Java so vi C++. 3 Cun sách này còn có kèm theo mt đa CD cha toàn b mã các chng trình cài đt làm ví d và bài tp trong cun sách. Mc dù các tác gi đã có nhiu c gng trong quá trình biên son tài liu này, song không th tránh khi nhng thiu sót. Rt mong nhn đc s đóng góp ý kin ca sinh viên và các bn đng nghip. 4 PHN 1 NHNG KHÁI NIM C BN CA LP TRÌNH HNG I TNG 5 CHNG 1 TNG QUAN V CÁCH TIP CN HNG I TNG Ni dung chng này nhm gii thiu mt cách tng quan v cách tip cn hng đi tng. Ni dung trình bày bao gm: • Gii thiu v cách tip cn ca lp trình truyn thng. • Gii thiu cách tip cn ca lp trình hng đi tng. • So sánh s khác bit gia hai cách tip cn này. • Xu hng hin nay ca lp trình hng đi tng 1.1 PHNG PHÁP TIP CN CA LP TRÌNH TRUYN THNG Lp trình truyn thng đã tri qua hai giai đon: • Giai đon s khai, khi khái nim lp trình mi ra đi, là lp trình tuyn tính. • Giai đon tip theo, là lp trình hng cu trúc. 1.1.1 Lp trình tuyn tính c trng c bn ca lp trình tuyn tính là t duy theo li tun t. Chng trình s đc thc hin tun t t đu đn cui, lnh này k tip lnh kia cho đn khi kt thúc chng trình. c trng Lp trình tuyn tính có hai đc trng: • n gin: chng trình đc tin hành đn gin theo li tun t, không phc tp. • n lung: ch có mt lung công vic duy nht, và các công vic đc thc hin tun t trong lung đó. Tính cht • u đim: Do tính đn gin, lp trình tuyn tính có u đim là chng trình đn gin, d hiu. Lp trình tuyn tính đc ng dng cho các chng trình đn gin. • Nhc đim: Vi các ng dng phc tp, ngi ta không th dùng lp trình tuyn tính đ gii quyt. Ngày nay, lp trình tuyn tính ch tn ti trong phm vi các modul nh nh t ca các phng pháp lp trình khác. Ví d trong mt chng trình con ca lp trình cu trúc, các lnh cng đc thc hin theo tun t t đu đn cui chng trình con. 1.1.2 Lp trình cu trúc Trong lp trình hng cu trúc, chng trình chính đc chia nh thành các chng trình con và mi chng trình con thc hin mt công vic xác đnh. Chng trình chính s gi đn chng trình con theo mt gii thut, hoc mt cu trúc đc xác đnh trong chng trình chính. 6 Các ngôn ng lp trình cu trúc ph bin là Pascal, C và C++. Riêng C++ ngoài vic có đc trng ca lp trình cu trúc do k tha t C, còn có đc trng ca lp trình hng đi tng. Cho nên C++ còn đc gi là ngôn ng lp trình na cu trúc, na hng đi tng. c trng c trng c bn nht ca lp trình cu trúc th hin  mi quan h: Chng trình = Cu trúc d liu + Gii thut Trong đó: • Cu trúc d liu là cách t chc d liu, cách mô t bài toán di dng ngôn ng lp trình • Gii thut là mt quy trình đ thc hin mt công vic xác đnh Trong chng trình, gii thut có quan h ph thuc vào cu trúc d liu: • Mt cu trúc d liu ch phù hp vi mt s hn ch các gii thut. • Nu thay đi cu trúc d liu thì phi thay đi gii thut cho phù hp. • Mt gii thut thng phi đi kèm vi mt cu trúc d liu nht đnh. Tính cht • Mi chng trình con có th đc gi thc hin nhiu ln trong mt chng trình chính. • Các chng trình con có th đc gi đn đ thc hin theo mt th t bt kì, tu thuc vào gii thut trong chng trình chính mà không ph thuc vào th t khai báo ca các chng trình con. • Các ngôn ng lp trình cu trúc cung cp mt s cu trúc lnh điu khin ch ng trình. u đim • Chng trình sáng sa, d hiu, d theo dõi. • T duy gii thut rõ ràng. Nhc đim • Lp trình cu trúc không h tr vic s dng li mã ngun: Gii thut luôn ph thuc cht ch vào cu trúc d liu, do đó, khi thay đi cu trúc d liu, phi thay đi gii thut, ngha là phi vit li chng trình. • Không phù hp vi các phn mm ln: t duy cu trúc vi các gii thut ch phù hp vi các bài toán nh, n m trong phm vi mt modul ca chng trình. Vi d án phn mm ln, lp trình cu trúc t ra không hiu qu trong vic gii quyt mi quan h v mô gia các modul ca phn mm. Vn đ Vn đ c bn ca lp trình cu trúc là bng cách nào đ phân chia chng trình chính thành các chng trình con cho phù hp vi yêu cu, chc nng và mc đích ca mi bài toán. Thông thng, đ phân rã bài toán trong lp trình cu trúc, ngi ta s dng phng pháp thit k trên xung (top-down). 7 Phng pháp thit k trên xung (top-down) Phng pháp thit k top-down tip cn bài toán theo hng t trên xung di, t tng quan đn chi tit. Theo đó, mt bài toán đc chia thành các bài toán con nh hn. Mi bài toán con li đc chia nh tip, nu có th, thành các bài toán con nh hn na. Quá trình này còn đc gi là quá trình làm mn dn. Quá trình làm mn dn s dng li khi các bài toán con không cn chia nh thêm na. Ngha là khi mi bài toán con đu có th gii quyt bng mt ch ng trình con vi mt gii thut đn gin. Ví d, s dng phng pháp top-down đ gii quyt bài toán là xây mt cn nhà mi. Khi đó, ta có th phân rã bài toán theo các bc nh sau: •  mc th nht, chia bài toán xây nhà thành các bài toán nh hn nh: làm móng, đ ct, đ trn, xây tng, lp mái. •  mc th hai, phân rã các công vic  mc th nht: vic làm móng nhà có th phân rã tip thành các công vic: đào móng, gia c  nn, làm khung st, đ bê tông. Công vic đ ct đc phn rã thành … •  mc th ba, phân rã các công vic ca mc th hai: vic đào móng có th phân chia tip thành các công vic: đo đc, cm mc, chng dây, đào và kim tra móng. Vic gia c nn đc phân rã thành … Quá trình phân rã có th dng  mc này, bi vì các công vic con thu đc là: đo đc, cm mc, chng dây, đào… có th thc hi n đc ngay, không cn chia nh thêm na. Lu ý: • Cùng s dng phng pháp top-down vi cùng mt bài toán, nhng có th cho ra nhiu kt qu khác nhau. Nguyên nhân là do s khác nhau trong tiêu chí đ phân rã mt bài toán thành các bài toán con. Ví d, vn áp dng phng pháp top-down đ gii quyt bài toán xây nhà, nhng nu s dng mt cách khác đ phân chia bài toán, ta có th thu đc kt qu khác bit so vi phng pháp ban đu: •  mc th nht, chia bài toán xây nhà thành các bài toán nh h n nh: làm phn g, làm phn st, làm phn bê tông và làm phn gch. •  mc th hai, phân rã các công vic  mc th nht: vic làm g có th chia thành các công vic nh: x g, gia công g, to khung, lp vào nhà. Vic làm st có th chia nh thành… Rõ ràng, vi cách làm mn th này, ta s thu đc mt kt qu khác hn vi cách thc đã thc hin  phn trên. 1.2 PHNG PHÁP TIP CN HNG I TNG 1.2.1 Phng pháp lp trình hng đi tng Xut phát t hai hn ch chính ca phng pháp lp trình cu trúc: • Không qun lí đc s thay đi d liu khi có nhiu chng trình cùng thay đi mt bin chung. Vn đ này đc bit nghiêm trng khi các ng dng ngày càng ln, ngi ta không th kim soát đc s truy nhp đn các bin d liu chung. 8 • Không tit kim đc tài nguyên con ngi: Gii thut gn lin vi cu trúc d liu, nu thay đi cu trúc d liu, s phi thay đi gii thut, và do đó, phi vit li mã chng trình t đu.  khc phc đc hai hn ch này khi gii quyt các bài toán ln, ngi ta xây dng mt phng pháp tip cn mi, là phng pháp lp trình h ng đi tng, vi hai mc đích chính: • óng gói d liu đ hn ch s truy nhp t do vào d liu, không qun lí đc. • Cho phép s dng li mã ngun, hn ch vic phi vit li mã t đu cho các chng trình. Vic đóng gói d liu đc thc hin theo phng pháp tru tng hoá đi tng thành lp t thp lên cao nh  sau: • Thu thp các thuc tính ca mi đi tng, gn các thuc tính vào đi tng tng ng. • Nhóm các đi tng có các thuc tính tng t nhau thành nhóm, loi b bt các thuc tính cá bit, ch gi li các thuc tính chung nht. ây đc gi là quá trình tru tng hoá đi tng thành lp. • óng gói d liu ca các đi tng vào lp tng ng. Mi thu c tính ca đi tng tr thành mt thuc tính ca lp tng ng. • Vic truy nhp d liu đc thc hin thông qua các phng thc đc trang b cho lp. Không đc truy nhp t do trc tip đn d liu. • Khi có thay đi trong d liu ca đi tng, ta ch cn thay đi các phng thc truy nhp thuc tính ca lp, mà không c n phi thay đi mã ngun ca các chng trình s dng lp tng ng. Vic cho phép s dng li mã ngun đc thc hin thông qua c ch k tha trong lp trình hng đi tng. Theo đó: • Các lp có th đc k tha nhau đ tn dng các thuc tính, các phng thc ca nhau. • Trong lp dn xut (lp đc k th a) có th s dng li các phng thc ca lp c s (lp b lp khác k tha) mà không cn thit phi cài đt li mã ngun. • Ngay c khi lp dn xut đnh ngha li các phng thc cho mình, lp c s cng không b nh hng và không phi sa li bt kì mt đon mã ngun nào. Ngôn ng l p trình hng đi tng ph bin hin nay là Java và C++. Tuy nhiên, C++ mc dù cng có nhng đc trng c bn ca lp trình hng đi tng nhng vn không phi là ngôn ng lp trình thun hng đi tng. Java tht s là mt ngôn ng lp trình thun hng đi tng. c trng Lp trình hng đi tng có hai đc trng c bn: • óng gói d liu: d liu luôn đc t chc thành các thuc tính ca lp đi tng. Vic truy nhp đn d liu phi thông qua các phng thc ca đi tng lp. • S dng li mã ngun: vic s dng li mã ngun đc th hin thông qua c ch  k tha. C ch này cho phép các lp đi tng có th k tha t các lp đi tng khác. Khi đó, trong các lp k tha, có th s dng các phng thc (mã ngun) ca các lp b k tha, mà không cn phi đnh ngha li. 9 u đim Lp trình hng đi tng có mt s u đim ni bt: • Không còn nguy c d liu b thay đi t do trong chng trình. Vì d liu đã đc đóng gói vào các đi tng. Nu mun truy nhp vào d liu phi thông qua các phng thc cho phép ca đi tng. • Khi thay đi cu trúc d liu ca mt đi tng, không cn thay đi các đi mã ngun ca các đi tng khác, mà ch cn thay đi mt s hàm thành phn ca đi tng b thay đi. iu này hn ch s nh hng xu ca vic thay đi d liu đn các đi tng khác trong chng trình. • Có th s dng li mã ngun, tit kim tài nguyên. Vì nguyên tc k tha cho phép các lp k tha s d ng các phng thc đc k tha t lp khác nh nhng phng thc ca chính nó, mà không cn thit phi đnh ngha li. • Phù hp vi các d án phn mm ln, phc tp. 1.2.2 Phng pháp phân tích và thit k hng đi tng Mt vn đ c bn đt ra cho phng pháp hng đi tng là t mt bài toán ban đu, làm sao đ thu đc mt tp các đi tng, vi các chc nng đc phi hp vi nhau, đáp ng đc yêu cu ca bài toán đt ra? Phng pháp phân tích thit k hng đi tng ra đi nhm tr li cho câu hi này. Mc đích là xây dng mt tp các l p đi tng tng ng vi mi bài toán, phng pháp này tin hành theo hai pha chính: Pha phân tích: Chuyn đi yêu cu bài toán t ngôn ng t nhiên sang ngôn ng mô hình. Pha thit k: Chuyn đi đc t bài toán di dng ngôn ng mô hình sang mt mô hình c th có th cài đt đc. Hai pha phân tích và thit k này bao gm nhiu bc khác nhau: • Mô t bài toán • c t yêu cu • Trích chn đi tng • Mô hình hoá lp đi tng • Thit k tng quan • Thit k chi tit. Bc 1: Mô t bài toán Bài toán ban đu đc phát biu di dng ngôn ng t nhiên, bao gm: • Mc đích, chc nng chung • Các yêu cu v thông tin d liu • Các yêu cu v chc nng thc hin 10 Bc 2: c t yêu cu Các yêu cu đc hình thc hoá lên mt mc cao hn bng cách s dng ngôn ng kiu kch bn (scenario) đ mô t. Trong mt kch bn, mi chc nng, mi hot đng đc mô t bng mt kch bn, bao gm: • Các tác nhân tham gia vào kch bn. • Vai trò ca mi tác nhân trong kch bn. • Th t các hành đng mà mi tác nhân thc hin: khi nào thc hi n, tác đng vào tác nhân nào, thông tin nào đc trao đi. Quá trình trên đc tin hành vi tt c các chc nng yêu cu ca h thng. Bc 3: Trích chn đi tng Bc này s tin hành đ xut các đi tng có th có mt trong h thng: • Da vào các kch bn đc mô t trong bc hai, chn ra các tác nhân có xut hin đ đ xut thành các đi tng. • La chn các đi tng bng cách loi b các tác nhân bên ngoài h thng, các tác nhân trùng lp. • Cui cùng, ta thu đc tp các đi tng ca h thng. Bc 4: Mô hình hoá lp đi tng Bc này tin hành tru tng hoá đi tng thành các lp: • Thu thp tt c các thuc tính ca mi đi tng va thu thp đc, da vào yêu cu v thông tin trong yêu cu h thng (t bc 1). • Thu thp các hành đng mà mi đi tng cn thc hin, da vào các kch bn mà đi tng tng ng có tham gia (trong bc 2). • Nhóm các đi tng t ng t nhau, hoc có nhiu thuc tính gn ging nhau. • Loi b mt s thuc tính cá bit, riêng t ca mt s đi tng trong nhóm. • Mô hình mi nhóm đi tng còn li thành lp: Các thuc tính chung ca các đi tng thành thuc tính ca lp, các hành đng ca các đi tng thành phng thc ca lp. Kt qu thu đc mt tp các lp đi tng ban đu ca h thng. Bc 5: Thit k tng quát Bc này s tin hành thit k v mô, ngha là thit k mi quan h gia các lp trong h thng: • Xác đnh s đ tha k, nu có, gia các lp: Nu hai lp có mt s thuc tính chung, thì tách các thuc tính chung làm thành mt lp c s, và hai lp ban đu đu dn xut t lp c s đó. Thông thng, lp các tru tng (chung nh t) s làm lp c s, lp càng c th, càng chi tit thì làm lp dn xut (lp con, cháu). • Xác đnh tng tác, nu có, gia các lp: Da vào các kch bn đc mô t trong bc 2, hai tác nhân có tng tác vi nhau thì hai lp tng ng  bc này cng có tng tác vi nhau. Kt qu thu đc ca bc này là mt s đ quan h bên ngoài gia các lp trong h thng. [...]... TRÌNH H NG IT NG V I JAVA 28 CH NG 3 GI I THI U V JAVA N i dung c a ch ng này t p trung trình bày các v n L ch s ra chính v ngôn ng l p trình Java: i và phát tri n c a Java Ki n trúc t ng quát m t ch ng trình xây d ng trên Java Các toán t và các c u trúc d li u c b n trên Java Các c u trúc l nh c a Java 3.1 L CH S PHÁT TRI N C A JAVA 3.1.1 Java N m 1991, m t nhóm k s c a Sun Microsystems mu n l p trình. .. máy o Java dùng trình thông d ch Java chuy n mã bytecode thành d ng ch y c trên các n n ph n c ng t ng ng Do v y, khi thay i n n ph n c ng, không ph i biên d ch l i mã ngu n Java Hình 3.2 minh ho quá trình biên d ch và thông d ch mã ngu n Java 30 IB Trình thông d ch Java Bytecode Sparc (Java Interpreter) Trình biên d ch Macintosh cl pn n (Platform independent) Hình 3.2 D ch ch ng trình Java M nh m Java. .. s d ng trình biên d ch javac Trình biên d ch xác nh tên c a file ngu n t i dòng l nh nh mô t d i ây (gi s ang th m c ch a package vidu và bi n môi tr ng PATH ã c thi t l p úng qui cách): >javac vidu/chuong3/First .java Trình d ch javac t o ra file First.class ch a các mã “bytecodes” Nh ng mã này ch a th th c thi c ch ng trình th c thi c ta c n dùng trình thông d ch java interpreter” v i l nh java L... 2.4 M T S NGÔN NG L P TRÌNH H N i dung ph n này s trình bày m t s ngôn ng l p trình h NG ng IT it i t ng i v i môi i t ng l p NG ng thông d ng hi n nay: Ngôn ng l p trình C++ Ngôn ng l p trình ASP.NET và C#.NET 24 Ngôn ng l p trình Java 2.4.1 C++ C++, ra i vào gi a nh ng n m 1980, là m t ngôn ng l p trình h ng i t ng t ngôn ng l p trình c u trúc C Cho nên, C++ là ngôn ng l p trình n a h ng h ng c u... ng trình Java ch a r t nhi u thông tin th c thi nh m ki m soát và truy nh p i t ng lúc ch y i u này cho phép kh n ng liên k t ng mã 3.1.3 Cài t Java Quá trình cài t môi tr Copy b cài Ch y ch ng Java trên máy bao g m ba b t ng trình cài C p nh t bi n môi tr Copy b cài Có th copy t c: t ng t a CD ho c t i xu ng mi n phí t i a ch web site c a nhóm Java: http://www .java. sun.com/downloads/ Ch y ch ng trình. .. mã ngu n Java: iv im t Khai báo tên l p v i t khoá class Khái báo các thu c tính c a l p 35 Khai báo các ph ng th c c a l p Vi c khai báo l p v i các thu c tính và ph 3.2.2 Ch Ch ng trình Java ng th c s c trình bày chi ti t trong ch ng 4 u tiên ng trình sau ây cho phép hi n th m t thông i p (N m trong t p mã ngu n First .java) : Ch ng trình 3.1 package vidu.chuong3; // ây là ch ng trình “First .java class... n 25 2.4.3 Java Java là m t ngôn ng l p trình c Sun Microsystems gi i thi u vào tháng 6 n m 1995 Java c xây d ng trên n n t ng c a C và C++: Java s d ng cú pháp c a C và c tr ng h ng i t ng c a C++ M ts c i m c a Java: Java là m t ngôn ng l p trình hoàn toàn h ng i t ng: T t c các th c th u c coi là m t i t ng, là m t th hi n c th c a m t l p xác nh Không có d li u t do và hàm t do trong Java, t t c... ng c a C và C++ ngh a là Java s d ng cú pháp c a C và c tr ng h ng i t ng c a C++ Java là ngôn ng v a biên d ch v a thông d ch u tiên mã ngu n c biên d ch thành d ng bytecode Sau ó c th c thi trên t ng lo i máy nh trình thông d ch M c tiêu c a các nhà thi t k Java là cho phép ng i l p trình vi t ch ng trình m t l n nh ng có th ch y trên các n n ph n c ng khác nhau Ngày nay, Java c s d ng r ng rãi, không... ng Java là ngôn ng l p trình hoàn toàn h M i th c th trong h th ng m t l p xác nh T t c các ch ng trình ng u it ng: c coi là m t it ng, t c là m t th hi n c th c a u ph i n m trong m t class nh t nh Không th dùng Java vi t m t ch c n ng mà không thu c vào b t kì m t l p nào T c là Java không cho phép nh ngh a d li u và hàm t do trong ch ng trình c l p ph n c ng và h i u hành i v i các ngôn ng l p trình. .. nhau, có m t trình biên d ch khác nhau biên d ch mã ngu n ch ng trình cho phù h p v i n n ph n c ng y Do v y, khi ch y trên m t n n ph n c ng khác, b t bu c ph i biên d ch l i mà ngu n compiler IB compiler Sparc compiler Macintosh Hình 3.1 Cách biên d ch truy n th ng i các ch ng trình vi t b ng Java, trình biên d ch Javac s biên d ch mã ngu n thành d ng bytecode Sau ó, khi ch y ch ng trình trên các

Ngày đăng: 03/02/2015, 23:21

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan