Bài giảng môn Ngôn ngữ lập trình Java

pdf 239 trang phuongnguyen 6600
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng môn Ngôn ngữ lập trình Java", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_mon_ngon_ngu_lap_trinh_java.pdf

Nội dung text: Bài giảng môn Ngôn ngữ lập trình Java

  1. Chương 1 Giới thiệu ngôn ngữ lập trình Java
  2. Giớithiệu •Sự phát triển củaJava •Hướng tới người dùng •Giống với C / C++
  3. Các đặc trưng của Java „ Đơn giản „ Hướng đối tượng „ Độc lập phần cứng „ Mạnh „ Bảo mật „ Phân tán „ Đa luồng „ Động
  4. Các chương trình dịch truyền thống
  5. Chương trình dịch Java
  6. Các loạichương trình Java „ Applets „ Ứng dụng độc lập (console Application) „ Ứng dụng giao diện (GUI Application) „ Servlet „ Ứng dụng cơ sở dữ liệu
  7. Máy ảoJava •Làmột phần mềm dựa trên cơ sở máy tính ảo •Làtập hợp các lệnh logic để xác định hoạt động của máy tính • Được xem như là một hệ điều hành thu nhỏ •Nóthiết lập lớp trừu tượng cho: –Phần cứng bên dưới –Hệ điều hành –Mã đã biên dịch
  8. Quá trình dịch chương trình Java • Trình biên dịch chuyển mã nguồn thành tập các lệnh không phụ thuộc vào phần cứng cụ thể • Trình thông dịch trên mỗi máy chuyển tập lệnh này thành chương trình thực thi •Máy ảo tạo ra một môi trường để thực thi các lệnh bằng cách: –Nạp các file .class –Quản lý bộ nhớ –Dọn “rác”
  9. Trình dịch Java Java Development Kit • Java 1.0 - Sử dụng lần đầuvàonăm 1995 • Java 1.1 – Đưaranăm 1997 • Java 2 – Phiên bảnmớinhất
  10. Bộ công cụ JDK • Trình biên dịch, 'javac' – javac [options] sourcecodename.java • Trình thông dịch, 'java' – java [options] classname •Trìnhdịch ngược, 'javap' – javap [options] classname •Côngcụ sinh tài liệu, 'javadoc' – javadoc [options] sourcecodename.java
  11. •Chương trình tìm lỗi - Debug, 'jdb‘ – jdb [options] sourcecodename.java OR – jdb -host -password [options] sourcecodename.java •Chương trình xem Applet , 'appletviewer‘ – appletviewer [options] sourcecodename.java / url
  12. Các gói chuẩncủaJava • java.lang • java.applet • java.awt • java.io • java.util • java.net • java.awt.event • java.rmi • java.security • java.sql
  13. Các đặctrưng mớIcủa Java2 • Swing • Kéo và thả • Java 2D API • Âm thanh • RMI
  14. Chương 2 Các phầntử cơ bảnngônngữ Java
  15. Cấutrúcmột chương trình Java •Xáclập thông tin môi trường • Khai báo lớp đốitượng (Class) • Các thành phần(Tokens): – Định danh –T ừ khóa / từ dự phòng –Kýtự phân cách –Nguyêndạng (Literals) –Toántử
  16. Ví dụ mộtchương trình Java mẫu // This is a simple program called “Ex1.java” class Ex1 { public static void main(String args[]) { System.out.println(“My first program in Java”); } }
  17. Biên dịch chương trình java • \jdk\bin>javac Ex1.java • \jdk\bin>java Ex1 •Ku ếtq ả: My first program in Java
  18. Truyền đốisố trong dòng lệnh class Pass { public static void main(String parameters[]) { System.out.println("This is what the main method received"); System.out.println(parameters[0]); System.out.println(parameters[1]); System.out.println(parameters[2]); } }
  19. Truyền đốisố trong dòng lệnh (Tiếp theo )
  20. Các phần tử cơ bản củangôn ngữ Java •Lớpvàphương thức (Classes & Methods) •Kiểudữ liệu •Biếnsố •Toántử •C ấutrúcđiềukhiển
  21. Lớp trong Java • Cú pháp khai báo lớp (Class) class Classname { var_datatype variablename; : met_datatype methodname(parameter_list) : }
  22. Lớpmẫu
  23. Các lớplồng nhau (Nested Classes) „ Việc định nghĩamộtlớpbêntrongmộtlớp khác đượcgọilà“xếplồng” (Nesting) „ Các kiểuxếplồng: „ Tĩnh (Static) „ Động (Non-static)
  24. Kiểudữ liệu „ Kiểudữ liệucơ sở (Primitive Data Types) „ Kiểudữ liệu tham chiếu (Reference data types)
  25. Kiểudữ liệucơ sở •byte • char • boolean • short •int • long • float • double
  26. Kiểudữ liệu tham chiếu •Mảng (Array) •L ớp (Class) • Interface
  27. Ép kiểu (Type Casting) •Kiểudữ liệu này đượcchuyển đổi sang mộtkiểudữ liệu khác •Vídụ float c = 34.89675f; int b = (int)c + 10;
  28. Biếnsố • Khai báo biếnsố gồm 3 thành phần: –Kiểudữ liệucủabiếnsố – Tên biến – Giá trị ban đầucủabiến(khôngbắtbuộc) • Cú pháp datatype identifier [=value][, identifier[=value] ];
  29. Những từ khóa củaJava
  30. Khai báo mảng •Bacáchđể khai báo mảng: – datatype identifier [ ]; – datatype identifier [ ] = new datatype[size]; – datatype identifier [ ]= {value1,value2, .valueN};
  31. Phương thức (Methods in Classes) •Phương thức được định nghĩanhư là mộthànhđộng hoặcmộttácvụ thậtsự của đốitượng • Cú pháp access_specifier modifier datatype method_name(parameter_list) { //body of method }
  32. Ví dụ về sử dụng phương thức class Temp { static int x = 10; // variable public static void show( ) { // method System.out.println(x); } public static void main(String args[ ]) { Temp t = new Temp( ); // object 1 t.show( ); // method call Temp t1 = new Temp( ); // object 2 t1.x = 20; t1.show( ); } }
  33. Access specifiers • public •private •protected
  34. Method Modifiers • static • abstract • final • native • synchronized • volatile
  35. Những phương thức đượcnạpchồng : (Methods Overloading) •Những phương thức đượcnạpchồng : – Cùng ở trong mộtlớp – Có cùng tên – Khác nhau về danh sách tham số •Những phương thức đượcnạpchồng là mộthìnhthức đa hình (polymorphism) trong quá trình biên dịch (compile time)
  36. Ghi đèphương thức (Methods Overriding) •Những phương thức đượcghiđè: – Có mặt trong lớp cha (superclass) cũng như lớpkế thừa (subclass) – Được định nghĩalại trong lớpkế thừa (subclass) •Những phương thức đượcghiđèlàmột hình thức đa hình (polymorphism) trong quá trình thực thi (Runtime)
  37. Phương thứckhởitạo (Class Constructors) •Làmộtphương thức đặcbiệt dùng để khởi tạogiátrị cho các biếnthànhviêncủalớp đốitượng • Có cùng tên vớitênlớp và không có giá trị trả về • Đượcgọikhiđốitượng đượctạora • Có 2 loại: –Tường minh (Explicit constructors) –Ngầm định (Implicit constructors)
  38. Phương thứckhởitạocủalớpdẫnxuất (Derived class constructors) • Cócùngtênvớilớpdẫnxuất (subclass) •Mệnh đề gọi constructor củalớpcha (superclass) phảilàmệnh đề đầutiên trong constructor củalớpdẫnxuất (subclass)
  39. Các toán tử • Các loại toán tử: –Toántử số học (Arithmetic operators) –Toántử dạng Bit (Bitwise operators) –Toántử so sánh (Relational operators) –Toántử logic (Logical operators) –Toántửđiềukiện (Conditional operator) –Toántử gán (Assignment operator)
  40. Toán tử số học Arithmetic Operators + Addition (Phép cộng) - Subtraction (Phép trừ) * Multiplication (Phép nhân) / Division (Phép chia) % Modulus (Lấysố dư) ++ Increment (Tăng dần) Decrement (Giảmdần)
  41. += Phép cộng và gán -= Phép trừ và gán *= Phép nhân và gán /= Phép chia và gán %= Phép lấysố dư và gán
  42. Toán tử Bit (Bitwise Operators) ~Phủđịnh (NOT) &Và(AND) |Hoặc(OR) ^ Exclusive OR >> Dịch sang phải (Shift right) << Dịch sang trái (Shift left)
  43. Toán tử so sánh (Relational Operators) == So sánh bằng != So sánh khác Lớnhơn = Lớnhơnhoặcbằng
  44. Toán tử Logic (Logical Operators ) && Logical AND || Logical OR ! Logical unary NOT
  45. Toán tửđiềukiện (Conditional Operator) • Cú pháp Biểuthức1 ? Biểuthức2 : Biểuthức3; h• Biểut ức1 Điiềukệnkiểu Boolean trả về giá trị True hoặcFalse h• Biểut ức2 Trả về giá trị nếukếtquả củamệnh đề 1 là True •hBiểut ức3 Trả về giá trị nếu kết quả của mệnh đề 1 là
  46. Toán tử gán (Assignment Operator) = Assignment (Phép gán) Giá trị có thểđược gán cho nhiềubiếnsố •Vídụ a = b = c = d = 90;
  47. Thứ tựưutiên của các toán tử Thứ tự Toántử 1. trong ngoặc tính trước 2. Cáctoántửđơnnhư +,-,++, 3. Cáctoántử số họcvà cáctoántử dịch như *,/,+,-, > 4. Cáctoántử quan hệ như >, =,<=,= =,!= 5. Cáctoántử logic và Bit như &&,II,&,I,^ 5. Cáctoántử gánnhư =,*=,/=,+=,-= „ Thứ tự củacáctoántử có thểđượcthayđổibằng cách sử dụng các dấungoặc đơntrongmệnh đề
  48. Các kí tựđịnh dạng xuất dữ liệu (Escape Sequences) Escape Mô tả Sequence \n Xuống dòng mới \r Chuyểncon trỏđến đầu dòng hiệnhành \t Chuyểncon trỏđếnvị trí dừng Tab kế tiếp (ký tự Tab) \\ In dấu\ \’ In dấunháyđơn (’) \’’ In dấu nháy kép (’’)
  49. Các lệnh điềukhiển • Điềukhiểnrẻ nhánh: –Mệnh đề if-else –Mệnh đề switch-case • Vòng lặp (Loops): –Vònglặp while –Vònglặp do-while –Vònglặp for
  50. Lệnh if-else • Cú pháp if (condition) { action1 statements; } else { action2 statements; }
  51. Lệnh switch-case • Cú pháp switch (expression) { case 'value1': action1 statement(s); break; case 'value2': action2 statement(s); break; : : case 'valueN': actionN statement(s); break; df lt df lt ti tt t()
  52. Lệnh lặp while „ Cúpháp while(condition) { action statements; : : }
  53. Lệnh lặp do-while •Cú pháp do { action statements; : : } while(condition);
  54. Vòng lặp for • Cú pháp for(initialization statements; condition; increment statements) { action statements; : : }
  55. Chương 3 Gói & Interface (Packages & Interfaces)
  56. Giới thiệu •Những thành phầncơ bảncủa1 chương trình Java: – Gói (Packages) –Giaodiện (Interfaces) •Những phầncủamộtchương trình Java: –Lệnh khai báo gói(package ) –Lệnh chỉđịnh gói được dùng (Lệnh import) – Khai báo lớp public (một file java chỉ chứa 1 lớp public class) –Cáclớp khác (classes private to the package) •Tập tin nguồn Java có thể chứatấtcả hoặc một vài trong số các phần trên.
  57. Interfaces •Chương trình Java chỉ có thể kế thừatừ 1 lớp duy nhất trong cùng mộtthời điểm, nhưng có thể dẫn xuất cùng lúc nhiều Interfaces • Không đượcphépcónhững phương thứccụ thể (concrete methods) • interface cầnphải đượchiệnthực (implements).
  58. Các bướctạo interface • Định nghĩa Interface •Biêndịch Interface •Hiện thực Interface •Tính chấtcủa interface: – Tấtcả phương thức trong interface phảilà public. – Các phương thứcphải được định nghĩa trong lớpdẫn xuất giao diện đó.
  59. Sử dụng Interface • Không thể dẫn xuất từ lớp khác, nhưng có thể dẫn xuấttừ những interface khác •Nếumột lớp dẫn xuất từ một interface mà interface đódẫn xuất từ các interface khác thì lớp đóphải định nghĩa tất cả các phương thức có trong các interface đó •Khiđịnh nghĩamộtinterfacemớithìmộtkiểu dữ liệu tham chiếucũng đượctạo ra.
  60. Gói (Packages) •Tương tự nhưthư mụclưutrữ những lớp, interface và các gói con khác. Đó là những thành viên của gói
  61. •Những ưu điểm khi dùng gói (Package): – Cho phép tổ chứccáclớpvàonhững đơn vị nhỏ hơn – Giúp tránh được tình trạng trùng lặpkhi đặt tên. – Cho phép bảovệ các lớp đốitượng – Tên gói (Package) có thểđượcdùngđể nhậndạng chức năng của các lớp.
  62. •Những lưuý khitạo gói: –Mã nguồn phảibắt đầubằng lệnh ‘package’ –Mã nguồnphảinằm trong cùng thư mụcmangtên của gói –Tên gói nên bắt đầubằng ký tự thường (lower case) để phân biệtgiữalớp đốitượng và gói –Những lệnh khác phải viết phía dưới dòng khai báo gói là mệnh đề import, kếđếnlàcácmệnh đề định nghĩalớp đốitượng –Những lớp đốitượng trong gói cầnphải đượcbiên dịch – Để chương trình Java có thể sử dụng những gói này, ta phải import gói vào trong mã nguồn
  63. • Import gói (Importing packages): – Xác định tập tin cần được import trong gói – Hoặccóthể import toàn bộ gói
  64. Các bướctạo ra gói (Package) • Khai báo gói • Import những gói chuẩncầnthiết • Khai báo và định nghĩacáclớp đối tượng có trong gói •L ưucácđịnh nghĩa trên thành tập tin .java, và biên dịch những lớp đốitượng đã được định nghĩa trong gói.
  65. Sử dụng những gói do người dùng định nghĩa (user-defined packages) • Mã nguồncủanhững chương trình này phải ở cùng thư mụccủa gói do người dùng định nghĩa. • Để những chương trình Java khác sử dụng những gói này, import gói vào trong mã nguồn • Import những lớp đốitượng cần dùng • Import toàn bộ gói •Tạo tham chiếu đếnnhững thành viên của gói
  66. Xác lập CLASSPATH • Là danh sách các thư mục, giúp cho việc tìm kiếmcáctập tin lớp đốitượng tương ứng •Nênxáclập CLASSPATH trong lúc thực thi (runtime), vì như vậynósẽ xác lập đường dẫn cho quá trình thựcthi hiện hành
  67. Gói và điềukhiểntruyxuất (Packages & Access Control)
  68. Gói java.lang •Mặc định thì bấtcứ chương trình Java nào cũng import gói java.lang l•Nhớ ững p Wrapper (bao bọc) cho các kiểudữ liệu nguyên thủy:
  69. Lớp String •Phương thứckhởitạo (Constructor): – String str1 = new String(); – String str2 = new String(“Hello World”); – char ch[ ] = {“A”,”B”,”C”,”D”,”E”}; – String str3 = new String(ch); – String str4 = new String(ch,0,2);
  70. String Pool • ‘String Pool’ đạidiệnchotấtcả các ký tựđượctạoratrongchương trình • Khái niệm ‘String Pool’
  71. Những phương thứccủalớp String • charAt( ) • startsWith() • endsWith( ) • copyValueOf( ) • toCharArray( ) • indexOf( ) • toUpperCase( ) • toLowerCase( ) • trim( ) • equals( )
  72. Lớp StringBuffer •Cungcấpnhững phương thức khác nhau để thao tác trên đốitượng string (chuỗikýtự) •Những đốitượng củalớpnàykhálinhhoạt •Cungcấpnhững phương thứckhởitạo (constructor) đã đượcnạpchồng (overloaded) •Nh ững phương thứccủalớp StringBuffer: – append( ) – insert( ) – charAt( ) – setCharAt( ) – setLength( ) – getChars( ) – reverse( )
  73. Lớp java.lang.Math • abs() • random() • ceil() • sqrt() • floor() • sin() • max() • cos() • min() • tan() • round()
  74. Lớp Runtime • Đóng gói (Encapsulates) môi trường thựcthi •Dùngđể quảnlýbộ nhớ, và thi hành những tiếntrìnhcộng thêm •Phương thức: – exit(int) – freeMemory( ) – getRuntime( ) – gc( ) – totalMemory( ) – exec(String)
  75. Lớp System •Cungcấpnhững hạ tầng chuẩnnhư nhập (Input), xuất (Output) và các luồng lỗi(Error Streams) •Cungcấpkhả năng truy xuất đếnnhững thuộctínhcủahệ thống thực thi Java, và những thuộc tính môi trường như phiên bản, đường dẫn, nhà cung cấp •Ph ương thức: – exit(int) – gc() – getProperties() – setProperties() – currentTimeMillis() arraCopy(Object int Object int int)
  76. Lớp Class •Thể hiện (Instance) củalớp này che giấu tình trạng thựcthicủa đốitượng trong một ứng dụng Java • Đốitượng hoặcthể hiệncủalớp này có thể tạorabằng 1 trong 3 cách sau: –Sử dụng phương thức getClass( ) của đốitượng –Sử dụng phương thứctĩnh forName( ) củalớp để tạoramộtthể hiện củalớp đó trong lúc đặttên cho lớp –Sử dụng đốitượng ClassLoader để nạpmộtlớp mới
  77. Lớp Object •Làlớp cha (superclass) củatấtcả các lớp •Phương thức: – equals(Object) – finalize() – notify() – notifyAll() – toString() – wait()
  78. Gói java.util • Cung cấpphầnlớnnhững lớp Java hữudụng và thường xuyên cần đến trong hầuhếtcácứng dụng •Gi ớithiệunhững lớptrừutượng sau: – Hashtable – Random – Vector – StringTokenizer
  79. Lớp Hashtable •Mở rộng lớptrừutượng Dictionary • Dùng để nốikếtnhững khóa vào những giá trị cụ thể •Phương thứckhởitạo Hashtable: – Hashtable(int) – Hashtable(int, float) – Hashtable( )
  80. Những phương thứccủalớp Hashtable • clear() • keys() • done() • put(Object, Object) • contains(Object) • rehash() • containsKey(Obj • remove(Object ect) key) • elements() • size() • get(Object key) • toString() • isEmpty()
  81. Lớp Random •Tạoranhững số ngẫu nhiên theo thuật toán pseudo •Những phương thứcnhậngiátrị ngẫu nhiên: – nextDouble( ) – nextFloat( ) – nextGaussian( ) – nextInt( ) – nextLong( ) •Phương thứckhởitạo(Constructors): – random() – random(long)
  82. Những phương thứccủalớp Random • nextDouble() • nextFloat() • nextGaussian() • nextInt() • nextLong() • setSeed(long)
  83. Lớp Vector •Cungcấpkhả năng co giảnchomảng khi thêm phầntử vào mảng r•Lưutữ những thành phầncủakiểu Object •Một Vector riêng rẽ có thể lưutrữ những phầntử khác nhau, đólànhững instance của những lớp khác nhau •Phương thứckhởitạo (Constructors): – Vector(int) – Vector(int, int) – Vector()
  84. Những phương thứccủalớp Vector • addElement(Object) • isEmpty( ) • capacity( ) • lastElement( ) • clone( ) • lastIndexOf(Object) • contains(Object) • lastIndexOf(Object, • copyInto(Object [ ]) int) • elementAt(int) • removeAllElements( ) • elements( ) • removeElement(Obj • ensureCapacity(int) ect) • firstElement( ) • removeElementAt(in • indexOf(Object) t) • indexOf(Object, int) • setElementAt(Object • insertElementAt(Objec , int) )
  85. Lớp StringTokenizer •Cóthểđược dùng để tách mộtchuỗithành những thành phầncấuthànhcủanó (constituent tokens) •Kýtự phân cách có thểđượcchỉđịnh khi một đốitượng StringTokenizer đượckhởi tạo •Ph ương thứckhởitạo (Constructors): – StringTokenizer(String) – StringTokenizer(String, String) – StringTokenizer(String, String, Boolean) •Lớp StringTokenizer sử dụng giao diệnliệt kê (enumeration interface)
  86. Những phương thứccủalớp StringTokenizer • countTokens( ) • hasMoreElements( ) • hasMoreTokens( ) • nextElement( ) • nextToken( ) • nextToken(String)
  87. Chương 4 Xử lý biệtlệ
  88. Giới thiệuvề biệtlệ •Làmộtkiểulỗi đặcbiệt •Nóxảy ra trong thờigianthựcthiđoạnlệnh • Thông thường các điềukiệnthựcthichương trình gây ra biệt lệ •Nếucácđiềukiện này không được quan tâm, thì việcthựcthicóthể kếtthúc đột ngột
  89. Mục đích củaviệcxử lý biệt lệ •Giảmthiểuviệc kết thúc bất thường của hệ thống và của chương trình. •Vídụ, thao tác xuất/nhậptrongmộttậptin, nếu việc chuyển đổikiểudữ liệu không thựchiện đúng, một biệt lệ sẽ xảy ra và chương trình bị hủy mà không đóng tậptin. Lúcđótập tin sẽ bị hư hại và các nguồn tài nguyên được cập phát cho tập tin không được thu hồi lại cho hệ thống.
  90. Xử lý biệt lệ •Khimộtbiệt lệ xảyra, đối tượng tương ứng với biệt lệ đósẽ được tạo ra. • Đốitượng này sau đó đượctruyềntớiphương thức nơimàbiệt lệ xảyra. • Đốitượng này chức các thông tin chi tiếtvề biệt lệ. Thông tin này có thể nhận đượcvàxử lý. •Lớp ’throwable’ mà Java cung cấplàlớptrênnhất củalớpbiệt lệ.
  91. Mô hình xử lý biệt lệ •Môhìnhđượcbiết đếnlàmôhình‘catch and throw’ •Khimộtlỗixảy ra, biệt lệ sẽ đuợc chặn và được vào một khối. •Từ khóa để xử lý biệt lệ: – try – catch – throw – throws – finally
  92. Cấutrúccủamôhìnhxử lý biệt lệ • Cú pháp try { . } catch(Exception e1) { . } catch(Exception e2) { . } catch(Exception eN) { . } finally { . }
  93. Mô hình ‘Catch and Throw’ nâng cao •Ngườilậptrìnhchỉ quan tâm tớicáclỗi khi cầnthiết. •M ột thông báo lỗicóthể đượccungcấp trong exception-handler.
  94. Khối ‘try’ và ‘catch’ • Đượcsử dụng để thực hiện trong mô hình ‘catch and throw’ của xử lý biệt lệ. •Khốilệnh ‘try’ gồm tập hợp các lệnh thực thi •Mh ộtp ương thứcmàcóthể bắtbiệt lệ,cũng bao gồm khối lệnh ‘try’. •Mo ộthặc nhiềukhốilệnh ‘catch’ có thể tiếp theo sau một khối lệnh ‘try’ •Khốilệnh ‘catch’ này bắtbiệt lệ trong khối lệnh ‘try’.
  95. Khốilệnh ‘try’ và ‘catch’ Blocks (tt) • Để bắtbấtkỳ loạibiệt lệ nào, ta phảichỉ ra kiểu biệt lệ là ‘Exception’ catch(Exception e) • Khi biệt lệ bị bắt không biếtthuộckiểu nào, chúngtacóthể sử dụng lớp ‘Exception’ để bắt biệt lệ đó. •Lỗisẽ đượctruyền thông qua khốilệnh ‘try catch’ cho tới khi chúng bắtgặpmột‘catch’ tham chiếutới nó, hoặcchương trình sẽ bị kết thúc
  96. Khốilệnh chứanhiềuCatch •Cáckhốichứa nhiều ‘catch()’ xử lý các kiểubiệt lệ khác nhau mộtcáchđộclập. •Vídụ try { doFileProcessing(); displayResults(); } catch(LookupException e) { handleLookupException(e); } catch(Exception e) { System.err.println(“Error:”+e.printStackTrace ()) }
  97. Khối lệnh chứa nhiều Catch (tt) •Khisử dụng các ‘try’ lồng nhau, khối ‘try’ bên trong được thi hành đầu tiên •Bấtkỳ biệt lệ nào bị chặn trong khối lệnh ‘try’ sẽ bị bắtgiữ trong khốilệnh ‘catch’ tiếp ngay sau. •Nếukhốilệnh ‘catch’ thích hợp không được tìm thấy, thì các khối ‘catch’ củakhối‘try’bên ngoài sẽ đượcxemxét •Ngượclại, Java Runtime Environment sẽ xử lý biệt lệ.
  98. Khối ‘finally’ •Thựchiệntấtcả các việc thu dọn khi biệt lệ xảy ra •Cóthể sử dụng kếthợpvớikhối ‘try’ •Chứacáccâulệnh thu hồi tài nguyên về cho hệ thống hay lệnh in ra các câu thông báo: – Đóng tậptin – Đóng lạibộ kếtquả (đượcsử dụng trong chương trình cơ sở dữ liệu) – Đóng lạicáckếtnối đượctạotrongcơ sở dữ liệu.
  99. Khối ‘finally’ (tt) •Vídụ try { doSomethingThatMightThrowAnException( ); } finally { cleanup( ); }
  100. Khối ‘finally’ (tt) •Làtùychọn không bắtbuộc • Được đặtsaukhối‘catch’ •Kh ối ‘finally’ bảo đảmlúcnàocũng đượcthực hiệnbấtchấpbiệt lệ có xảy ra hay không.
  101. Các biệt lệ được định nghĩavới lệnh ‘throw’ và ‘throws’ • Các biệt lệ thì đượcchặnvớisự trợ giúp củatừ khóa ‘throw’ •Từ khóa ‘throw’ chỉ ra mộtbiệt lệ vừaxảyra. • Toán hạng của throw là một đốitượng củamột lớp, mà lớpnàyđượcdẫnxuấttừ lớp ‘Throwable’ •Vídụ củalệnh ‘throw’ try{ if (flag < 0) { throw new MyException( ) ; // user- defined } }
  102. Các biệt lệ được định nghĩa với lệnh ‘throw’ và ‘throws’(tt) •Mộtphương thức đơncóthể chặnnhiềuhơnmột biệt lệ •Vídụ từ khóa ‘throw’ xử lý nhiềubiệt lệ public class Example { public void exceptionExample( ) throws ExException, LookupException { try { // statements } catch(ExException exmp) { . } catch(LookupException lkpex) { . } } }
  103. Các biệt lệ được định nghĩa với lệnh ‘throw’ và ‘throws’(tt) •Lớp ‘Exception’ thực thi giao diện ‘Throwable’ và cung cấp các tính năng hữu dụng để phân phối cho các biệt lệ. •Mộtlớp con củalớp Exception là một biệt lệ mớicóthể bắtgiữ độclậpcácloại Throwable khác.
  104. Danh sách các biệt lệ • RuntimeException • ArithmeticException • IllegalAccessException • IllegalArgumentException • ArrayIndexOutOfBoundsException • NullPointerException • SecurityException • ClassNotFoundException
  105. Danh sách các biệt lệ (tt) • NumberFormatException • AWTException • IOException • FileNotFoundException • EOFException • NoSuchMethodException • InterruptedException
  106. Chương V LẬP TRÌNH GIAO DIỆN VỚI AWT
  107. GIỚI THIỆU VỀ AWT •AWTviết tắt của Abstract Windowing Toolkit •AWTlàtập hợp các lớp Java cho phép chúng ta tạo một GUI • Cung cấp các mục khác nhau để tạo hoạt động và hiệu ứng GUI như – Containers – Components – Layout managers – Graphics và drawing capabilities – Fonts – Events
  108. • AWT bao gồm các lớp, interfaces và các gói khác
  109. Components •Tất cả các thành phần cấu tạo nên chương trình GUI được gọi là component. d• Ví ụ – Containers, – textfields, labels, checkboxes, textareas – scrollbars, scrollpanes, dialog
  110. Containers • Là thành phần mà có thể chứa các thành phần khác. có thể vẽ và tô màu. • Có các frames, panes,latches, hooks • Java.awt chứa một lớp có tên là Container. Lớp này dẫn xuất trực tiếp và không trực tiếp theo 2 cách là: – Frames – Panels
  111. Frames •Làcác cửa sổ •Làlớpconcủa Windows • Được hiển thị trong một cửa sổ và có đường viền
  112. Panels • Là các vùng chứa trong một cửa sổ. •Hiển thị trong một cửa sổ mà trình duyệt hoặc appletviewer cung cấp và không có đường viền. • Được sử dụng để nhóm một số các thành phần •Một panel không có sẳn vì thế chúng ta cần phải thêm nó vào frame. •Hàm dựng – Panel()
  113. Dialog •Làmột lớpconcủa lớp Window • Đối tượng dialog được cấu trúc như sau : Frame myframe = new Frame(“My frame”); String title = “Title”; boolean modal = true; Dialog dlg = new Dialog( myframe, title, modal);
  114. Các Components khác • Ví dụ – textfields, labels, checkboxes, textareas – scrollbars, scrollpanes, dialog
  115. Label • Được dùng để hiển thị chuỗi (String) • Các hàm dựng: – Label( ) – Label(String labeltext) – Label(String labeltext, int alignment) • Các phương thức: – setFont(Font f) – setText(String s) – getText( )
  116. TextField •Làđiềukhiển text cho phép hiểnthị text hoặc cho user nhậpdữ liệu vào. • Các hàm dựng: – TextField( ) – TextField(int columns) – TextField(String s) – TextField(String s, int columns) • Các phương thức: – setEchoChar(char) – setTest(String s) – getText( ) – setEditable(boolean) – isEditable( )
  117. TextArea • Được dùng khi text có nội dung từ hai dòng trở lên •Làđiềukhiểntext cóthể soạnthảo đượcvới nhiều dòng •Cácbước để tạo TextArea: – Tạomộtphầntử (element) – Chỉ ra số dòng hay số cột(tùychọn) – Chỉ ra vị trí của điềukhiểntrênmànhình
  118. TextArea (tt ) • Các hàm dựng: – TextArea( ) – TextArea(int rows, int cols ) – TextArea(String text) – TextArea(String text, int rows, int cols)
  119. Các phương thức của TextArea • setText(String) • getText( ) • setEditable(boolean) • isEditable( ) • insertText(String, int) • replaceText(String, int, int)
  120. Button • Các nút Push hay Command là cách dễ nhất để lấycácsư kiện củauser •Cácbước để tạo button: – Tạomộtphầntử button, nên tạo cho nó một caption để chỉ ra mục đích củanó – Chỉ ra vị trí đặt button trên màn hình – HIển thị ra trên màn hình • Các hàm dựng: – Button( ) – Button(String text)
  121. Checkboxes and RadioButtons • Checkboxes được dùng khi cho phép user nhiềucọn chọnlựa • Radiobuttons được dùng để user chỉ ra mộtlựachọn duy nhất •Cácbước để tạo checkbox hoặc radiobutton: – Tạomộtphầntử (element) – Khởitạogiátrị ban đầu(cógiátrị selected hay unselected) – Chỉ ra vị trí trên màn hình – Hiểnthị ra màn hình •Cáchàmdựng để tạo checkbox: – Checkbox( ) – Checkbox(String text) • Để tạo radiobutton, ta phảitạo đốitượng CheckBoxGroup trướckhitạo button
  122. Choice Lists •Lớ p ‘Choice’ cho phép ta tạo danh sách có nhiều chọnlựa • Khi list đượctạolần đầutiên, nóđượckhởitạolà empty •Cácbước để tạo danh sách chọnlựa: –Tạo mộtphầntử –Thêmcácmục (có kiểu Strings) vào danh sách đó, từng mụcmột v–Chỉ ra ị trí trên màn hình –Hih ểnt ị ra màn hình •Vídụ Choice colors=new Choice( ); colors.addItem(“Red”); colors.addItem(“Green”);
  123. Trình quản lý bố trí Layout Manager • Các loại layout khác nhau: – Flow Layout – Border Layout – Card Layout – Grid Layout – GridBag Layout •Trìnhquảnlýlayout được thiết lập bằng cách gọi phương thức ‘setLayout( )’
  124. FlowLayout •Làtrìnhquản lý layout mặc định cho các applet và các panel •Với FlowLayout các thành phầnsẽ được xắpxếptừ góc trái trên đếngócphảidưới của màn hình • Các constructor: FlowLayout mylayout = new FlowLayout(); FlowLayout exLayout = new flowLayout(FlowLayout.RIGHT);
  125. BorderLayout • Là trình quản lý layout mặc định cho Window, Frame và Dialog • Trình quản lý này có thể xắp xếp đến5 thành phần trong container • Các thành phầncóthể được đặtvào5 hướng NORTH, EAST, SOUTH, WEST và CENTER của container •d Ví ụ: Để thêm một thành phần vào vùng North của container Button b1= new Button(“North Button”); setLayout(new BorderLayout( )); add(b1, BorderLayout.NORTH);
  126. CardLayout •Cóthể lưutrữ một danh sách các kiểu layout khác nhau •M ỗi layout được xem như mộtthẻ (card) •Thẻ thường là đối tượng Panel •Một thành phần độclậpnhư button sẽ điều khiển các thẻ được đặt ở phía trên nhất •Cácbước để tạo CardLayout: – Bố trí layout của panel chính là CardLayout – Lần lượt thêm các panel khác vào panel chính
  127. GridLayout •Hỗ trợ việc chia container thành một lưới • Các thành phần đượcbố trí trong các dòng và cột •Mộtô lưới nên chứaítnhấtmột thành phần •Kiểu layout này được sử dụng khi tấtcả các thành phầncócùngkíchthước • Hàm constructor GridLayout gl = new GridLayout(no. of rows, no. of columns);
  128. GridBagLayout •Bố trí các thành phầnmột cách chính xác • Các thành phần không cầncócùngkích thước • Các thành phần đượcxắpxếp trong một lưới chứa các dòng và các cột •Thứ tự đặt các thành phần không tuân theo hướng từ trái-sang-phải và trên- xuống-dưới • Hàm constructor GridBagLayout gb = new GridBagLayout( );
  129. GridBagLayout • Để sử dụng layout này, bạncầnphải biết thông tin về kích cỡ và cách bố trí của các thành phần •Lớp ‘GridBagLayoutConstraints’ lưutrữ tấtcả các thông tin mà lớp GridLayout yêu cầu: Vị trí và kích thuớc mỗi thành phần
  130. Xử lý các sự kiện •Cácsự kiện (Events) đượcxử lý bằng các công cụ sau: – Abstract Windowing Toolkit – Trình duyệt. – Các trình xử lý sự kiệndo cáclập trình viên tạo riêng. •Cácứng dụng cần đăng ký trình xử lý sự kiện với đối đốitượng • Các trình xử lý này đượcgọikhicómộtsự kiệntương ứng xảyra
  131. Xử lý các sự kiện (tt ) • Event Listener sẽ lắng nghe mộtsự kiệncụ thể mà một đốitượng tạo ra •M ỗi event listener cung cấp các phương thức để xử lý các sự kiệnnày •L ớpcócài đặt listener cần định nghĩanhững phương thức này
  132. Xử lý các sự kiện(tt ) •Cácbướccần tuân thủđểsử dụng mô hình Event Listener: – Cài đặt Listener tương ứng – Nhậndiện đượctấtcả các thành phầntạorasự kiện – Nhậndiện đượctấtcả các sự kiện đượcxử lý – Cài đặt các phương thứccủa listener, và viếtcác đoạnmãđể xử lý sự kiện trong các phương thức đó • Interface định nghĩa các phương thức khác nhau để xử lý mỗi sự kiện
  133. Các sự kiệnvàListener tương ứng • ActionEvent „ ActionListener • AdjustmentEvent „ AdjustmentListener • ComponentEvent „ ComponentListener • FocusEvent „ FocusListener • ItemEvent „ ItemListener • WindowEvent „ WindowListener • TextEvent „ TextListener • MouseEvent „ MouseListener „ MouseMotionListener •KeyEvent „ KeyListener
  134. Menus • Các loại menu : – Pull-down – Pop-up menu •Chỉ có thể đặt các thanh menubar vào trong các Frame mà thôi • Các thành phầncủa menu: – Menubar – MenuItems
  135. Chương VI Applets
  136. Applets •Làmộtchương trình Java mà chạyvới sự hổ trợ của trình duyệtweb •Tấtcả các applets là lớp con của lớp ‘Applet’ • Để tạomột applet, bạncần import hai gói sau: – java.applet – java.awt
  137. Cấutrúcapplet • Định nghĩa một applet từ bốnsự kiệnxảy ra trong quá trình thựcthi • Đốivớimỗisự kiện được định nghĩa bởi một phương thứctương ứng. • Các phương thức: – init( ) – start( ) – stop( ) – destroy( )
  138. • Các phương thức khác: – paint( ) – repaint( ) – showStatus( ) – getAppletInfo( ) • Các phương thức init(), start(), stop(), destroy(), and paint() được thừa kế từ applet. h•Mỗip ương thức này mặc định là rỗng. Vì thế các phương thức này phải đượcnạpchồng.
  139. Biên dịch và thực thi applet •Một applet thì đượcbiêndịch theo cú pháp sau javac Applet1.java • Để thựcthimột applet, tạomộttậptin HTML có sử dụng thẻ applet –Thẻ applet có hai thuộctính: • Width • Height – Để truyềnthamsố tới applet, sử dụng thẻ ‘param’, và tiếp theo là thẻ ‘value’ • Applet có thể đượcthựcthibằng applet viewer
  140. Điểmkhácbiệtgiữa applet và một ứng dụng • Các ứng dụng khi thực thi phải sử dụng trình biên dịch Java, trong khi các applets thựcthiđược trên bất kỳ trình duyệt nào mà hổ trợ Java, hoặc sử dụng ‘AppletViewer’ trong JDK. •Một ứng dụng bắt đầuvớiphương thức ‘main()’. Còn đối với applet thì không sử dụng phương thức này •Một ứng dụng sử dụng ‘System.out.println()’ để hiểnthị, trong khi môt applet thì sử dụng phương thức ‘drawstring()’ để hiểnthị.
  141. Những hạnchế về bảo mật trong applet • Không thể đọchoặcviếtcác tập tin trên hệ thống tập tin củangườisử dụng • Không thể giao tiếp với một site trên internet. Mà chỉ giao tiếp với một dịch vụ trên trang web có applet. • Không thể chạybấtkỳ chương trình nào trên hệ thống củangười đọc • Không thể load bấtkỳ chương trình nào đượclưutrênhệ thống củangườisử dụng
  142. Chu trình sống củaapplet
  143. Truyền tham số tớimột applet • Để truyền tham số, sử dụng PARAM trong thẻ HTML •Vídụ
  144. Lớp đồ họa • Đượccungcấpbởi gói AWT •Cungcấpmộttậphợp các phương thức để vẽ như sau: –Oval – Rectangle – Square –Circle –Lines – Text in different fonts
  145. Graphical Background • Các phương thức để vẽ nền: – getGraphics( ) – repaint( ) – update(Graphics g) – paint(Graphics g)
  146. Hiểnthị chuổi, ký tự và bytes •Phương thức để vẽ hoặchiểnthị mộtchuổi trên frame Cú pháp – drawString(String str, int xCoor, int yCoor); •Phương thức để vẽ hoặchiểnthị các ký tự trên frame Cú pháp – drawChars(char array[ ], int offset, int length, int xCoor, int yCoor); •Phương thức để vẽ hoặchiểnthị bytes trên frame Cú pháp – drawBytes(byte array[ ], int offset, int length, int xCoor, int yCoor);
  147. Vẽ các hình thể •Phương thức đượcsử dụng để vẽ đường thẳng như sau Cú pháp – drawLine(int x1, int y1, int x2, int y2); • Các phương thức đượcsử dụng để vẽ đường tròn như sau Cú pháp – drawOval(int xCoor, int yCoor, int width, int height); – setColor(Color c); – fillOval(int xCoor, int yCoor, int width, int height);
  148. •Phương thứcsử dụng để vẽ hình vuông: Cú pháp – drawRect(int xCoor, int yCoor, int width, int height); – fillRect(int xCoor, int yCoor, int width, int height); • Các phương thức đượcsử dụng để vẽ hình vuông có góc tròn Cú pháp – drawRoundRect(int xCoor, int yCoor, int width, int height, int arcWidth, int arcHeight); – fillRoundRect (int xCoor, int yCoor, int width, int height, int arcWidth, int arcHeight);
  149. 3D Rectangles & Arcs • Các phương thức đượcsử dụng để vẽ hình 3D Cú pháp – draw3DRect(int xCoord, int yCoord, int width, int height, boolean raised); – drawArc(int xCoord, int yCoord, int width, int height, int arcwidth, int archeight); – fillArc(int xCoord, int yCoord, int width, int height, int arcwidth, int archeight);
  150. Drawing PolyLines • Các phương thức đượcsử dụng để vẽ nhiều đượcthẳng Cú pháp – drawPolyline(int xArray[ ], int yArray[ ], int totalPoints); – g.setFont(new Font("Times Roman", Font.BOLD,15));
  151. Vẽ và tô các hình đagiác • Các phương thức để vẽ và tô các hình đa giác Cú pháp – drawPolygon(int x[ ], int y[ ], int numPoints); – fillPolygon(int x[ ], int y[ ], int numPoints);
  152. Màu • Java sử dụng màu RGB •Bảng các giá trị màu Element Range Red 0-255 Green 0-255 Blue 0-255 „ Cú pháp củahàmdựng để tạomộtmàu color(int red, int green, int blue);
  153. •Bảng trình bày các giá trị màu RGB thôn thường Color Red Green Blue White 255 255 255 Light Gray 192 192 192 Gray 128 128 128 Dark Gray 64 64 64 Black 0 0 0 Pink 255 175 175 Orange 255 200 0 Yellow 255 255 0 Magenta 255 0 255
  154. Font • Gói java.awt package cung cấpbởilớp ‘Font’ • Các phương thứccủalớpFont: – getAllFont( ) – getLocalGraphicsEnvironment( ) – getFont( ) – getFontList( )
  155. •Hàmdựng Font nhận 3 tham số – Tên font trong chuổi định dạng; tên này có trong phương thức getFontList( ). – Kiểucủa font. Ví dụ như: Font.BOLD, Font.PLAIN, Font.ITALIC – Kích thướccủa font. •Vídụ Font f1 = new Font("SansSerif", Font.ITALIC, 16); g.setFont(f1);
  156. Lớp FontMetrics • Đolườngcáckýtự khác nhau hiểnthị trong các font khác nhau. •Việc đolường bao gồm ‘height’, ‘baseline’, ‘ascent’, ‘descent’ và ‘leading’ của font. • Nókhôngcụ thể vì nó là mộtlớptrừutượng
  157. Lớp FontMetrics (tiếp theo ) •Phương thức: – getFontMetrics(f1) – getHeight( ) – getAscent( ) – getDescent( ) – getLeading( ) – getName( )
  158. Kiểuvẽ •Cácđốitượng để vẽ đượcsử dụng. • Method used to make old and new contents visible on the screen setXORMode(Color c) • Method used to revert to the overwrite mode setPaintMode( )
  159. Chương VII Lập trình đa tuyến
  160. Tuyến •Lập trình đatuyến là một đặc trưng của Java •Tuyến là đơn vị nhỏ nhất của đoạn mã có thể thi hành được mà thực hiện một công việc riêng biệt
  161. Đa tuyến •Làkhả năng làm việc với nhiều tuyến • Đa tuyến chuyên sử dụng cho việc thực thi nhiều công việc đồngthời • Đa tuyến giảm thời gian rỗi của hệ thống đến mức thấp nhất.
  162. Tạo và quản lý tuyến (1) •Khi chương trình Java thực thi hàm main() tức là tuyến main được thực thi. Tuyến này được tạo ra một cách tự động. tại đây : -Các tuyến con sẽ được tạo ra từ đó -Nólàtuyến cuối cùng kết thúc việc thực hiện. Trong chốc lát tuyến chính ngừng thực thi, chương trình bị chấm dứt •Tuyến có thể được tạo ra bằng 2 cách: – Dẫn xuất từ lớp Thread – Dẫn xuất từ Runnable.
  163. Vòng đời của một tuyến
  164. Trạng thái của tuyến và các phương thức của lớp tuyến • trạng thái: • Phương thức: – born – start( ) – ready to run – sleep( ) – running – wait( ) – sleeping – – waiting notify( ) – ready – run( ) – blocked – stop( ) – dead
  165. Các phương thức Khác • enumerate(Thread t) • getName( ) • isAlive( ) • getPriority( ) • setName(String name) • join( ) • isDaemon( ) • setDaemon(Boolean on) • resume( ) • sleep( ) • start( )
  166. Phân chia thời gian giữa các tuyến •CPUchỉ thực thi chỉ một tuyến tại một thời điểm nhất định. •Các tuyến có độ ưu tiên bằng nhau thì được phân chia thởi gian sử dụng bộ vi xử lý.
  167. tuyến Daemon(ngầm) •Haikiểutuyếntrongmộtchương trình Java: –Các tuyến người sử dụng – tuyến ngầm •tuyến ngầm dọn rác
  168. Đa tuyến với Applets •Cácchương trình Java dựa trên Applet thường sử dụng nhiềuhơnmộttuyến • Trong đatuyếnvới Applets, Lớp ‘java.applet.Applet’ là lớp con đượctạora một Applet ngườisử dụng đã định nghĩa • nó không thể thực hiện được trực tiếp lớpcon của lớp tuyến trong các applet • Con đường để lớp con sử dụng lớptuyến: – Sử dụng một đốitượng củatuyếnngườisử dụng định nghĩa, mà, lầnlượt, dẫnxuấtlớptuyến – Thực thi chạy giao tiếp (interface)
  169. Sựđồng bộ tuyến •Thâmnhập các tài nguyên/dữ liệubởi nhiềutuyến ồ•Sựđ ng bộ (Synchronization) •Sự quan sát (Monitor) • Mutex
  170. Mã đồng bộ • Để thâm nhậpsự quan sát của một đối tượng, lập trình viên sử dụng từ khóa ‘synchronized’ để gọimộtphương thức hiệuchỉnh (modified method) • Khi một tuyến đang được thực thi trong phạmvimột phương thức đồng bộ (synchronized), bất kỳ tuyến khác hoặc phương thức đồng bộ khác mà cố gắng gọi nó trong thời gian đósẽ phải đợi
  171. Khuyết điểmcủa các phương thức đồng bộ •Các trạng thái chắc chắn không lợi ích cho đa tuyến • Trình biên dịch Java từ Sun không chứa nhiều phương thức đồng bộ • Các phương thức đồng bộ chậm hơn từ ba đến bốn lầnsovới các phương thức tương ứng không đồng bộ.
  172. Kỹ thuật “wait-notify” (đợi– thông báo) (1) •tuyến chia các tác vụ thành các đơn vị riêng biệt và logic (hợp lý) • Để tránh trường hợp kiểm soát vòng, Java bao gồm một thiết kế tốt trong tiến trình kỹ thuật truyền thông sử dụng các phương thức “wait()” (đợi), “notify()” (thông báo) và “notifyAll()” (thông báo hết) : – wait( ) – notify( ) – notifyAll( )
  173. Kỹ thuật “wait-notify” (đợi– thông báo) (1) •Các chức năng của các phương thức “wait()”, “notify()”, và “notifyAll()” là : – wait( ) – notify( ) – notifyAll( ) •tuyến ưutiêncaonhấtchạy đầu tiên • Cú pháp củacácphương thức: – final void wait( ) throws IOException – final void notify( ) – final void notifyAll( )
  174. Một số điểm cần nhớ trong khi sử dụng phương thứcwait(): •tuyến đang gọi đưa vào CPU •tuyến đang gọi đưa vào khóa •tuyến đang gọi đi vào vùng đợi của monitor
  175. Các điểm chính cần nhớ về phương thức notify() •Một tuyến đưa ra ngoài vùng đợi của monitor, và vào trạng thái sẵn sàng •tuyến mà đã được thông báo phải thu trở lại khóa của monitor trước khi nó có thể bắt đầu •Phương thức notify() là không chính xác • Trong một số trường hợp này, các phương thức của monitor đưa ra 2 sự đề phòng: – Trạng thái của monitor sẽ được kiểm tra trong một vòng lặp “while” tốt hơn là câu lệnh if – Sau khi thay đổi trạng thái của monitor, phương thức notifyAll() sẽ được sử dụng, tốt hơn phương thức notify().
  176. Sự bế tắt (Deadlocks) •Một “deadlock” (sự bế tắt) xảy ra khi hai tuyến có một phụ thuộc vòng quanh trên một cặp đối tượng đồng bộ •Nókhó để gỡ lỗi một bế tắt bởi những nguyên nhân sau: – Nó hiểm khi xảy ra, khi hai tuyến chia nhỏ thời gian trong cùng một con đường – Nó có thể bao hàm nhiều hơn hai tuyến và hai đối tượng đồng bộ •Nếu một chương trình đa tuyến khóa kín thường xuyên, ngay lập tức kiểm tra lại điều kiệnbế tắt
  177. Thu dọn “rác” (Garbage collection) •Cải tạo hoặc làm trống bộ nhớ đã định vị cho các đối tượng mà các đối tượng này không sử dụng trong thời gian dài •Sự dọn rác thực thi như là một tuyến riêng biệt có quyền ưu tiên thấp •Sử dụng câu lệnh sau để tắt đi sự dọn rác trong ứng dụng: java –noasyncgc
  178. Phương thức finalize() (hoàn thành) • Java cung cấp mộtcon đường để làm sạch một tiến trình trước khi điều khiển trở lại hệ điều hành •Phương thức finalize(), nếu hiện diện, sẽ được thực thi trên mỗi đối tượng, trước khi sự dọn rác •Câu lệnh của phương thức finalize() như sau : – protected void finalize( ) throws Throwable • Tham chiếu không phải là sự dọn rác; chỉ các đối tượng mới được dọn rác
  179. Chương VIII Các luồng I/O
  180. Các luồng •Các luồng là những đường ống dẫn để gửi và nhận thông tin trong các chương trình java. •Khi một luồng đọc hoặc ghi , các luồng khác bị khoá. •Nếu lỗi xẩy ra trong khi đọc hoặc ghi luồng, một ngoại lệ sẽ kích hoạt. •Lớp ‘java.lang.System’ định nghĩa luồng nhập và xuất chuẩn.
  181. Các lớp luồng I/O •Lớp System.out. •Lớp System.in. •Lớp System.err.
  182. Lớp InputStream •Làlớp trừu tượng • Định nghĩa cách nhận dữ liêu • Cung cấp số phương thức dùng để đọc và các luồng dữ liệu làm đầu vào. • Các phương thức: – read( ) – available( ) – close ( ) – mark ( ) – markSupported( ) – reset( ) – skip( )
  183. Lớp OutputStream •Làlớp trừu tượng. • Định nghĩa cách ghi dữ liệu vào luồng. • Cung cấp tập các phương thức trợ giúp. trong việc tạo, ghi và xử lý các luồng xuất. • Các phương thức: – write(int) – write(byte[ ]) – write(byte[ ], int, int) – flush( ) – close( )
  184. Nhập mảng các Byte •Sử dụng các đệm bộ nhớ •Lớp ByteArrayInputStream •Tạo ra một luồng nhập từ đệm bộ nhớ không gì cả về mảng các byte. – Không hỗ trợ các phương thức mới – Các phương thức nộp chồng của lớp InputStream, giống như ‘read()’, ‘skip()’, ‘available()’ và ‘reset()’.
  185. Byte Array Output •sử dụng các vùng đệm bộ nhớ •Lớp ByteArrayOutputStream –Tạo ra một luồng kết xuất trên mảng byte – Cung cấp các khả năng bổ sung cho mảng kết xuất tăng trưởng nhằm chừa chổ cho dữ liệu mới ghi vào. –Cũng cung cấp các phương thức để chuyển đổi luồng tới mảng byte, hay đối tượng String.
  186. •Phương thức của lớp ByteArrayOutputStream : – reset( ) – size( ) – writeTo( )
  187. Các lớp nhập/xuất tập tin •Các lớp này trợ giúp trong Java để hổ trợ các thao tác nhập và xuất: – File – FileDescriptor – FileInputStream – FileOutputStream •Các lớp File, FileDescriptor, và RandomAccessFile được sử dụng hỗ trợ trực tiếp hoặc truy cập nhập/xuất ngẫu nhiên.
  188. Lớp tập tin • Được sử dụng truy cập các đối tượng tập tin và thw mục •Những tập tin có tên được đặt tên theo qui ước của hệ điều hành chủ •Lớp này cung cấp phương thức khởi tạo để tạo ra các thư mục và tập tin •Tất cả các thao tác thư mục và tập tin đều được sử dụng các phương thức truy cập và các phương thức thư mục mà các lớp tập tin cung cấp
  189. Lớp FileDescriptor • Cung cấp việc truy cập tới các tập tin mô tả • Không cung cấp bất kỳ tính rõ nét nào tới thông tin mà hệ điều hành duy trì. • Cung cấp chỉ một phương thức gọi là ‘valid( )’
  190. Lớp FileInputStream • Cho phép đầu vào đọc từ một tập tin trong một mẫu của một dòng •Các đối tượng được tạo ra sử dụng chuỗi tên tập tin, tập tin, đối tượng FileDescriptor như một tham số. • Các phương thức nạp chồng của lớp InputStream. nó cung cấp phương thức ‘finalize( )’ và ‘getFD( )’
  191. Lớp FileOutputStream • Cho phép kết xuất để ghi ra một luồng tập tin •Các đối tượng cũng tạo ra sử dụng một chuỗi tên tập tin, tạp tin, hay đối tượng FileDescriptor như một tham số. •Lớp này nạp chồng các phương thức của lớp OutputStream và cung cấp phương thức ‘finalize( )’ và ‘getFD( )’
  192. Nhập xuất lọc •Lọc: – Là kiểu luồng sửa đổi cách điều quản một luồng hiện có. – về cơ bản được sử dụng để thích ứng các luồng theo các nhu cầu của chương trình cụ thể. – Bộ lọc nằm giữa luồng nhập và luồng xuất. – Thực hiện một số tiến trình đặt biệt trên các byte được chuyển giao từ đầu vào đến kết xuất. – Có thể phối hợp để thực hiện một dãy các tuỳ chọn lọc.
  193. Lớp FilterInputStream •Làlớp trừu tượng. • Là cha của tất cả các lớp luồng nhập đã lọc. • Cung cấp khả năng tạo ra một luồng từ luồng khác. •Một luồng có thể đọc và cung cấp cung cấp dưới dạng kết xuất cho luồng khác. • duy trì một dãy các đối tượng của lớp ‘InputStream’ • Cho phép tạo ra nhiều bộ lọc kết xích (chained filters •).
  194. Lớp FilterOutputStream •Là dạng bổ trợ cho lớp ‘FilterInputStream’. • Là cha của tất cả các lớp luồng kết xuất. • Duy trì đối tượng của lớp ‘OutputStream’ như là một biến ‘out’. •Dữ liệu ghi ra lớp này có thể sửa đổi để thực hiện các thao tác lọc, và sau đó phản hồi đến đối tượng ‘OutputStream’.
  195. Vùng đệm nhập/xuất • Vùng đệm: – Là kho lưu trữ dữ liệu. – Có thể cung cấp dữ liệu thay vì quay trợ lại nguồn dữ liệu gốc ban đầu. – Java sử dụng vùng đệm nhập và kết xuất để tạm thời lập cache dữ liệu được đọc hoặc ghi vào một luồng. • Trong khi thực hiện vùng đệm nhập: – Số lượng byte lớn được đọc cùng thời điểm, và lưu trữ trong một vùng đệm nhập. – Khi chương trình đọc luồng nhập, các byte nhập được đọc vào vùng đệm nhập.
  196. Vùng đệm nhập/xuất (tt ) • Trong trường hợp vùng đệm kết xuất, một chương trình ghi ra một luồng. •Dữ liệu kết xuất đựơc lưu trữ trong một vùng đệm kết xuất. •Dữ liệu được lưu trữ cho đến khi vùng đệm trợ nên đầy, hay luồng kết xuất được xả trống. •Kết thúc, vùng đệm kết xuất được chuyển gửi đến đích của luồng xuất.
  197. Lớp BufferedInputStream •Tự động tạo ra và duy trì vùng đệm để hổ trợ vùng đệm nhập. •bởi lớp ‘BufferedInputStream’ là một bộ đệm, nó có thể áp đụng cho một số các đối tượng nhất định của lớp ‘InputStream’. •Cũng có thể phối hợp các tập tin đầu vào khác. •Sử dụng vài biến để triển khai vùng đệm nhập.
  198. Lớp BufferedInputStream (Contd ) • Định nghĩa hai phương thức thiết lập: – Một chó phép chỉ định kích thước của vùng đệm nhấp. – phương thức kia thì không. •Cả hai phương thức thiết lập đều tiếp nhận một đối tượng của lớp ‘InputStream’ như một tham số. •Nạp chồng các phương thức truy cập mà InputStream cung cấp, và không đưa vào bất kỳ phương thức mới nào.
  199. Lớp BufferedOutputStream •Thực hiện vùng đệm kết xuất theo cách tương ứng với lớp ‘BufferedInputStream’. • Định nghĩa hai phương thức thiết lập. Nó cho phép chúng ta ấn định kích thước của vùng đệm xuất trong một phương thức thiết lập, cũng giống như cung cấp kích thước vùng đệm mặc định. •Nạp chồng tất cả phương thức của lớp ‘OutputStream’ và không đưa vào bất kỳ phương thức nào.
  200. Lớp Reader và Writer •Làcác lớp trừu tượng. • Chúng nằm tại đỉnh của hệ phân cấp lớp, hỗ trợ việc đọc và ghi các luồng ký tự unicode.
  201. Lớp Reader •Hỗ trợ các phương thức sau: – read( ) – reset( ) – skip( ) – mark( ) – markSupported( ) – close( ) – ready( )
  202. Lớp Writer •Hỗ trợ các phương thức sau : – write( ) – flush( ) – close( )
  203. Nhập/xuất chuỗi và mảng ký tự •Hỗ trợ nhập và xuất từ các vùng đệm bộ nhớ •Hỗ trợ 8 bít ký tự nhập và kết xuất •Lớp ‘CharArrayReader’ không bổ sung phương thức mới vào các phương thức mà lớp ‘Reader’ cung cấp.
  204. Nhập/xuất chuỗi và mảng ký tự (tt) •Lớp ‘CharArrayWriter’ bổ sung phương thức sau đây vào phương thức của lớp ‘Writer’ cung cấp: – reset( ) – size( ) – toCharArray( ) – toString( ) – writeTo( )
  205. Nhập/xuất chuỗi và mảng ký tự (tt) •Lớp ‘StringReader’ trợ giúp đọc các ký tự đầu vào từ sâu chuỗi. • Nó không bổ sung bất kỳ phương thức nào mà lớp Reader cung cấp. •Lớp ‘StringWriter’ trợ giúp để ghi luồng kết xuất ký tự ra một đối tượng ‘StringBuffer’. •Lớp này bổ sung thêm các phương thức sau: – getBuffer( ) – toString( )
  206. Lớp PrinterWriter •Thực hiện một kết xuất. •Lớp này có phương thức bổ sung , trợ giúp in các kiểu dữ liệu cơ bản . •Lớp PrintWriter thay thế lớp ‘PrintStream’ •Thực tế cải thiện lớp ‘PrintStream’; lớp này dùng một dấu tách dòng phụ thuộc nền tảng điểm các dòng thay vì ký tự ‘\n’. • Cung cấp phần hỗ trợ cho các ký tự unicode so với PrintStream. • Các phương thức: – checkError( ) tE ()
  207. Giao diện DataInput • Được sử dụng để đọc các byte từ luồng nhị phân, và • Is used to read bytes from a binary stream, and xây dựng lại dữ liệu trong một số kiểu dữ liệu nguyên thuỷ. • Cho phép chúng ta chuyển đổi dữ liệu từ từ khuôn dạng UTF-8 được sửa đổi Java đến dạng chuỗi • Định nghiã số phương thức, bao gồm các phương thức để đọc các kiểu dữ liệu nguyên thuỷ.
  208. Những phương thức giao diện DataInput • boolean readBoolean( • float readFloat( ) ) • int readInt( ) • byte readByte( ) • double readDouble • char readChar( ) • String readUTF( ) • short readShort( ) • String readLine( ) • long readLong( )
  209. Giao diện DataOutput • Được sử dụng để xây dựng lại dữ liệu một số kiểu dữ liệu nguyên thuỷ vào trong dãy các byte • Ghi các byte dữ liệu vào luồng nhị phân • Cho phép chúng ta chuyển đổi một chuỗi vào khuôn dạng UTF-8 được sửa đổi Java và viết nó vào trong một dãy. • Định nghĩa một số phương thức và tất cả phương thức kích hoạt IOException trong trường hợp lỗi.
  210. Các phương thức giao diện DataOutput • void writeBoolean(boolean b) • void writeByte( int value) • void writeChar(int value) • void writeShort(int value) • void writeLong(long value) • void writeFloat(float value) • void writeInt(int value) • void writeDouble(double value) • void writeUTF(String value)
  211. Lớp RandomAccessFile • Cung cấp khả năng thực hiện I/O theo các vị trí cụ thể bên trong một tập tin. •dữ liệu có thể đọc hoặc ghi ngẫu nhiên ở những vị trí bên trong tập tin thay vi một kho lưu trữ thông tin liên tục. •phương thức ‘seek( )’ hỗ trợ truy cập ngẫu nhiên. •Thực hiện cả đầu vào và đầu ra dữ liệu. •Hỗ trợ các cấp phép đọc và ghi tập tin cơ bản. •Kế thừa các phương thức từ các lớp ‘DataInput’ và ‘DataOutput’
  212. Các phương thức của lớp RandomAccessFile • seek( ) • getFilePointer( ) • length( )
  213. Gói java.awt.print •Gồm có các giao diện – Pageable: • Định nghĩa các phương thức dùng để các đối tượng biểu thị các trang sẽ được in. • Chỉ định số trang đã được in, và trang hiện tại hay là tranh giới trang đã được in –Printable: • Chi định phương thức ‘print( )’ sử dụng để in một trang trên đối tượng ‘Graphics’ – PrinterGraphics: • Cung cáp khả năng truy cập đối tượng ‘PrinterJob’
  214. • Giao diê n ‘PrinterGraphics’ cung cấp các lớp sau: – Paper – Book – PageFormat – PrinterJob • Gói ‘java.awt.print’ kích hoạt các ngoại lệ: – PrinterException – PrinterIOException – PrinterAbortException
  215. Chương IX KẾT NỐI CSDL Java Database Connectivity
  216. Tổng quan • JDBC cung cấp tập các lớp và interface cho phép chương trình Java có thể nói chuyện được với hệ CSDL •Tập các lớp của JDBC có thể làm việc được với mọi hệ csdl.
  217. • Có 3 bước chính để kết nối CSDL. –Nạp database drivers –Tạo nối kết, Tạo đối tượng Connection –Tạo đối tượng Statement để thực thi các lệnh sql
  218. Ví dụ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con=DriverManager.getConnection("jdbc:odbc:ATM"); Statement stmt = con.createStatement(); : : : :
  219. Database URL • Database URL là một chuổi được dùng để kết nối csdl. • cú pháp : • jdbc:subprotocol name:other_stuff • The subprotocol name được dùng tuỳ vào loại driver sử dụng để kết nối csdl. •vídụ : subprotocol name là odbc nếu driver là cầu nối jdbcodbc • Other_stuff cũng phụ thuộc vào loại driver nào được sử dụng. ví dụ nếu driver là cầu nối jdbcodbc thì thành phần này là tên của đối tượng ODBC
  220. Database Driver •Bảo đảm ứng dụng java tương tác với mọi csdl dưới một cách thức chuẩn và duy nhất. •Bảo đảm những yêu cầu từ chương trình sẽ được biểu diễn trong csdl dưới một ngôn ngữ mà csdl hiểu được •nhận các yêu cầu từ client, chuyển nó nó vào định dạng mà csdl có thể hiểu được và thể hiện trong csdl. •Nhận các phản hồi, chuyển nó ngược lại định dạng dữ liệu java và thể hiện trong ứng dụng.
  221. NạpDriver •Lớp DriverManager chịu trách nhiệm nạp driver và tạo kết nối đến csdl. DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver()); •hoặc Class.forName(String); – This returns the object associated with the class with the given string name. – Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); • Equivalent to: new sun.jdbc.odbc.JdbcOdbcDriver(); If you have a driver from another vendor, then find out the class name of that driver and load it instead.
  222. JDBC Driver •Có4 loại JDBC Driver –Loại 1: JDBC/ODBC –Lo ại 2: Native-API –Lo ại 3: Open Protocol-Net –Lo ại 4: Proprietary-Protocol-Net •Loại 2,3,4 nói chung được viết bởi nhà cung cấp csdl. hiệu quả hơn loại 1 nhưng thực hiện phức tạp hơn.
  223. Loại I JDBC/ODBC •jdkhỗ trợ cầu nối jdbc-odbc (jdbc-odbc bridge). •Mềm dẻo nhưng không hiệu quả. Client AplicationAplication JDBCJDBC DriverDriver DiskDisk ODBCODBC DriverDriver Network Interface Network Interface DatabaseDatabase Server
  224. Loại 2: Native-API •Tốt hơn loại 1, loại này cho phép JDBC giao tiếp trực tiếp với các driver hay các hàm API của CSDL. Client AplicationAplication JDBCJDBC DriverDriver DiskDisk NativeNative Database Database Library Library Network Interface Network Interface DatabaseDatabase Server
  225. Loại 3: Open Protocol-Net • Drivers –Cóthể chuyển các yêu cầu đến các csdl nằm ở xa. –Cóthể giao tiếp với nhiều loại CSDL. – Không phải của nhà cung cấp csdl –Tất cả bằngAplicationAplication mã java Client JDBCJDBC DriverDriver ClientClient DiskDisk Network Interface Network Interface Server JDBCJDBC DriverDriver ServerServer DatabaseDatabase NativeNative Database Database Library Library
  226. Loại 4: Proprietary-Protocol Net • 100% java •Cókhả năng giao tiếp trực tiếp với hệ CSDL khôngAplicationAplication cần chuyClient ển đổi JDBCJDBC DriverDriver DiskDisk Network Interface Network Interface DatabaseDatabase Server
  227. Gói Java.sql • Cung cấp tập hợp các lớp và interface dùng để trao đổi với CSDL. •Các lớp – DriverManager – Date, Time –Timestamp –Types • Các Interfaces „ Driver „ PreparedStatement „ Connection „ CallableStatement „ DatabaseMetaData „ ResultSet „ Statement „ ResultSetMetaData
  228. Đối tượng Statement • Đối tượng Connection chứa liên kết trực tiếp đến csdl. •Sử dụng đối tượng Connection để tạo đối tượng Statement. – Statement s = con.createStatement(); • Đối tượng này có nhiệm vụ gửi các câu lệnh sql đến csdl. • executeQuery(String) or executeUpdate(String) method • Cùng một đối tượng Statement có thể sử dụng cho nhiều câu lệnh sql khác nhau.
  229. • Có 3 phương thức thực thi – executeQuery() – executeUpdate() – execute() • The executeQuery() –Nhận câu lệnh SQL (select) làm đối số, trả lại đối tượng ResultSet • ResultSet rs = s.executeQuery(“SELECT * FROM Books”);
  230. •Phương thức executeUpdate() –Nhận các câu lệnh sql dạng cập nhật –Trả lại số nguyên biểu thị số hàng được cập nhật. – UPDATE, INSERT, or DELETE. •Phương thức execute() – Được áp dụng cho trường hợp không rõ loại sql nào được thựưc hiện. – Được áp dụng cho trường hợp câu lệnh sql đwocj tạo ra tự động bởi chương trình.
  231. ResultSet •Chứa một hoặc nhiều hàng dữ liệu từ việc thực hiện câu lệnh truy vấn. •Cóthể lấy dữ liệu từng hàng dữ liệu một trong ResultSet. •Sử dụng phương thức next() để di chuyển đến hàng dữ liệu tiếp theo trong ResultSet. • Hàm next() trả lại true chỉ rằng hàng chứa dữ liệu, trả lại false hàng cuối không chứa dữ liệu. •Thực hiện while (rs.next()){ // examine a row from the results }
  232. • Để lấy dữ liệu ở các cột trên mỗi hàng của ResultSet, ta dùng các phương thức. – get type(int | String) • Đối số là chỉ số cột tính từ 1. •Áp dụng cho các cột có kiểu dữ liệu là int, float, Date –Vídụ : • String isbn = rs.getString(1); // Column 1 • float price = rs.getDouble(“Price”);
  233. ResultSet Metadata • Đối tượng này cho biết thông tin về ResultSet • ResultSet rs = stmt.executeQuery(SQLString); ResultSetMetaData rsmd = rs.getMetaData(); int numberOfColumns = rsmd.getColumnCount(); • getColumnName(int column)
  234. Prepared Statements • To execute a Statement object many times, it will reduce execution time to use PreparedStatement object • PreparedStatement object – unlike a Statement object, it is given an SQL statement when it is created. – The advantage to this is that in most cases, this SQL statement will be sent to the DBMS right away, where it will be compiled. – As a result, the PreparedStatement object contains not just an SQL statement, but an SQL statement that has been precompiled. – This means that when the PreparedStatement is
  235. Các đối tượng Statement khác • Prepared Statements • Callable Statement
  236. Database Metadata • Đối tượng này cho biết thông tin về csdl.
  237. Chương trình mẫu import java.sql.*; class JDBCDemo1 { public static void main(String[] args) { try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con=DriverManager.getConnection("jdbc:odbc:Accserver"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(args[0]); ResultSetMetaData rsmd = rs.getMetaData(); int numberOfColumns = rsmd.getColumnCount(); for(int j=1; j<=numberOfColumns;j++) { System.out.println(rsmd.getColumnLabel(j)); } while(rs.next()) { for(int i=1; i<=numberOfColumns;i++){ System.out.println(rs.getObject(i)); }} rs.close(); stmt.close(); } catch(Exception e){ System.out.println("Error " + e);