LAP TRINH JAVA - 2

----------------------- Page 1-----------------------

                                  M      C L       C

Chương 1: GIỚI THIỆU TỔNG QUAN VỀNGÔN NGỮ LẬP

TRÌNH JAVA ......................................................................... 7

    1.1. Mởđầu ......................................................................... 7

    1.2. Giới thiệu vềngôn ngữ lập trình Java ............................ 7

       1.2.1. Java là gì? .............................................................. 7

       1.2.2. Lịch sửphát triển của ngôn ngữ lập trình Java........ 7

       1.2.3. Một sốđặc điểm nổi bậc của ngôn ngữ lập trình Java

........................................................................................ 8

    1.3. Các ứng dụng Java ...................................................... 10

       1.3.1. Java và ứng dụng Console .................................... 10

       1.3.2. Java và ứng dụng Applet ...................................... 11

       1.3.3. Java và phát triển ứng dụng Desktop dùng AWT và

       JFC ................................................................................ 12

       1.3.4. Java và phát triển ứng dụng Web .......................... 13

       1.3.5. Java và phát triển các ứng dụng nhúng ................. 14

    1.4. Dịch và thực thi một chương trình viết bằng Java........ 14

    1.5. Chương trình Java đầu tiên.......................................... 15

       1.5.1. Tạo chương trình nguồn HelloWordApp .............. 15

       1.5.2. Biên dịch tập tin nguồn HelloWordApp................ 16

       1.5.3. Chạy chương trình HelloWordApp ....................... 16

       1.5.4. Cấu trúc chương trình HelloWordApp .................. 17

        Sử dụng phương thức/biến của lớp ................................ 17

    1.6. Công cụ lập trình và chương trình dịch........................ 17

       1.6.1. J2SDK ................................................................. 17

       1.6.2. Công cụ soạn thảo mã nguồn Java. ....................... 18

Chương 2: ............................................................................. 21

HẰNG, BIẾN, KIỂU DỮLIỆU, ........................................... 21

TOÁN TỬ, BIỂU THỨC VÀ CÁC ....................................... 21

CẤU TRÚC ĐIỀU KHIỂN TRONG JAVA .......................... 21

   2.1. Biến ............................................................................ 21

   2.2. Các kiểu dữ liệu cơ sở................................................. 23

       2.2.1. Kiểu sốnguyên .................................................... 24

       2.2.2. Kiểu dấu chấm động............................................. 26

                                           1

----------------------- Page 2-----------------------

       2.2.3. Kiểu ký tự (char) .................................................. 26

       2.2.4. Kiểu luận lý (boolean) .......................................... 27

   2.3. Hằng:.......................................................................... 27

   2.4. Lệnh, khối lệnh trong java........................................... 28

   2.5. Toán tửvà biểu thức ................................................... 29

       2.5.1. Toán tử số học...................................................... 29

       2.5.2. Toán tửtrên bit..................................................... 29

       2.5.3. Toán tử quan hệ& logic ....................................... 29

       2.5.4. Toán tử ép kiểu .................................................... 30

       2.5.5. Toán tử điều kiện ................................................. 30

       2.5.6. Thứ tự u tiên ...................................................... 30

   2.6. Cấu trúc điều khiển ..................................................... 31

       2.6.1. Cấu trúc điều kiện if … else ................................. 31

       2.6.2. Cấu trúc switch … case ........................................ 32

       2.6.3. Cấu trúc lặp .......................................................... 32

       2.6.4. Cấu trúc lệnh nhảy (jump) .................................... 33

   2.7. Lớp bao kiểu dữ liệu cơ sở(Wrapper Class)................ 33

   2.8. Kiểu dữ liệu mảng....................................................... 34

       2.8.1. Khái niệm mảng ................................................... 34

       2.8.2. Khai báo mảng ..................................................... 34

       2.8.3. Cấp phát bộnhớcho mảng ................................... 35

       2.8.4. Khởi tạo mảng...................................................... 35

       2.8.5. Truy cập mảng ..................................................... 35

   2.9. Một sốví dụ minh họa: ............................................... 36

Chương 3: HƯỚNG ĐỐI TƯỢNG TRONG JAVA ............... 47

    3.1. Mởđầu ....................................................................... 47

    3.2. Lớp (Class) ................................................................. 48

       3.2.1. Khái niệm ............................................................ 48

       3.2.2. Khai báo/định nghĩa lớp ....................................... 48

       3.2.3. Tạo đối tượng của lớp .......................................... 49

       3.2.4. Thuộc tính của lớp ............................................... 49

       3.2.5. Hàm - Phương thức lớp (Method)......................... 50

       3.2.6. Khởi tạo một đối tượng (Constructor)................... 52

       3.2.7. Biến this............................................................... 53

                                            2

----------------------- Page 3-----------------------

       3.2.8. Khai báo chồng phương thức (overloading method)

   ...................................................................................... 54

    3.3. Đặc điểm hướng đối tượng trong java ......................... 54

       3.3.1. Đóng gói (encapsulation) ..................................... 55

       3.3.2. Tính đa hình (polymorphism):.............................. 55

       3.3.3. Tính kếthừa (inheritance) .................................... 57

    3.4. Gói (packages) ............................................................ 62

    3.5. Giao diện (interface) ................................................... 63

       3.5.1. Khái niệm interface:............................................. 63

       3.5.2. Khai báo interface: ............................................... 64

       3.5.3. Ví dụ minh họa..................................................... 65

Chương 4: THIẾT KẾ GIAO DIỆN NGƯỜI DÙNG ............. 82

   4.1. Mởđầu ....................................................................... 82

   4.2. Giới thiệu th          viện awt................................................ 83

   4.3. Các khái niệm cơ bản .................................................. 83

       4.3.1. Component........................................................... 83

       4.3.2. Container ............................................................. 84

       4.3.3. Layout Manager ................................................... 85

   4.4. Thiết kếGUI cho chương trình ................................... 86

       4.4.1. Tạo khung chứa cửa sổ chương trình .................... 86

       4.4.2. Tạo hệthống thực đơn.......................................... 87

       4.4.3. Gắn Component vào khung chứa.......................... 89

       4.4.4. Trình bày các Component trong khung chứa ........ 90

       4.4.5. Các đối tượng khung chứa Container.................. 101

   4.5. Xử lý biến cố/sựkiện ................................................ 105

       4.5.1. Mô hình xử lý sựkiện (Event-Handling Model) . 105

       4.5.2. Xử lý sựkiện chuột ............................................ 108

       4.5.3. Xử lý sựkiện bàn phím ...................................... 111

   4.6. Một sốví dụ minh họa .............................................. 115

Chương 5: LUỒNG VÀ TẬP TIN ....................................... 128

    5.1. Mởđầu ..................................................................... 128

    5.2. Luồng (Streams) ....................................................... 129

       5.2.1. Khái niệm luồng................................................. 129

       5.2.2. Luồng byte (Byte Streams) ................................. 129

       5.2.3. Luồng ký tự (Character Streams) ........................ 131

                                             3

----------------------- Page 4-----------------------

       5.2.4. Những luồng được định nghĩa trước (The Predefined

       Streams) ...................................................................... 132

    5.3. Sử dụng luồng Byte .................................................. 133

       5.3.1. Đọc dữliệu từ Console....................................... 134

       5.3.2. Xuất dữliệu ra Console ...................................... 135

       5.3.3. Đọc và ghi file dùng luồng Byte ......................... 136

       5.3.4. Đọc và ghi dữ liệu nhịphân................................ 141

    5.4. File truy cập ngẫu nhiên (Random Access Files) ....... 145

    5.5. Sử dụng luồng ký tự.................................................. 147

       5.5.1. Nhập Console dùng luồng ký tự ......................... 149

       5.5.2. Xuất Console dùng luồng ký tự.......................... 151

       5.5.3. Đọc/ghi File dùng luồng ký tự............................ 152

    5.6. Lớp File .................................................................... 155

Chương 6: LẬP TRÌNH CƠ SỞ DỮ LIỆU .......................... 158

    6.1. GIỚI THIỆU............................................................. 158

    6.2. KIẾN TRÚC JDBC................................................... 158

    6.3. Các khái niệm cơ bản ................................................ 160

       6.3.1. JDBC Driver ...................................................... 160

       6.3.2. JDBC URL ........................................................ 162

    6.4. KẾT NỐI CSDL VỚI JDBC ..................................... 163

       6.4.1. Đăng ký trình điều khiển .................................... 163

       6.4.2. Thực hiện kết nối ............................................... 163

       6.4.3. Ví dụ.................................................................. 164

    6.5. KIỂU DỮ LIỆU SQL VÀ KIỂU DỮ LIỆU JAVA.... 168

    6.6. CÁC THAO TÁC CƠ BẢN TRÊN CSDL ................ 170

       6.6.1. Các lớp cơ bản ................................................... 170

       6.6.2. Ví dụtruy vấn CSDL ......................................... 171

       6.6.3. Ví dụ cập nhật CSDL ......................................... 174

Tài liệu tham khảo:.............................................................. 176

Phụ lục A: Trắc nghiệm kiến thức........................................ 177

Phụ Lục B:Đáp án trắc nghiệm kiến thức............................. 205

                                            4

----------------------- Page 5-----------------------

                            LỜI NÓI ĐẦU

     Ngôn ngữ lập trình java ra đời và được các nhà nghiên cứu

của Công ty Sun Microsystem giới thiệu vào năm 1995. Sau khi

ra đời không lâu, ngôn ngữ lập trình này đã được sử dụng rộng

rãi và phổ biến  đối  với các  lập  trình  viên  chuyên  nghiệp   cũng

nh    các nhà phát triển phần mềm. Gần đây ngôn ngữ lập trình,

công nghệjava đã được đ a vào giảng dạy ở các cơ sở đào tạo

lập  trình  viên  chuyên  nghiệp.   Một   số trường  đại   học  ở Việt

Nam dạy môn lập trình java nh           một chuyên đề tự chọn cho các

sinh viên công nghệthông tin giai đoạn chuyên ngành.

     Sau một thời gian tìm hiểu, làm việc và được tham gia giảng

dạy chuyên đề lập trình java cho lớp cử nhân tin học từ xa qua

mạng. Nhóm tác giả chúng tôi quyết  định biên  soạn cuốn giáo

trình  này nhằm phục  vụ công  tác  giảng  dạy  cũng nh               học  tập

của sinh viên chuyên ngành công nghệthông tin.

      Nội dung giáo trình tập trung vào những kiến thức căn bản

nhất   của   lập  trình java  giúp  người  đọc   bước  đầu  tiếp   cập   dễ

dàng   với  công  nghệ  mới này,  và  đây  cũng  chính  là   một   bước

đệm để chúng ta trở thành “java shooter”. Một số vấn đề nâng

trong ngôn ngữ lập trình java nh          : javabean, thiết kết giao diện

dùng th     viện JFC(Java Foundation Class), lập trình mạng, lập

trình   cơ  sở  dữ liệu   bằng java,   lập  trình  ứng   dụng  web  dùng

J2EE (Java 2 Enterprise Edition),  … sẽ được nói đến trong các

chuyên  đề nâng  cao.  Chương  6   của  giáo  trình  giới thiệu   tổng

quan  về  lập  trình  cơ  sở  dữ liệu  dùng jdbc,  một   nội dung theo

chúng tôi cần phải được trình bày trong một chuyên đềriêng.

     Để có thể đọc hiểu giáo trình này người đọc cần nắm vững

các kiến thức về: nhập môn lập trình, lập trình hướng đối tượng.

Đây  là   lần  xuất  bản  đầu  tiên  chắc  chắn  không  thể tránh  khỏi

               xuất  bản

những  sai sót. Nhóm tác giả rất mong nhận được những ý kiến

đóng  góp   của quý thầy cô, các đồng nghiệp và bạn đọc để có

                                      5

----------------------- Page 6-----------------------

thể hoàn thiện hơn giáo trình này phục vụ cho việc học tập của

sinh viên.

Xin chân thành cảm ơn!

                                             TPHCM tháng 01/2006

                                                      Nhóm tác giả

                                       6

----------------------- Page 7-----------------------

Chương 1: GIỚI THIỆU TỔNG QUAN VỀNGÔN

 Chương 1: GIỚI THIỆU TỔNG QUAN VỀNGÔN

                    NGỮLẬP TRÌNH JAVA

                    NGỮLẬP TRÌNH JAVA

1.1.Mởđầu

1.1.Mởđầu

Chương này sẽ cung cấp cho sinh viên các khái niệm, kiến thức

cơ  bản  liên  quan  đến  việc   lập  trình  ứng   dụng   bằng  ngôn  ngữ

Java  nh   :  lịch   sử phát  triển   của java,  các  đặc  điểm   của java,

khái niệm máy ảo, cấu trúc của một  chương trình đơn giản viết

bằng    Java    cũng  nh    cách    xây   dựng,    dịch  và  thực   thi   một

chương trình Java.

1.2.Giới thiệu vềngôn ngữlập trình Java

1.2.Giới thiệu vềngôn ngữlập trình Java

1.2.1. Java là gì?

1.2.1. Java là gì?

     Java  là ngôn  ngữ  lập  trình  hướng  đối  tượng  (tựa  C++)  do

Sun Microsystem đ a ra vào giữa thập niên 90.

     Chương trình viết bằng ngôn ngữ lập trình java có thể chạy

trên   bất   kỳ  hệ thống  nào     có  cài  máy    ảo  java   (Java  Virtual

Machine).

1.2.2.Lịch sửphát triển của ngôn ngữlập trình Java

1.2.2.Lịch sửphát triển của ngôn ngữlập trình Java

     Ngôn ngữ  lập  trình Java do  James Gosling và các  công sự

của Công ty Sun Microsystem phát triển.

     Đầu thập niên 90, Sun Microsystem tập hợp các nhà nghiên

cứu  thành  lập  nên  nhóm đặt  tên  là  Green  Team. Nhóm Green

Team có trách nhiệm xây dựng công nghệ mới cho ngành điện

tử tiêu  dùng. Để giải quyết   vấn đề này nhóm nghiên  cứu  phát

triển  đã xây  dựng  một  ngôn  ngữ  lập  trình  mới đặt  tên  là  Oak

tương  tự nh      C++  nh    ng  loại  bỏ  một   số tính  năng nguy hiểm

của  C++  và  có  khả  năng  chạy trên  nhiều   nền phần  cứng khác

nhau. Cùng lúc đó world wide web bắt đầu phát triển và Sun đã

thấy được tiềm năng của ngôn ngữ Oak nên đã đầu t                    cải tiến

                                      7

----------------------- Page 8-----------------------

và  phát  triển.  Sau  đó  không  lâu  ngôn  ngữ  mới  với tên   gọi  là

Java ra đời và được giới thiệu năm 1995.

     Java  là  tên   gọi  của   một  hòn  đảo  ở Indonexia,  Đây  là   nơi

nhóm nghiên  cứu  phát  triển  đã  chọn  để đặt  tên  cho ngôn ngữ

lập  trình Java trong một  chuyến đi tham quan và làm việc trên

hòn  đảo  này.  Hòn  đảo  Java này  là  nơi  rất   nổi tiếng  với nhiều

khu   vườn  trồng  cafe,  đó  chính  là  lý  do  chúng  ta  thường  thấy

biểu tượng ly café trong nhiều sản phẩm phần mềm, công cụ lập

trình Java của  Sun cũng nh         một số hãng phần mềm khác đ a

ra.

1.2.3.Một sốđặc điểm nổi bậc của ngôn ngữlập trình Java

1.2.3.Một sốđặc điểm nổi bậc của ngôn ngữlập trình Java

Máy ảo Java (JVM - Java Virtual Machine)

     Tất   cả các  chương trình muốn thực thi được thì phải được

biên dịch ra mã máy. Mã máy của từng kiến trúc CPU của mỗi

máy tính  là khác nhau  (tập   lệnh  mã máy  của  CPU  Intel,  CPU

Solarix, CPU Macintosh  … là khác nhau), vì vậy trước đây một

chương trình sau khi được biên dịch xong chỉ có thể chạy được

trên một kiến trúc CPU cụ thểnào đó. Đối với CPU Intel chúng

ta có thể chạy các hệ điều hành nh           Microsoft Windows, Unix,

Linux,   OS/2,    …  Chương  trình       thực  thi  được  trên    Windows

được biên dịch dưới dạng file có đuôi .EXE còn trên Linux thì

được  biên   dịch   dưới  dạng  file  có  đuôi  .ELF, vì  vậy trước  đây

một  chương  trình  chạy  được  trên  Windows            muốn  chạy được

trên hệ điều hành khác nh          Linux chẳng hạn thì phải chỉnh sửa

và biên  dịch  lại. Ngôn ngữ  lập  trình Java ra đời, nhờ vào máy

ảo Java mà khó khăn nêu trên đã được khắc phục. Một chương

trình viết bằng ngôn ngữ lập trình Java sẽ được biên dịch ra mã

của máy ảo java (mã java bytecode). Sau  đó máy ảo Java chịu

trách nhiệm chuyển mã java bytecode thành mã máy tương ứng.

Sun  Microsystem  chịu  trách nhiệm phát  triển  các máy ảo  Java

chạy trên các hệđiều hành trên các kiến trúc CPU khác nhau.

Thông dịch:

                                      8

----------------------- Page 9-----------------------

     Java  là   một  ngôn  ngữ  lập  trình   vừa  biên   dịch   vừa  thông

dịch. Chương trình nguồn viết bằng ngôn ngữ lập trình Java có

đuôi *.java đầu tiên được biên dịch thành tập tin có đuôi *.class

và sau đó sẽđược trình thông dịch thông dịch thành mã máy.

Độc lập nền:

     Một  chương trình viết bằng ngôn ngữ Java có thể chạy trên

nhiều  máy  tính  có   hệ điều  hành  khác  nhau  (Windows,  Unix,

Linux,  …) miễn  sao  ở đó  có  cài đặt  máy ảo java (Java Virtual

Machine).      Viết    một    lần  chạy     mọi    nơi  (write    once    run

anywhere).

Hướng đối tượng:

     Hướng đối tượng trong Java tương tự nh               C++ nh     ng Java

là  một  ngôn  ngữ  lập  trình  hướng  đối  tượng hoàn toàn.  Tất   cả

mọi thứ đề cập đến trong Java đều liên quan đến các đối tượng

được  định  nghĩa  trước,  thậm  chí  hàm  chính   của   một         chương

trình viết   bằng Java  (đó  là hàm main)  cũng phải đặt bên trong

một lớp. Hướng đối tượng trong Java không có tính đa kế thừa

(multi inheritance) nh       trong C++ mà thay vào đó Java đ a ra

khái  niệm  interface  để  hỗ trợ tính  đa   kế thừa.  Vấn  đề này  sẽ

được bàn chi tiết trong chương 3.

Đa nhiệm - đa luồng (MultiTasking - Multithreading):

     Java hỗ trợ lập trình đa nhiệm, đa luồng cho phép nhiều tiến

trình, tiểu  trình  có  thể chạy  song  song  cùng  một  thời điểm và

tương tác với nhau.

Khảchuyển (portable):

     Chương  trình  ứng   dụng  viết   bằng  ngôn  ngữ Java  chỉ  cần

chạy được trên máy ảo Java là có thể chạy được trên bất kỳmáy

tính, hệ điều hành nào có máy ảo Java. “Viết một lần, chạy mọi

nơi” (Write Once, Run Anywhere).

Hỗtrợ mạnh cho việc phát triển ứng dụng:

                                      9

----------------------- Page 10-----------------------

     Công  nghệ Java phát  triển  mạnh  mẽ nhờ vào   “đại gia  Sun

Microsystem” cung cấp nhiều công cụ, th               viện lập trình phong

phú   hỗ trợ cho  việc  phát  triển  nhiều  loại hình ứng  dụng  khác

nhau   cụ thể nh     : J2SE  (Java  2  Standard  Edition)   hỗ trợ phát

triển những ứng dụng đơn, ứng dụng client-server; J2EE (Java 2

Enterprise Edition) hỗ trợ phát triển các ứng dụng thương mại,

J2ME  (Java  2  Micro  Edition)   hỗ trợ phát  triển  các  ứng   dụng

trên các thiết bịdi động, không dây, …

1.3.Các ứng dụng Java

1.3.Các ứng dụng Java

1.3.1.Java và ứng dụng Console

1.3.1.Java và ứng dụng Console

Ứng   dụng  Console  là  ứng   dụng  nhập  xuất  ở chế độ  văn   bản

tương   tự nh     màn  hình  Console   của   hệ điều  hành  MS-DOS.

Lọai  chương  trình ứng  dụng  này thích  hợp   với những  ai  bước

đầu làm quen với ngôn ngữ lập trình java.

Các ứng dụng kiểu Console thường được dùng để minh họa các

ví dụ cơ bản liên quan đến cú pháp ngôn ngữ, các thuật toán, và

các chương trình ứng dụng không cần thiết đến giao diện người

dùng đồ họa.

class HelloWorld

{        pub lic static void main(String[] args)

                                      10

----------------------- Page 11-----------------------

         {

                  System.out.p rintln("

Hello World");

         }

}

1.3.2.Java và ứng dụng Applet

 1.3.2.Java và ứng dụng Applet

Java Applet  là loại ứng dụng có thể nhúng và chạy trong trang

web của một  trình duyệt  web. Từ khi internet mới ra đời, Java

Applet cung cấp một khả năng lập trình mạnh mẽ cho các trang

web. Nh     ng   gần  đây khi các  chương  trình  duyệt  web  đã phát

triển    với khả  năng      lập trình    bằng  VB    Script,   Java   Script,

HTML,  DHTML,  XML,              … cùng   với  sự canh  tranh  khốc  liệt

của  Microsoft  và  Sun  đã  làm  cho  Java Applet  lu   mờ. Và  cho

đến  bây  giờ  gần  nh      các   lập  trình  viên  đều  không  còn  “mặn

mà”   với  Java  Applet   nữa.  (trình  duyệt  IE  đi kèm  trong  phiên

bản Windows 2000 đã không còn mặc nhiên hỗ trợthực thi một

ứng   dụng  Java  Applet).  Hình  bên   dưới minh   họa   một  chương

trình java applet thực thi trong một trang web.

                                      11

----------------------- Page 12-----------------------

1.3.3.Java và phát triển ứng dụng Desktop dùng AWT và

1.3.3.Java và phát triển ứng dụng Desktop dùng AWT và

JFC

JFC

Việc phát  triển  các  chương trình ứng  dụng  có  giao  diện người

dùng đồ họa trực quan giống nh            những chương trình được viết

dùng ngôn ngữ  lập  trình VC++ hay Visual Basic đã được java

giải  quyết    bằng  th    viện  AWT  và  JFC.  JFC  là  th         viện   rất

phong phú và hỗ trợ mạnh mẽ hơn nhiều so với AWT. JFC giúp

cho người lập trình có thể tạo ra một giao diện trực quan của bất

kỳ ứng  dụng nào. Liên  quan đến việc phát  triển  các ứng dụng

có giao diện người dùng đồ họa trực quan chúng ta sẽ tìm hiểu

chi tiết trong chương 4.

Minh họa thiết kếgiao diện người dùng sử dụng JFC

                                      12

----------------------- Page 13-----------------------

1.3.4.Java và phát triển ứng dụng Web

1.3.4.Java và phát triển ứng dụng Web

Java hỗ trợ mạnh mẽ đối với việc phát triển các ứng dụng Web

thông  qua  công  nghệ J2EE  (Java  2  Enterprise  Edition). Công

nghệ J2EE hoàn toàn có thể tạo ra các ứng dụng Web một cách

hiệu  quả không  thua  kém  công  nghệ .NET  mà  Microsft  đang

quảng cáo.

Hiện  nay  có   rất  nhiều  trang  Web   nổi tiếng  ở Việt  Nam  cũng

nh    khắp nơi trên thế giới được xây dựng và phát triển dựa trên

nền  công  nghệ Java.   Số ứng   dụng  Web  được  xây  dựng  dùng

công  nghệ Java  chắc  chắn  không  ai  có  thể biết  được  con   số

chính xác là bao nhiêu, nh        ng chúng tôi đ a ra đây vài ví dụ để

thấy  rằng  công nghệ Java  của  Sun  là  một “đối thủ đáng gờm”

của Microsoft.

                                      13

----------------------- Page 14-----------------------

http://java.sun.com/

http://e-docs.bea.com/

http://www.macromedia.com/software/jrun/

http://tomcat.apache.org/index.html

Chắc không ít người trong chúng ta biết đến trang web thông tin

nhà  đất    nổi  tiếng  ở TPHCM  đó        là:  http://www.nhadat.com/.

Ứng   dụng  Web  này   cũng  được  xây   dựng   dựa  trên   nền  công

nghệjava.

Bạn có thểtìm hiểu chi tiết hơn vềcông nghệJ2EE tạo địa chỉ:

http://java.sun.com/j2ee/

1.3.5.Java và phát triển các ứng dụng nhúng

1.3.5.Java và phát triển các ứng dụng nhúng

Java Sun đ a ra công nghệ J2ME (The Java 2 Platform, Micro

Edition  J2ME)   hỗ trợ phát  triển  các  chương  trình, phần   mềm

nhúng. J2ME cung cấp một môi trường cho những chương trình

ứng dụng có thể chạy được trên các thiết bị cá nhân nh                 : điện

thọai  di  động,  máy  tính   bỏ túi  PDA  hay  Palm,   cũng  nh          các

thiết bịnhúng khác.

Bạn có thểtìm hiểu chi tiết hơn vềcông nghệJ2ME tại địa chỉ:

http://java.sun.com/j2me/

1.4.Dịch và thực thi một chương trình viết bằng Java

1.4.Dịch và thực thi một chương trình viết bằng Java

     Việc xây dựng, dịch và thực thi một chương trình viết bằng

ngôn ngữ lập trình java có thểtóm tắt qua các bước sau:

     -   Viết  mã nguồn: dùng  một  chương trình  soạn thảo nào

         đấy (NotePad hay Jcreator chẳng hạn) để viết mã nguồn

         và l  u lại với tên có đuôi “.java”

                                      14

----------------------- Page 15-----------------------

     -   Biên dịch ra mã máy ảo: dùng trình biên dịch javac để

         biên  dịch mã nguồn  “.java” thành mã  của máy ảo  (java

         bytecode) có đuôi “.class” và l       u lên đĩa

     -   Thông   dịch  và  thực  thi: ứng  dụng  được  load vào   bộ

         nhớ, thông  dịch  và thực thi dùng trình thông  dịch  Java

         thông qua lệnh “java”.

              o Đưa mã java bytecode vào bộnhớ: đây là bước

                  “loading”. Chương trình phải được đặt vào trong

                  bộ nhớ trước  khi  thực  thi.  “Loader”   sẽ  lấy  các

                  files  chứa  mã java bytecode  có  đuôi “.class” và

                  nạp chúng vào bộnhớ.

              o Kiểm       tra   mã  java    bytecode:  trước  khi  trình

                  thông   dịch  chuyển  mã  bytecode  thành  mã  máy

                  tương ứng để thực thi thì các mã bytecode phải

                  được kiểm tra tính hợp lệ.

              o Thông dịch & thực thi: cuối cùng dưới sự điều

                  khiển  của  CPU  và trình  thông  dịch  tại  mỗi thời

                  điểm  sẽ có   một  mã bytecode được  chuyển  sang

                  mã máy và thực thi.

1.5.Chương trình Java đầu tiên

 1.5.Chương trình Java đầu tiên

1.5.1.Tạo chương trình nguồn HelloWordApp

 1.5.1.Tạo chương trình nguồn HelloWordApp

•Khởi động Notepad và gõ đoạn mã sau

 •Khởi động Notepad và gõ đoạn mã sau

/ *Vi  t chương trình in dòng HelloWorld lên màn hình

/ *Vi  t chương trình in dòng HelloWorld lên màn hình

Console*/

 Console*/

class HelloWorldApp {

class HelloWorldApp {

           p ublic static void main(String[]  args) {

           p ublic static void main(String[]  args) {

                      //In dong chu  “HelloWorld ”

                      //In dong chu  “HelloWorld ”

                      System.out.p rintln(“HelloWorld ”) ;

                      System.out.p rintln(“HelloWorld ”) ;

           }

           }

}

}

L   u lại với tên HelloWorldApp.java

                                      15

----------------------- Page 16-----------------------

1.5.2.Biên dịch tập tin nguồn HelloWordApp

1.5.2.Biên dịch tập tin nguồn HelloWordApp

     Việc    biên     dịch    tập    tin   mã     nguồn     ch   ơng    trình

     Việc    biên     dịch    tập    tin   mã     nguồn     ch   ơng    trình

HelloWorldApp có thểthực hiện qua các b              ớc cụthểnh       sau:

HelloWorldApp có thểthực hiện qua các b              ớc cụthểnh       sau:

     -   Mởcửa sổ Command Prompt.

     -   Mởcửa sổ Command Prompt.

     -   Chuyển đến th       mục chứa tập tin nguồn vừa tạo ra.

     -   Chuyển đến th       mục chứa tập tin nguồn vừa tạo ra.

     -   Thực hiện câu lệnh:  javac HelloWordApp.java

     -   Thực hiện câu lệnh:  javac HelloWordApp.java

     Nếu   gặp  thông  báo   lỗi  “Bad  Command  of  filename”  hoặc

“The name specified is not recognized as an internal or external

command,       operable     program     or   batch    file”   có   nghĩa    là

Windows không tìm được trình biên dịch javac. Để sửa lỗi này

chúng    ta   cần   cập nhật    lại  đường   dẫn   PATH      của   hệ thống.

Ngược       lại   nếu   thành    công      bạn    sẽ  có    thêm     tập   tin

HelloWordApp.class

1.5.3.Chạy chương trình HelloWordApp

1.5.3.Chạy chương trình HelloWordApp

     -   Tại dẫu nhắc gõ lệnh: java HelloWordApp

     -   Tại dẫu nhắc gõ lệnh: java HelloWordApp

     -   Nếu     ch  ơng    trình    đúng    bạn    sẽ  thấy     dòng    chữ

     -   Nếu     ch  ơng     trình   đúng    bạn    sẽ  thấy     dòng     chữ

         HelloWord trên màn hình Console.

         HelloWord trên màn hình Console.

     -   Nếu  các bạn  nhận  đ ợc  lỗi “Exception  in thread  "main

         Nếu  các bạn  nhận  đ ợc  lỗi “Exception  in thread  "main

         java.lang.NoClassDefFoundError:            HelloWorldApp”         có

         java.lang.NoClassDefFoundError:            HelloWorldApp”         có

         nghĩa  là  Java  không  thể tìm  đ ợc  tập  tin  mã bytecode

         nghĩa  là  Java  không  thể tìm  đ ợc  tập  tin  mã bytecode

         tên HelloWorldApp.class của các bạn. Một trong những

         tên HelloWorldApp.class của các bạn. Một trong những

         nơi java cố tìm tập tin bytecode là th           mục hiện tại của

         nơi java cố tìm tập tin bytecode là th           mục hiện tại của

                                      16

----------------------- Page 17-----------------------

         các bạn. Vì thể nếu tập tin byte code đ ợc đặt ở C:\java

         các bạn. Vì thể nếu tập tin byte code đ ợc đặt ở C:\java

         thì các bạn nên thay đổi đ ờng dẫn tới đó.

         thì các bạn nên thay đổi đ ờng dẫn tới đó.

1.5.4.Cấu trúc chương trình HelloWordApp

1.5.4.Cấu trúc chương trình HelloWordApp

Phương thức main(): là điểm bắt  đầu thực thi một ứng dụng.

Phương thức main(): là điểm bắt  đầu thực thi một ứng dụng.

Mỗi ứng  dụng Java phải chứa một  ph             ơng thức main  có  dạng

Mỗi ứng  dụng Java phải chứa một  ph             ơng thức main  có  dạng

nh   sau: public static void main(String[] args)

nh    sau: public static void main(String[] args)

Ph   ơng thức main chứa ba bổtừ đặc tảsau:

Ph   ơng thức main chứa ba bổtừ đặc tảsau:

         •public  chỉ ra rằng ph       ơng  thức main  có  thể đ ợc gọi

         •public  chỉ ra rằng ph       ơng  thức main  có  thể đ ợc gọi

         bỡi bất kỳđối t     ợng nào.

         bỡi bất kỳđối t     ợng nào.

         •static  chỉ ra  rắng  ph     ơng  thức  main     là  một  ph   ơng

         •static  chỉ ra  rắng  ph     ơng  thức  main     là  một  ph   ơng

         thức lớp.

         thức lớp.

         •void chỉ ra rằng ph       ơng thức main sẽ không trả về bất

         •void chỉ ra rằng ph       ơng thức main sẽ không trả về bất

         kỳmột giá trịnào.

         kỳmột giá trịnào.

Ngôn ngữJava hỗtrợba kiểu chú thích sau:

Ngôn ngữJava hỗtrợba kiểu chú thích sau:

•/* text */

•/* text */

•// text

•// text

•/** documentation */. Công cụjavadoc trong bộ JDK sử dụng

•/** documentation */. Công cụjavadoc trong bộ JDK sử dụng

chú thích này đểchuẩn bịcho việc tự động phát sinh tài liệu.

chú thích này đểchuẩn bịcho việc tự động phát sinh tài liệu.

- Dấu mởvà đóng ngo8ạc nhọn “{“ và “}”: là bắt đầu và kết

- Dấu mởvà đóng ngo8ạc nhọn “{“ và “}”: là bắt đầu và kết

thúc 1 khối lệnh.

thúc 1 khối lệnh.

- Dấu chấm phẩy “;” kết thúc 1 dòng lệnh.

- Dấu chấm phẩy “;” kết thúc 1 dòng lệnh.

1.5.5.Sửdụng phương thức/biến của lớp

1.5.5.Sửdụng phương thức/biến của lớp

Cú pháp:          Tên_lớp.Tên_biến

Cú pháp:          Tên_lớp.Tên_biến

                  hoặc     Tên_lớp.Tên_ph        ơng_thức(…)

                  hoặc     Tên_lớp.Tên_ph        ơng_thức(…)

1.6.Công cụlập trình và chương trình dịch

1.6.Công cụlập trình và chương trình dịch

1.6.1.J2SDK

1.6.1.J2SDK

     -   Download  J2SE  phiên   bản   mới nhất   tương  ứng   với  hệ

         điều  hành  đang  sử  dụng  từ địa  chỉjava.sun.com và cài

                                      17

----------------------- Page 18-----------------------

         đặt  lên máy tính (phiên bản được chúng tôi sử dụng khi

         viết giáo trình này là J2SE  1.4). Sau khi cài xong, chúng

         ta cần cập nhật  đường dẫn PATH hệ thống chỉ đến th

         mục chứa chương trình dịch của ngôn ngữjava.

1.6.2.Công cụsoạn thảo mã nguồn Java.

1.6.2.Công cụsoạn thảo mã nguồn Java.

     Để viết  mã nguồn java chúng ta có  thể sử dụng trình  soạn

thảo NotePad hoặc  một   số môi trường phát  triển  hỗ trợ ngôn

ngữjava nh      : Jbuilder của hãng Borland, Visual Café của hãng

Symantec,      JDeveloper       của   hãng    Oracle,    Visual    J++     của

Microsoft, …

     Trong  khuôn  khổ giáo  trình  này   cũng  nh          để  hướng   dẫn

sinh viên thực hành chúng tôi dùng công cụ JCreator LE v3.50

của hãng XINOX Software. Các bạn có thểdownload

JCreator LE v3.50 từhttp://www.jcreator.com/download.htm.

JCreator LE v3.50 từhttp://www.jcreator.com/download.htm.

Ví  d   :  Dùng  JCreator      tạo  và   thực  thi  chương     trình  có  tên

 Ví  d  :  Dùng  JCreator      tạo  và   thực  thi  chương     trình  có  tên

HelloWorldApp .

HelloWorldApp .

Bước 1: Tạo 1 Emp ty Proj ect

Bước 1: Tạo 1 Emp ty Proj ect

                                      18

----------------------- Page 19-----------------------

     -   File Æ New Æ Proj ect.

     -   File Æ New Æ Proj ect.

     -   Chọn Emp ty p roj ect rồi bấm nút chọn Next

     -   Chọn Emp ty p roj ect rồi bấm nút chọn Next

     -   Sau đó nhập  tên p roj ect và bấm chọn Finish.

     -   Sau đó nhập  tên p roj ect và bấm chọn Finish.

Bước    2:                                                               Tạo

Bước    2:                                                               Tạo

một Class mới tên HelloWorldApp  và đưa vào Proj ect hiện tại.

một Class mới tên HelloWorldApp  và đưa vào Proj ect hiện tại.

     -   File Æ New Æ Class.

     -   File Æ New Æ Class.

     -   Nhập  vào tên Class và chọn Finish (hình bên dưới) .

     -   Nhập  vào tên Class và chọn Finish (hình bên dưới) .

                                      19

----------------------- Page 20-----------------------

Bước 3: Soạn thảo mã nguồn (hình bên dưới)

Bước 3: Soạn thảo mã nguồn (hình bên dưới)

                                                                    Dịch (F7)

                                                                Thực thi (F5)

                   Cửa sổ                 Cửa sổsoạn thảo

                WorkSpace                    mã nguồn

                                      20

----------------------- Page 21-----------------------

                               Chương 2:

                               Chương 2:

               HẰNG, BIẾN, KIỂU DỮLIỆU,

               HẰNG, BIẾN, KIỂU DỮLIỆU,

             TOÁN TỬ, BIỂU THỨC VÀ CÁC

             TOÁN TỬ, BIỂU THỨC VÀ CÁC

       CẤU TRÚC ĐIỀU KHIỂN TRONG JAVA

       CẤU TRÚC ĐIỀU KHIỂN TRONG JAVA

2.1.Biến

2.1.Biến

     -   Biến là vùng nhớ dùng để l  u trữ các giá trịcủa ch             ơng

     -   Biến là vùng nhớ dùng để l  u trữ các giá trịcủa ch             ơng

         trình.  Mỗi  biến  gắn  liền  với  một  kiểu  dữ liệu  và  một

         trình.  Mỗi  biến  gắn  liền  với  một  kiểu  dữ liệu  và  một

         định danh duy nhất gọi là tên biến.

         định danh duy nhất gọi là tên biến.

     -   Tên    biến   thông     th  ờng    là  một    chuỗi    các   ký   tự

     -   Tên    biến    thông    th  ờng    là  một    chuỗi    các   ký   tự

         (Unicode), ký số.

         (Unicode), ký số.

              o Tên biến phải bắt đầu bằng một chữ cái, một dấu

              o Tên biến phải bắt đầu bằng một chữ cái, một dấu

                  gạch d    ới hay dấu dollar.

                  gạch d    ới hay dấu dollar.

              o Tên biến không đ ợc trùng với các từ khóa (xem

              o Tên biến không đ ợc trùng với các từ khóa (xem

                  phụ lục các từkhóa trong java).

                  phụ lục các từkhóa trong java).

              o Tên biến không có khoảng trắng ởgiữa tên.

              o Tên biến không có khoảng trắng ởgiữa tên.

     -   Trong java, biến có thể đ ợc khai báo ở bất kỳ nơi đâu

     -   Trong java, biến có thể đ ợc khai báo ở bất kỳ nơi đâu

         trong ch    ơng trình.

         trong ch    ơng trình.

Cách khai báo

Cách khai báo

         <kiểu_dữ_liệu> <tên_biến>;

         <kiểu_dữ_liệu> <tên_biến>;

         <kiểu_dữ_liệu> <tên_biến> = <giá_trị>;

         <kiểu_dữ_liệu> <tên_biến> = <giá_trị>;

Gán giá trịcho biến

Gán giá trịcho biến

         <tên_biến> = <giá_trị>;

         <tên_biến> = <giá_trị>;

Biến công cộng (toàn cục): là biến có thểtruy xuất ởkhắp nơi

trong chương trình, thường được khai báo dùng từ khóa public,

hoặc đặt chúng trong một class.

Biến cục bộ: là biến chỉcó thểtruy xuất trong khối lệnh nó khai

báo.

                                     21

----------------------- Page 22-----------------------

Lưu ý: Trong ngôn ngữ lập trình java có phân biệt  chữ in hoa

và in thường. Vì vậy chúng ta cần l          u ý khi đặt tên cho các đối

tương dữ liệu cũng nh        các xử lý trong chương trình.

 Ví d  :

impo rtj ava.lang.*;

impo rtj ava.io.*;

class  VariableDemo

{

         static int x, y;

         pub lic static void main(String[] args)

         {

                  x  = 10;

                  y  = 20;

                  int z  = x+y;

                  System.out.p rintln("x  = " + x);

                  System.out.p rintln("y  = " +y);

                  System.out.p rintln("z  = x  +y  =" + z);

                  System.out.p rintln("So nho hon la so:" +

                  Math.min(x, y));

                  char c = 80;

                  System.out.p rintln("ky tu c la: " + c);

         }

}

Kết quảchương trình

                                      22

----------------------- Page 23-----------------------

2.2.Các kiểu dữliệu cơsở

2.2.Các kiểu dữliệu cơsở

Ngôn ngữ lập trình java có 8 kiểu dữ liệu cơ sở: byte, short, int,

long, float, double, boolean và char.

                                       23

----------------------- Page 24-----------------------

                             Kiểu cơ sở

   Kiểu luận lý     Kiểu ký tự                        Kiểu số

                                        kiểu nguyên           kiểu thực

    boolean           char

                      byte    short     int     long       float    double

  Kiểu        Kích          Giá trịmin            Giá trịmax          Giá trị

              thước                                                    mặc

             (bytes)                                                   định

byte             1                     -256                   255            0

short            2                  -32768                 32767             0

int             4                       -231               231  - 1          0

long             8                      -263               263  - 1        0L

float           4                                                        0.0f

double           8                                                       0.0d

2.2.1.Kiểu sốnguyên

2.2.1.Kiểu sốnguyên

     -   Java   cung   cấp   4  kiểu    số nguyên  khác  nhau       là:  byte,

         short,  int,  long.  Kích  thước,  giá trị nhỏ nhất,  lớn  nhất,

         cũng    nh    giá  trị  mặc   định    của  các   kiểu   dữ liệu    số

         nguyên được mô tảchi tiết trong bảng trên.

     -   Kiểu mặc định của các sốnguyên là kiểu int.

     -   Các sốnguyên kiểu byte và short rất ít khi được dùng.

     -   Trong  java  không      có  kiểu   số nguyên  không   dấu  nh

         trong ngôn ngữ C/C++.

                                     24

----------------------- Page 25-----------------------

Khai báo và khởi tạo giá trịcho các biến kiểu nguyên:

         int x = 0;

         long y = 100;

Một số lưu ý đối với các phép toán trên sốnguyên:

     -    Nếu  hai  toán   hạng  kiểu  long  thì  kết  quả là  kiểu  long.

         Một  trong hai toán  hạng không phải kiểu  long sẽ được

         chuyển thành kiểu long trước khi thực hiện phép toán.

     -    Nếu  hai  toán   hạng  đầu  không  phải  kiểu  long  thì phép

         tính sẽthực hiện với kiểu int.

     -   Các toán hạng kiểu byte hay short sẽ được chuyển sang

         kiểu int trước khi thực hiện phép toán.

     -   Trong  java     không    thể chuyển      biến   kiểu  int  và   kiểu

         boolean nh      trong ngôn ngữ C/C++.

 Ví d  : có đoạn chương trình nh        sau

boolean b =f alse;

if (b == 0)

{

         System.out.p rintln("Xin chao");

}

Lúc  biên   dịch    đoạn   chương  trình  trên  trình   dịch   sẽ báo   lỗi:

không được phép so sánh biến kiểu boolean với một giá trịkiểu

int.

                                      25

----------------------- Page 26-----------------------

2.2.2.Kiểu dấu chấm động

2.2.2.Kiểu dấu chấm động

Đối với kiểu dấu chấm động hay kiểu thực, java hỗtrợhai kiểu

dữ liệu là float và double.

Kiểu float có kích thước 4 byte và giá trị mặc định là 0.0f

Kiểu double có kích thước 8 byte và giá trị mặc định là 0.0d

Sốkiểu dấu chấm động không có giá trịnhỏnhất cũng không

có giá trị lớn nhất. Chúng có thểnhận các giá trị:

     -    Số âm

     -    Số dương

     -   Vô cực âm

     -   Vô cực dương

Khai báo và khởi tạo giá trịcho các biến kiểu dấu chấm động:

         float x = 100.0/7;

         double y = 1.56E6;

Một số l    u ý đối với các phép toán trên số dấu chấm động:

     -    Nếu mỗi toán hạng đều có kiểu dấn chấm động thì phép

         toán chuyển thành phép toán dấu chấm động.

     -    Nếu  có  một  toán  hạng  là double thì các toán hạng còn

         lại   sẽ được  chuyển  thành  kiểu       double  trước  khi  thực

         hiện phép toán.

     -   Biến kiểu float và double có thể ép chuyển sang kiểu dữ

         liệu khác trừkiểu boolean.

2.2.3.Kiểu ký tự(char)

2.2.3.Kiểu ký tự(char)

Kiểu  ký   tự trong  ngôn  ngữ  lập  trình java  có  kích  thước  là  2

bytes và chỉ dùng để biểu diễn các ký tự trong bộ mã Unicode.

Nh    vậy kiểu char trong java có thểbiểu diễn tất cả 216 = 65536

ký tựkhác nhau.

Giá trị mặc định cho một biến kiểu char là null.

                                     26

----------------------- Page 27-----------------------

2.2.4.Kiểu luận lý (boolean)

2.2.4.Kiểu luận lý (boolean)

     -   Kiểu boolean chỉnhận 1 trong 2 giá trị: true hoặc false.

     -   Trong java  kiểu  boolean  không  thể chuyển  thành  kiểu

         nguyên và ngược lại.

     -   Giá trị mặc định của kiểu boolean là false.

2.3.Hằng:

2.3.Hằng:

     -    Hằng là một giá trị bất biến trong chương trình

     -   Tên hằng được đặt theo qui ước giống nh             tên biến.

     -    Hằng số nguyên: trường hợp giá trị hằng ở dạng long ta

         thêm vào cuối chuỗi số chữ “l” hay “L”. (ví dụ: 1L)

     -    Hằng  số thực: truờng  hợp  giá trị  hằng  có  kiểu  float  ta

         thêm tiếp vĩ ngữ “f” hay “F”, còn kiểu số double thì ta

         thêm tiếp vĩngữ “d” hay “D”.

     -    Hằng Boolean:java có 2 hằng boolean là  true, false.

     -    Hằng ký tự: là một ký tự đơn nằm giữa nằm giữa 2 dấu

         ngoặc đơn.

              o Ví dụ: ‘a’: hằng ký tự a

              o Một số hằng ký tự đặc biệt

                         Ký tự                         Ý nghĩa

               \b                           Xóa lùi (BackSpace)

               \t                            Tab

              

                           Xuống hàng

               \r                           Dấu enter

               \”                           Nháy kép

               \’                           Nháy đơn

               \\                            Sốngược

               \f                           Đẩy trang

               \uxxxx                       Ký tựunicode

                                     27

----------------------- Page 28-----------------------

     -    Hằng chuỗi: là tập hợp  các ký tự được đặt  giữa hai dấu

         nháy kép “”. Một hằng chuỗi không có ký tự nào là một

         hằng chuỗi rỗng.

              o Ví dụ: “Hello Wolrd”

              o L     u  ý:  Hằng  chuỗi  không  phải  là   một  kiểu   dữ

                  liệu   cơ  sở nh  ng vẫn được khai báo và sử dụng

                  trong các chương trình.

2.4.Lệnh, khối lệnh trong java

2.4.Lệnh, khối lệnh trong java

     Giống nh     trong ngôn ngữ C, các câu lệnh trong java kết

thúc bằng một dấu chấm phẩy (;).

      Một khối lệnh là đoạn chương trình gồm hai lệnh trởlên và

được bắt đầu bằng dấu mởngoặc nhọn ({) và kết thúc bằng dấu

đóng ngoặc nhọc (}).

     Bên trong một khối lệnh có thểchứa một hay nhiều lệnh

hoặc chứa các khối lệnh khác.

{// khối 1

         {// khối 2

                  lệnh 2.1

                  lệnh 2.2

                  …

         } // kết thúc khối lệnh 2

          lệnh 1.1

          lệnh 1.2

         …

} // kết thúc khối lệnh 1

{// bắt đầu khối lệnh 3

         // Các lệnh thuộc khối lệnh 3

         // …

} // kết thúc thối lệnh 3

                                     28

----------------------- Page 29-----------------------

2.5.Toán tửvà biểu thức

2.5.Toán tửvà biểu thức

2.5.1.Toán tửsốhọc

2.5.1.Toán tửsốhọc

              Toán tử                                 Ý nghĩa

           +                   Cộng

           -                   Trừ

           *                   Nhân

           /                   Chia nguyên

           %                   Chia d

           ++                  Tăng 1

           --                  Giảm 1

2.5.2.Toán tửtrên bit

2.5.2.Toán tửtrên bit

              Toán tử                                 Ý nghĩa

           &                   AND

           |                   OR

           ^                   XOR

           <<                  Dịch trái

           >>                  Dịch phải

           >>>                 Dịch phải và điền 0 vào bit trống

           ~                   Bù bit

2.5.3.Toán tửquan hệ& logic

2.5.3.Toán tửquan hệ& logic

              Toán tử                                 Ý nghĩa

           ==                  So sánh bằng

           !=                  So sánh khác

           >                   So sánh lớn hơn

           <                   So sánh nhỏ hơn

           >=                  So sánh lớn hơn hay bằng

           <=                  So sánh nhỏ hơn hay bằng

                                            29

----------------------- Page 30-----------------------

         ||               OR (biểu thức logic)

         &&               AND (biểu thức logic)

         !                NOT (biểu thức logic)

2.5.4.Toán tửép kiểu

2.5.4.Toán tửép kiểu

     -   Ép kiểu rộng (widening conversion): từkiểu nhỏ sang

         kiểu lớn (không mất mát thông tin)

     -   Ép kiểu hẹp (narrow conversion): từkiểu lớn sang kiểu

         nhỏ (có khả năng mất mát thông tin)

                  <tên biến> = (kiểu_dữ_liệu) <tên_biến>;

                  <tên biến> = (kiểu_dữ_liệu) <tên_biến>;

                   Ví d  :

                   Ví d  :

                           f loatf Num = 2.2;

                           f loatf Num = 2.2;

                           int iCount = (int) f Num; // (iCount = 2)

                           int iCount = (int) f Num; // (iCount = 2)

2.5.5.Toán tửđiều kiện

2.5.5.Toán tửđiều kiện

Cú pháp: <điều kiện> ? <biểu thức 1> : < biểu thức 2>

Cú pháp: <điều kiện> ? <biểu thức 1> : < biểu thức 2>

Nếu điều kiện đúng thì có giá trị, hay thực hiện <biểu thức  1>,

Nếu điều kiện đúng thì có giá trị, hay thực hiện <biểu thức  1>,

còn ng    ợc lại là <biểu thức 2>.

còn ng    ợc lại là <biểu thức 2>.

<điều kiện>: là một biểu thức logic

<điều kiện>: là một biểu thức logic

<biểu thức  1>, <biểu thức 2>: có thể là hai giá trị, hai biểu thức

<biểu thức  1>, <biểu thức 2>: có thể là hai giá trị, hai biểu thức

hoặc hai hành động.

hoặc hai hành động.

Ví d   :

 Ví d  :

         int x  = 10;

         int x  = 10;

         int y  = 20;

         int y  = 20;

         int Z = (x<y)  ? 30 : 40;

         int Z = (x<y)  ? 30 : 40;

         // K  t quảz  = 30 do biểu thức (x <y)  là đúng.

         // K  t quảz  = 30 do biểu thức (x <y)  là đúng.

2.5.6.Thứtựưu tiên

2.5.6.Thứtựưu tiên

Thứ tự u tiên tính từtrái qua phải và từtrên xuống dưới

      Cao nhất

                                     30

----------------------- Page 31-----------------------

       ()                 []                           .

       ++                 --                           ~                  !

       *                  /                            %

       +                  -

       >>                 >>> (dịch ph ải và           <<

                          điền 0 vào bit trống)

       >                  >=                           <                  <=

       ==                 !=

       &

       ^

       |

       &&

       ||

       ?:

       =                  <toántử>=

       Thấp nhất

2.6.Cấu trúc điều khiển

2.6.Cấu trúc điều khiển

2.6.1.Cấu trúc điều kiện if … else

2.6.1.Cấu trúc điều kiện if … else

Dạng 1:

Dạng 1:

           if (<điều_kiện>)

           if (<điều_kiện>)

           {

           {

                     <khối_lệnh>;

                      <khối_lệnh>;

           }

           }

Dạng 2:

Dạng 2:

           if (<điều_kiện>)

           if (<điều_kiện>)

           {

           {

                     <khối _lệnh1>;

                      <khối _lệnh1>;

           }

           }

           else

           else

           {

           {

                     <khối _lệnh2>;

                      <khối _lệnh2>;

                                            31

----------------------- Page 32-----------------------

            }

            }

2.6.2.Cấu trúc switch … case

2.6.2.Cấu trúc switch … case

            switch (<biến>)

            switch (<biến>)

            {

            {

                       case <giátrị_1>:

                        case <giátrị_1>:

                                   <khối_lệnh_1>;

                                   <khối_lệnh_1>;

                                   break;

                                   break;

                                   ….

                                    ….

                       case <giátrị_n>:

                        case <giátrị_n>:

                                   <khối_lệnh_n>;

                                   <khối_lệnh_n>;

                                   break;

                                   break;

                       default:

                        default:

                                   <khối lệnh default>;

                                   <khối lệnh default>;

            }

            }

2.6.3.Cấu trúc lặp

2.6.3.Cấu trúc lặp

Dạng 1: while(…)

Dạng 1: while(…)

            while (điều_kiện_lặp)

            while (điều_kiện_lặp)

            {

            {

                       khối _lệnh;

                        khối _lệnh;

            }

            }

Dạng 2: do  { … } while;

Dạng 2: do  { … } while;

            do

            do

            {

            {

                       khối_lệnh;

                        khối_lệnh;

            } while (điều_kiện);

            } while (điều_kiện);

Dạng 3: for (…)

Dạng 3: for (…)

            for (khởi_tạo_biến_đếm;đk_lặp;tăng_biến)

            for (khởi_tạo_biến_đếm;đk_lặp;tăng_biến)

            {

            {

                       <khối _lệnh>;

                        <khối _lệnh>;

                                                32

----------------------- Page 33-----------------------

          }

          }

 2.6.4.Cấu trúc lệnh nhảy (jump)

 2.6.4.Cấu trúc lệnh nhảy (jump)

 Lệnh  break:  trong   cấu      trúc   switch   chúng  ta  dùng  câu   lệnh

 break để thoát thỏi cấu trúc switch trong cùng chứa nó. Tương

 tự nh     vậy,  trong   cấu  trúc   lặp,  câu   lệnh  break  dùng  để thóat

 khỏi cấu trúc lặp trong cùng chứa nó.

 Lệnh continue: dùng để tiếp tục vòng lặp trong cùng chứa nó

 (ngược với break).

 Nhãn (label):

 Không giống nh        C/C++, Java không hỗ trợ lệnh goto để nhảy

 đến  1 vịtrí nào đó của chương trình. Java dùng kết hợp nhãn

 (label)   với   từ khóa  break  và  continue  để thay  thế cho   lệnh

 goto.

 Ví d  :

 label:

f or (…)

 {       f or (…)

          {        if (<biểu thức điều kiện>)

                            break label;

                   else

                            continue label;

         }

}

 Lệnh “label:” xác định vịtrí của nhãn và xem nh              tên của vòng

 lặp ngoài. Nếu <biểu thức điều kiện> đúng thì lệnh break label

 sẽ thực  hiện  việc  nhảy  ra  khỏi  vòng   lặp      có  nhãn  là   “label”,

 ngược lại sẽ tiếp tục vòng lặp  có nhãn “label” (khác với break

 và continue thông thường  chỉ thoát  khỏi hay tiếp tục vòng lặp

 trong cùng chứa nó.).

 2.7.Lớp bao kiểu dữliệu cơsở(Wrapper Class)

 2.7.Lớp bao kiểu dữliệu cơsở(Wrapper Class)

   Data type           Wrapper Class                      Ghi chú

                                      33

----------------------- Page 34-----------------------

                        (java.lang.*)

boolean             Boolean                    -  Gói    (package):     chứa

byte                Byte                       nhóm nhiều class.

short               Short                      - Ngoài các Wrapper

char                Character                  Class, góijava.lang còn

int                 Integer                    cung cấp các lớp nền

long                Long                       tảng cho việc thiết kế

Float               Float                      ngôn ngữjava nh       :

double              Double                     String, Math, …

2.8.Kiểu dữliệu mảng

2.8.Kiểu dữliệu mảng

Nh    chúng ta đã biết Java có 2 kiểu dữ liệu

     -   Kiểu dữ liệu cơ sở(Primitive data type)

     -   Kiểu dữ liệu tham chiếu hay dẫn xuất (reference data

         type): thường có 3 kiểu:

              o Kiểu mảng

              o Kiểu lớp

              o Kiểu giao tiếp(interface).

Ởđây chúng ta sẽtìm hiểu một số vấn đề cơ bản liên quan đền

kiểu mảng. Kiểu lớp(class) và giao tiếp(interface) chúng ta sẽ

tìm hiểu chi tiết trong chương 3 và các chương sau.

2.8.1.Khái niệm mảng

2.8.1.Khái niệm mảng

Mảng là tập hợp nhiều phần tử có cùng tên, cùng kiểu dữ liệu

và mỗi phần tửtrong mảng được truy xuất thông qua chỉ số của

nó trong mảng.

2.8.2.Khai báo mảng

2.8.2.Khai báo mảng

         <kiểu dữ liệu>             <tên mảng>[];

hoặc     <kiểu dữ liệu>[]           <tên mảng>;

Ví d   :

         int      arrInt[];

hoặc     int[]    arrInt;

                                      34

----------------------- Page 35-----------------------

         int[]    arrInt 1, arrInt2, arrInt3;

2.8.3.Cấp phát bộnhớcho mảng

2.8.3.Cấp phát bộnhớcho mảng

- Không giống nh        trong C, C++ kích thước của mảng được xác

định khi khai báo. Chẳng hạn nh         :

         int arrInt[100] ; // Khai báo náy  trong Java sẽ bị báo lỗi.

- Để cấp phát bộ nhớ cho mảng trong Java ta cần dùng từ khóa

new. (Tất   cả trong Java đều thông qua các đối tượng). Chẳng

hạn để cấp phát vùng nhớcho mảng trong Java ta làm nh                  sau:

         int arrInt = new int[100] ;

2.8.4.Khởi tạo mảng

2.8.4.Khởi tạo mảng

Chúng  ta  có  thể khởi  tạo  giá trị ban đầu  cho  các phần  tử  của

mảng khi nó được khai báo.

Ví d   :

         int      arrInt[]           = {1, 2, 3};

         char     arrChar[]          = { ‘a ’,  ‘b ’,  ‘c ’};

         String   arrStrng[]         = {“ABC”,  “EFG”,  ‘GHI’};

2.8.5.Truy cập mảng

2.8.5.Truy cập mảng

Chỉ số mảng trong Java bắt đầu t           0. Vì vậy phần tử đầu tiên có

chỉ số là 0, và phần tử thứ n có chỉ số là n-1. Các phần tử của

mảng được truy xuất thông qua chỉ số của nó đặt giữa cặp dấu

ngoặc vuông ([]).

Ví d   :

         int arrInt[] = {1, 2, 3};

         int x  = arrInt[0] ; // x sẽ có giá trị là 1.

         int y  = arrInt[1] ; // y sẽ có giá trị là 2.

         int z  = arrInt[2] ; // z sẽ có giá trị là 3.

Lưu   ý: Trong  nh      ng  ngôn  ngữ  lập  trình  khác  (C  chẳng  hạn),

một  chuỗi được xem nh            một   mảng  các ký  tự. Trong java thì

                                     35

----------------------- Page 36-----------------------

khác, java  cung  cấp   một   lớp  String để làm việc  với đối  tượng

dữ liệu chuỗi cùng khác thao tác trên đối tượng dữ liệu này.

2.9.Một sốví dụminh họa:

2.9.Một sốví dụminh họa:

 Ví d   1: Nhập ký tự từbàn phím

impo rtj ava.io.*;

/ *gói này cung cấp  thự viện xuất nhập hệ thống thông qua

những luồng dữ//liệu và hệ thốngf ile.*/

class InputChar

{

         pub lic static void main(String args[])

         {

                  char ch =  ‘’;

                  try

                   {

                           ch = (char)  System.in.read();

                  }

                  catch(Excep tion e)

                   {

                           System.out.p rintln(“Nhập lỗi!”);

                  }

                  System.out.p rintln(“Ky  tu vua nhap: ” + ch);

         }

}

 Ví d   2: Nhập dữ liệu số

impo rtj ava.io.*;

class inputNum

{        pub lic static void main(String[] args)

         {        int n=0;

                  try

                   {       Buff eredReader in =

                                    new Buff eredReader(

                                      36

----------------------- Page 37-----------------------

                                              new InputStreamReader(

                                              System.in));

                           String s;

                           s = in.readLine();

                           n = Integer.pa rseInt(s);

                  }

                  catch(Excep tion e)

                   {       System.out.p rintln(“Nhập dữ liệu bị

                                                       lỗi !”);

                  }

                  System.out.p rintln(“Bạn vừa nhập số: ” + n);

         }

}

 Ví d   3: Nhập và xuất giá trị các phần tử của một mảng các số

nguyên.

class ArrayDemo

{

         pub lic static void main(String args[])

         {

                  int arrInt[] = new int[10] ;

                  int i;

                  f or(i = 0; i < 10; i = i+1)

                           arrInt[i]  = i;

                  f or(i = 0; i < 10; i = i+1)

                           System.out.p rintln("This is arrInt[ " + i +

                            "] : " + arrInt[i]);

         }

}

                                      37

----------------------- Page 38-----------------------

 Ví   d   4:  Tìm  phần   tử có  giá  trị nhỏ nhất  (Min)  và   lớn  nhất

(Max) trong một mảng.

class MinMax

{        pub lic static void main(String args[])

         {        int nums[] = new int[10] ;

                  int min, max;

                  nums[0]  = 99;

                  nums[1]  = -10;

                  nums[2]  = 100123;

                  nums[3]  = 18;

                  nums[4]  = -978;

                  nums[5]  = 5623;

                  nums[6]  = 463;

                  nums[7]  = -9;

                  nums[8]  = 287;

                  nums[9]  = 49;

                  min = max  = nums[0] ;

                  f or(int i=1; i < 10; i++)

                  {

                           if (nums[i]  < min)  min = nums[i] ;

                           if (nums[i]  > max)  max  = nums[i] ;

                  }

                  System.out.p rintln("min and max:  " + min  +  " "

                   + max);

         }

}

class MinMax2

                                     38

----------------------- Page 39-----------------------

{

         pub lic static void main(String args[])

         {

                  int nums[] = { 99, -10, 100123, 18, -978,

                                    5623, 463, -9, 287, 49 };

                  int min, max;

                  min = max  = nums[0] ;

                  f or(int i=1; i < 10; i++)

                  {

                           if (nums[i]  < min)  min = nums[i] ;

                           if (nums[i]  > max)  max  = nums[i] ;

                  }

                  System.out.p rintln("Min and max:  " + min + " "

                   + max);

         }

}

 Ví d   5: chương trình minh họa một lỗi tham chiếu đến phần tử

bên ngoài (vuợt quá) kích thước mảng.

class ArrayErr

{        pub lic static void main(String args[])

         {        int samp le[] = new int[10] ;

                  int i;

                  f or(i = 0; i < 100; i = i+1)

                           samp le[i]  = i;

         }

}

                                     39

----------------------- Page 40-----------------------

Ví   d    6:   Sắp   xếp   mảng  dùng  phương  pháp   sắp   xếp   nổi   bọt

(Bubble Sort)

class BubbleSort

{        pub lic static void main(String args[])

         {        int nums[] = { 99, -10, 100123, 18, -978,

                                    5623, 463, -9, 287, 49 };

                  int a, b, t;

                  int size;

                  size = 10; // number of  elements to sort

                  // disp lay original array

                  System.out.p rint("Original array  is:");

                  f or(int i=0; i < size; i++)

                           System.out.p rint(" " + nums[i]);

                  System.out.p rintln();

                  // This is the Bubble sort.

                  f or(a=1; a < size; a++)

                           f or(b=size-1; b >= a; b--)

                           {        if (nums[b-1]  > nums[b])

                                     {       // if  out of  order

                                             // exchange elements

                                              t = nums[b-1] ;

                                             nums[b-1]  = nums[b] ;

                                             nums[b]  = t;

                                    }

                           }

                  // disp lay sorted array

                                     40

----------------------- Page 41-----------------------

                   System.out.p rint("Sorted array  is:");

                  f or(int i=0; i < size; i++)

                            System.out.p rint(" " + nums[i]);

                   System.out.p rintln();

         }

}

 Ví d    7: Nhập và xuất  giá trị của các phần tử trong một mảng

hai chiều.

class TwoD_Arr

{        pub lic static void main(String args[])

          {        int t, i;

                   int table[][] = new int[3][ 4] ;

                  f or(t=0; t < 3; ++t)

                   {       f or(i=0; i < 4; ++i)

                            {        table[t][ i]  = (t*4) +i+1;

                                     System.out.p rint(table[t][ i]       +    "

                                      ");

                            }

                            System.out.p rintln();

                  }

         }

}

                                      41

----------------------- Page 42-----------------------

 Ví d   8: Tạo đối tượng chuỗi

class StringDemo

{

         pub lic static void main(String args[])

         {

                  // Tao chuoi bang nhieu cach khac nhau

                  String  str1  =  new  String("Chuoi  trong j ava  la

                  nhung Obj ects.");

                  String str2  = "Chung duoc xay  dung bang nhieu

                  cach khac nhau.";

                  String str3 = new String(str2);

                  System.out.p rintln(str1);

                  System.out.p rintln(str2);

                  System.out.p rintln(str3);

         }

}

 Ví d   9: Minh họa một sốthao tác cơ bản trên chuỗi

// Chuong trinh minh hoa cac thao tac tren chuoi ky tu

class StrOps

{

         pub lic static void main(String args[])

         {

                  String str1  =  "Java  la chon  lua so mot cho  lap

                  trinh ung dung Web.";

                  String str2 = new String(str1);

                  String str3 = "Java ho tro doi tuong String de xu

                  ly chuoi";

                                      42

----------------------- Page 43-----------------------

 int result, idx;

 char ch;

 System.out.p rintln("str1:" + str1);

 System.out.p rintln("str2:" + str2);

 System.out.p rintln("str3:" + str3);

 System.out.p rintln("Chieu dai cua chuoi str1 la:

 " + str1.length());

 // Hien thi chuoi str1, moi lan mot ky tu.

 System.out.p rintln();

f or(int i=0; i < str1.length();  i++)

            System.out.p rint(str1.charAt(i));

 System.out.p rintln();

 if (str1.equals(str2))

            System.out.p rintln("str1 == str2");

 else

            System.out.p rintln("str1 != str2");

 if (str1.equals(str3))

            System.out.p rintln("str1 == str3");

 else

            System.out.p rintln("str1 != str3");

 result = str1.compa reTo(str3);

 if (result == 0)

            System.out.p rintln("str1 = str3 ");

 else

             if (result < 0)

                        System.out.p rintln("str1 < str3");

             else

                        System.out.p rintln("str1 > str3");

                          43

----------------------- Page 44-----------------------

                  // Tao chuoi moi cho str4

                  String str4 = "Mot Hai Ba Mot";

                   idx  = str4.indexOf ("Mot");

                  System.out.p rintln("str4:" + str4);

                  System.out.p rintln("Vi tri xuat hien dau tien cua

                  chuoi con 'Mot' trong str4: " + idx);

                   idx  = str4.lastIndexOf ("Mot");

                  System.out.p rintln("Vi tri xuat hien sau cung cua

                  chuoi con 'Mot' trong str4:" + idx);

         }

}

 Ví   d  10:  chương  trình  nhập      vào   một    chuỗi  và  in  ra  chuỗi

nghịch đảo của chuỗi nhập.

impo rtj ava.lang.String;

impo rtj ava.io.*;

pub lic class InverstString

 {       pub lic static void main(String arg[])

          {       System.out.p rintln("

  *** CHUONG TRINH IN

                   CHUOI NGUOC *** ");

                   try

                                      44

----------------------- Page 45-----------------------

                   {       System.out.p rintln("

  ***Nhap

                           chuoi:");

                           Buff eredReader in = new

                           Buff eredReader(new

                           InputStreamReader(System.in));

                           // Class Buff eredReader cho ph ép  đọc

                            text từ luồng nhập  ký tự, tạo bộ đệm cho

                           những ký tự để hỗ trợ cho việc đọc những

                           ký tự, những mảng hay những dòng.

                           // Doc 1 dong tu Buff erReadered ket thuc

                           bang dau ket thuc dong.

                           String str = in.readLine();

                           System.out.p rintln("

Chuoi vua nhap

                            la:" + str);

                           // Xuat chuoi nghich dao

                           System.out.p rintln("

Chuoi nghich dao

                            la:");

                           f or (int i=str.length()- 1; i>=0; i--)

                            {       System.out.p rint(str.charAt(i));

                           }

                  }

                  catch (IOExcep tion e)

                   {       System.out.p rintln(e.toString());

                  }

         }

}

 Ví d   11: Lấy chuỗi con của một chuỗi

class SubStr

{

         pub lic static void main(String args[])

         {

                                      45

----------------------- Page 46-----------------------

                    String orgstr = "Mot Hai Ba Bon";

                    // Lay chuoi con dung ham

                    // pub lic String substring(int beginIndex, int

                    // endIndex)

                    String substr = orgstr.substring(4,  7);

                    System.out.p rintln("Chuoi goc: " + orgstr);

                    System.out.p rintln("Chuoi con: " + substr);

          }

}

 Ví d    12: Mảng các chuỗi

class StringArray

{

          pub lic static void main(String args[])

          {

                    String str[] = {"Mot",  "Hai",  "Ba",  "Bon" };

                    System.out.p rint("Mang goc: ");

                   f or(int i=0; i < str.length; i++)

                              System.out.p rint(str[i]  + " ");

                    System.out.p rintln("

");

                    // Thay doi chuoi

                    str[0]  = "Bon";

                    str[1]  = "Ba";

                    str[2]  = "Hai";

                    str[3]  = "Mot";

                    System.out.p rint("Mang thay doi:");

                   f or(int i=0; i < str.length; i++)

                              System.out.p rint(str[i]  + " ");

                                        46

----------------------- Page 47-----------------------

                  System.out.p rint("

");

         }

}

 Chương 3: HƯỚNG ĐỐI TƯỢNG TRONG JAVA

 Chương 3: HƯỚNG ĐỐI TƯỢNG TRONG JAVA

3.1.Mởđầu

3.1.Mởđầu

     Thông    qua   chuyên    đề  lập   trình   hướng   đối   tượng   (OOP)

chúng ta đã biết OOP là một trong những tiếp cận mạnh mẽ, và

                                      47

----------------------- Page 48-----------------------

 rất hiệu quả để xây dựng nên những chương trình ứng dụng trên

 máy tính. Từ khi ra đời cho đến nay lập trình OOP đã chứng tỏ

 được sức mạnh, vai trò của nó trong các đề án tin học. Ch               ơng

                                                                      h  ơng

 này sẽ giúp bạn đọc tìm hiểu về các kiểu dữ liệu dẫn xuất đó là

 này sẽ giúp bạn đọc tìm hiểu về các kiểu dữ liệu dẫn xuất đó là

 lớp  (class) và giao tiếp  (interface), cũng nh        các vấn đề cơ bản

 lớp  (class) và giao tiếp  (interface), cũng nh        các vấn đề cơ bản

 về lập trình h    ớng đối t    ợng trong java thông qua việc tạo lập

 về lập trình h    ớng đối t    ợng trong java thông qua việc tạo lập

 các lớp, các đối t    ợng và các tính chất của chúng.

 các lớp, các đối t    ợng và các tính chất của chúng.

 3.2.Lớp (Class)

 3.2.Lớp (Class)

 3.2.1.Khái niệm

 3.2.1.Khái niệm

     Chúng ta có thểxem lớp nh           một khuôn mẫu (template) của

 đối  tượng  (Object).  Trong  đó  bao   gồm  dữ liệu   của  đối  tượng

 (fields hay properties)  và  các  phương  thức(methods)  tác  động

 lên thành phần dữ liệu đó gọi là các phương thức của lớp.

     Các đối  tượng được xây  dựng  bởi các  lớp  nên được  gọi là

 các thểhiện của lớp (class instance).

 3.2.2.Khai báo/định nghĩa lớp

 3.2.2.Khai báo/định nghĩa lớp

 class <ClassName>

 {

          <kiểu dữ liệu> <f ield_1>;

          <kiểu dữ liệu> <f ield_2>;

          constructor

          method_1

          method_2

}

 class: là từkhóa của java

 ClassName: là tên chúng ta đặt cho lớp

f ield_1, f ield_2: các thuộc tính, các biến, hay các thành phần dữ

 liệu của lớp.

 constructor: là sựxây dựng, khởi tạo đối tượng lớp.

 method_1, method_2: là các phương thức/hàm thểhiện các thao

 tác xử lý, tác động lên các thành phần dữ liệu của lớp.

                                      48

----------------------- Page 49-----------------------

3.2.3.Tạo đối tượng của lớp

3.2.3.Tạo đối tượng của lớp

 ClassName objectName = new ClassName();

3.2.4.Thuộc tính của lớp

3.2.4.Thuộc tính của lớp

     Vùng dữ liệu (fields) hay thuộc tính (properties) của lớp

được khai báo bên trong lớp nh          sau:

         class <ClassName>

          {

                  // khai báo những thuộc tính của lớp

                   <tiền tố> <kiểu dữ liệu>f ield1;

                  //  …

         }

     Để xác định quyền truy xuất của các đối tượng khác đối với

vùng dữ liệu của lớp người ta thường dùng 3 tiền tố sau:

         public: có thểtruy xuất từ tất cảcác đối tượng khác

         private: một lớp không thểtruy xuất vùng private của  1

         lớp khác.

         protected: vùng protected  của  1  lớp  chỉ cho  phép   bản

         thân   lớp  đó  và những  lớp   dẫn  xuất   từ  lớp  đó  truy  cập

         đến.

Ví dụ:

pub lic class xemay

 {       pub lic           String   nhasx;

         pub lic           String   model;

         p rivate          f loat   chiph isx;

         p rotected        int      thoigiansx;

         // so luong so cua xe may : 3, 4 so

         p rotected        int      so;

         // sobanhxe là bi  n tĩnh có giá trị là 2 trong tất cả

         // các thể hiện tạo ra từ lớp xemay

                                      49

----------------------- Page 50-----------------------

         pub lic static    int      sobanhxe  = 2;

}

     Thuộc tính “nhasx ”,  “model”có thểđược truy cập đến từ tất

cảcác đối tượng khác.

     Thuộc tính  “chiph isx”  chỉ có  thể truy  cập  được  từ các đối

tượng có kiểu “xemay”

     Thuộc tính “thoigiansx”, so có thểtruy cập được từ các đối

tượng  có kiểu   “xemay”  và các đối  tượng  của các  lớp  con  dẫn

xuất từ lớp  “xemay”

Lưu ý: Thông thường để an toàn cho vùng dữ liệu của các đối

tượng người ta tránh  dùng tiền tố public, mà thường chọn tiền

tố private để ngăn cản quyền truy cập đến vùng dữ liệu của một

lớp từ các phương thức bên ngoài lớp đó.

3.2.5.Hàm - Phương thức lớp (Method)

3.2.5.Hàm - Phương thức lớp (Method)

     Hàm  hay  phương  thức        (method)  trong  Java  là  khối   lệnh

thực hiện các chức năng, các hành vi xử lý của lớp lên vùng dữ

liệu.

Khai báo phương thức:

<Tiền tố> <kiểu trả về> <Tên ph ương thức> (<danh sách đối

số>)

{

         <khối lệnh>;

}

     Để xác định quyền truy xuất của các đối tượng khác đối với

các phương thức của lớp người ta thường dùng các tiền tố sau:

         public: phương thức có thể truy cập được từ bên ngoài

         lớp khai báo.

         protected:  có     thể truy   cập    được   từ  lớp   khai  báo  và

         những lớp dẫn xuất từnó.

         private: chỉ được truy  cập  bên trong bản thân lớp khai

         báo.

                                      50

----------------------- Page 51-----------------------

         static: phương  thức  lớp  dùng  chung  cho  tất   cả các thể

         hiện   của   lớp,  có  nghĩa  là phương  thức  đó  có  thể được

         thực  hiện   kể  cả khi  không  có  đối  tượng   của   lớp  chứa

         phương thức đó.

         final: phương thức có tiền tố này không được khai báo

         chồng ớcác lớp dẫn xuất.

         abstract:  phương       thức   không   cần    cài  đặt  (không    có

         phần source code), sẽ được hiện thực trong các lớp dẫn

         xuất từ lớp này.

         synchoronized: dùng để ngăn các tác động của các đối

         tượng khác lên đối tượng đang xét trong khi đang đồng

         bộhóa. Dùng trong lập trình miltithreads.

 <kiểu trả về>: có thểlà kiểu void, kiểu cơ sởhay một lớp.

 <Tên ph ương thức>: đặt theo qui ước giống tên biến.

 <danh sách thông số>: có thể rỗng

Lưu ý:

     Thông  thường  trong   một   lớp       các  phương  thức  nên  được

khai báo  dùng từ khóa public, khác với vùng dữ liệu thường là

dùng tiền tốprivate vì mục đích an toàn.

     Những biến nằm trong một phương thức của lớp là các biến

cục bộ (local) và nên được khởia tạo sau khi khai báo.

Ví dụ:

pub lic class xemay

 {

         pub lic           String    nhasx;

         pub lic           String   model;

         p rivate          f loat    chiph isx;

         p rotected         int      thoigiansx;

         // so luong so cua xe may : 3, 4 so

         p rotected         int     so;

                                      51

----------------------- Page 52-----------------------

         // là bi  n tĩnh có giá trị là 2 trong tất cả

         // các thể hiện tạo ra từ lớp xemay

         pub lic static     int sobanhxe  = 2;

         pub licf loat tinhgiaban()

          {

                  return 1.5 * chiph isx;

         }

}

3.2.6.Khởi tạo một đối tượng (Constructor)

 3.2.6.Khởi tạo một đối tượng (Constructor)

     Contructor thật ra là một loại phương thức đặc biệt của lớp.

Constructor dùng gọi tự động khi khởi tạo một thểhiện của lớp,

có   thể dùng      để khởi      gán   những     giá  trị  măc    định.   Các

constructor không có  giá trị trả về, và có thể có tham số hoặc

không có tham số.

     Constructor phải có cùng tên với lớp và được gọi đến dùng

từkhóa new.

      Nếu một lớp không có constructor thì java sẽ cung cấp cho

lớp    một   constructor     mặc   định   (default  constructor).     Những

thuộc  tính, biến   của   lớp   sẽ được  khởi  tạo   bởi  các  giá trị  mặc

định (số: thường là giá trị0, kiểu luận lý là giá trịfalse, kiểu đối

tượng giá trịnull, …)

Lưu  ý: thông thường để an toàn, dễ kiểm soát  và làm chủ mã

nguồn chương trình chúng ta nên khai báo một constructor cho

lớp.

Ví dụ:

p ublic class xemay

 {

         //  …

         p ublic xemay ()

                                      52

----------------------- Page 53-----------------------

         {}

         p ublic xemay (String s_nhasx, String s_model,

         f _chiph isx, int i_thoigiansx, int i_so);

         {

                  nhasx  = s_nhasx;

                  model = s_model;

                  chiph isx  =f _chiph isx;

                  thoigiansx  = i_thoigiansx;

                  so = i_so;

                  // hoặc

                  // this.nhasx  = s_nhasx;

                  // this.model = s_model;

                  // this.chiph isx  =f _chiph isx;

                  // this.thoigiansx  = i_thoigiansx;

                  // this.so = i_so;

         }

}

3.2.7.Biến this

3.2.7.Biến this

     Biến  this  là  một  biến  ẩn  tồn  tại trong  tất   cả các  lớp  trong

ngông ngữjava. Một class trong Java luôn tồn tại một biến this,

                                                              một

biến  this  được   sử  dụng  trong  khi  chạy  và  tham khảo  đến  bản

thân lớp chứa nó.

Ví dụ:

<tiền tố> class A

{

     <tiền tố> int <f ield_1>;

     <tiền tố> String <f ield_2>;

     // Contructor của lớp A

    p ublic A(intpa r_1, String pa r_2)

     {

                                      53

----------------------- Page 54-----------------------

         this.f ield_1 =pa r_1;

         this.f ield_2 =pa r_2;

     }

     <tiền tố> <kiểu trả về> <method_1>()

     {

               //  …

     }

     <tiền tố> <kiểu trả về> <method_2>()

     {

                this.method_1()

               //  …

     }

}

3.2.8.Khai báo chồng phương thức (overloading method)

3.2.8.Khai báo chồng phương thức (overloading method)

     Việc khai báo trong một lớp nhiều phương thức có cùng tên

nh   ng khác tham số (khác kiểu dữ liệu, khác số lượng tham số)

gọi là khai báo chồng phương thức (overloading method).

Ví dụ:

pub lic class xemay

 {       // khai báof ields  …

         pub licf loat tinhgiaban()

          {       return 2  * chiph isx;

         }

         pub licf loat tinhgiaban(f loat huehong)

          {       return (2  * chiph isx  + huehong);

         }

}

3.3.Đặc điểm hướng đối tượng trong java

3.3.Đặc điểm hướng đối tượng trong java

      Hỗ trợ những  nguyên   tắc   cơ  bản   của   lập  trình   hướng  đối

tượng,  tất   cả các ngôn ngữ  lập  trình  kể  cảjava đều  có ba đặc

                                      54

----------------------- Page 55-----------------------

điểm    chung:    tính   đóng     gói   (encapsulation),     tính   đa   hình

(polymorphism), và tính kếthừa (inheritance).

3.3.1.Đóng gói (encapsulation)

3.3.1.Đóng gói (encapsulation)

      Cơ chế đóng gói trong lập trình hướng đối tượng giúp  cho

các  đối  tượng   dấu  đi  một  phần  các  chi tiết  cài đặt,  cũng  nh

phần  dữ liệu   cục  bộ  của nó, và chỉ công bố ra ngoài những gì

cần công bố để trao đổi với các đối tượng khác. Hay chúng ta

có thểnói đối tượng là một thành tố hỗtrợtính đóng gói.

     Đơn   vị đóng  gói  cơ  bản   của  ngôn  ngữ java  là  class.  Một

class định nghĩa hình thức của một đối tượng. Một class định rõ

những thành phần  dữ liệu và các đoạn mã cài đặt  các thao tác

xử lý  trên  các  đối   tượng   dữ liệu  đó.  Java  dùng  class  để xây

dựng  những      đối   tượng.  Những  đối   tượng  là  những  thể hiện

(instances) của một class.

      Một   lớp  bao  gồm thành phần  dữ liệu  và thành phần  xử lý.

Thành phần dữ liệu của một lớp thường bao gồm các biến thành

viên và các biến thể hiện của lớp. Thành phần xử lý là các thao

tác trên các thành phần dữ liệu, thường trong java người gọi là

phương  thức. Phương  thức  là  một  thuật  ngữ  hướng đối  tượng

trong  java,  trong  C/C++  người  ta  thường  dùng  thuật  ngữ là

hàm.

3.3.2.Tính đa hình (polymorphism):

3.3.2.Tính đa hình (polymorphism):

     Tính đa hình cho phép cài đặt các lớp dẫn xuất khác nhau từ

một lớp nguồn. Một  đối tượng có thể có nhiều kiểu khác nhau

gọi là tính đa hình.

Ví dụ:

class A_Obj ect

{

         //  …

         void method_1()

         {

                  //  …

                                      55

----------------------- Page 56-----------------------

         }

}

class B_Obj ect extends A_Obj ect

{

         //  …

         void method_1()

         {

                  //  …

         }

}

class C

{        pub lic static void main(String[] args)

         {

                  // Tạo một mảng 2 ph ần tử kiểu A

                  A_Obj ect arr_Obj ect = new A_Obj ect[2] ;

                  B_Obj ect var_1 = new B_Obj ect();

                  //  Phần     tử đầu   tiên   của   mảng    arr_Obj ect[0]

                  tham // chi  u đ n 1 đối tượng kiểu B_Obj ect dẫn

                  xuất // từ A_Obj ect

                  arr_Obj ect[0]  = var_1;

                  A_Obj ect var_2;

                  f or (int i=0; i<2; i++)

                   {

                           var_2 = arr_Obj ect[i] ;

                           var_2.method_1();

                  }

         }

}

Vòng lặp for trong đoạn chương trình trên:

                                      56

----------------------- Page 57-----------------------

     -    Với  i  =  0  thì biến  var_2  có  kiểu  là  B_Object,  và   lệnh

         var_2.method_1()          sẽ   gọi   thực    hiện   phương      thức

         method_1 của lớp B_Object.

     -    Với  i  =  1 thì biến  var_2  có  kiểu  là  A_Object,  và   lệnh

         var_2.method_1()          sẽ   gọi   thực    hiện   phương      thức

         method_1 của lớp A_Object.

     Trong ví dụ trên đối tượng var_2 có thểnhận kiểu A_Object

hay   B_Object.     Hay    nói  các   khác,    một   biến  đối   tượng    kiểu

A_Object nh       var_2 trong ví dụ trên có thể tham chiếu đến bất

kỳ đối tượng nào của bất kỳ lớp  con nào của lớp A_Object  (ví

dụ var_2  có  thể tham chiếu  đến đối  tượng var_1, var_1  là đối

tượng  của  lớp  B_Object   dẫn xuất từ lớp A_Object). Ngược lại

một   biến   của   lớp  con  không  thể tham  chiếu  đến   bất   kỳ đối

tượng nào của lớp cha.

3.3.3.Tính kếthừa (inheritance)

3.3.3.Tính kếthừa (inheritance)

      Một lớp con (subclass) có thể kếthừa tất cảnhững vùng dữ

liệu  và phương  thức  của  một   lớp  khác  (siêu   lớp  -  superclass).

Nh      vậy việc  tạo  một   lớp   mới  từ  một   lớp  đã biết  sao  cho  các

thành  phần  (fields  và  methods)   của   lớp   cũ  cũng   sẽ thành  các

thành phần  (fields và methods)  của  lớp   mới. Khi đó ta gọi lớp

mới  là   lớp   dẫn  xuất  (derived  class)   từ  lớp   cũ (superclass). Có

thể lớp cũ cũng là lớp được dẫn xuất từ một lớp nào đấy, nh                 ng

đối  với  lớp   mới  vừa  tạo  thì  lớp   cũ đó  là một lớp  siêu lớp trực

tiếp (immediate supperclass).

     Dùng từkhóa extends đểchỉ lớp dẫn xuất.

     class A extends B

     {

         //  …

      }

3.3.3.1 Khái báo phương thức chồng

                                      57

----------------------- Page 58-----------------------

     Tính   kế thừa  giúp  cho  các   lớp  con  nhận  được  các  thuộc

tính/phương  thức  public  và  protected   của   lớp  cha.  Đồng  thời

cũng  có  thể thay  thế các  phương  thức  của  lớp  cha  bằng  cách

khai báo  chồng. Chẳng hạn phương thức tinhgiaban() áp dụng

trong lớp xega  sẽ cho kết quả gấp 2.5 lần chi phí sản xuất thay

vì gấp 2 chi phí sản xuất giống nh         trong lớp xemay.

Ví dụ:

pub lic class xega extends xemay

 {

         pub lic xega()

          {

         }

         pub lic xega(String s_nhasx, String s_model,f _chiph isx,

         int i_thoigiansx);

          {

                   this.nhasx  = s_nhasx;

                   this.model = s_model;

                   this.chiph isx  =f _chiph isx;

                   this.thoigiansx  = i_thoigiansx;

                   this.so = 0;

         }

         pub licf loat tinhgiaban()

          {

                  return 2.5 * chiph isx;

         }

}

Java cung cấp 3 tiền tố/từkhóa để hỗtrợtính kếthừa của lớp:

         public:   lớp   có  thể truy   cập   từ các  gói,  chương  trình

         khác.

         final: Lớp hằng, lớp không thể tạo dẫn xuất (không thể

         có con), hay đôi khi người ta gọi là lớp “vô sinh”.

                                      58

----------------------- Page 59-----------------------

         abstract: Lớp trừu tượng (không có khai báo các thành

          abstract:

         phần và các phương thức trong lớp trừu tượng). Lớp dẫn

         xuất   sẽ khai báo, cài đặt cụ thể các thuộc tính, phương

         thức của lớp trừu tượng.

3.3.3.2 Lớp nội

      Lớp nội là lớp được khai báo bên trong 1 lớp khác. Lớp nội

thểhiện tính đóng gói cao và có thểtruy xuất trực tiếp biến của

lớp cha.

Ví dụ:

pub lic class A

 {

         //  …

         int <f ield_1>

         static class B

          {

                  //  …

                   int <f ield_2>

                  pub lic B(intpa r_1)

                   {

                           f ield_2 =pa r_1 +f ield_1;

                  }

         }

}

Trong ví dụtrên thì chương trình dịch sẽ tạo ra hai lớp với hai

files khác nhau: A.class và B.class

3.3.3.3 Lớp vô sinh

      Lớp không thể có lớp dẫn xuất từ nó (không có lớp con) gọi

là lớp  “vô  sinh”, hay nói cách khác không thể kế thừa được từ

một   lớp  “vô  sinh”. Lớp  “vô  sinh” dùng để hạn chế, ngăn ngừa

các lớp khác dẫn xuất từnó.

                                      59

----------------------- Page 60-----------------------

     Đểkhai báo một lớp là lớp “vô sinh”, chúng ta dùng từkhóa

final class.

      Tất cảcác phương thức của lớp vô sinh đều vô sinh, nh              ng

các thuộc tính của lớp vô sinh thì có thểkhông vô sinh.

Ví dụ:

pub licf inal class A

 {

         pub licf inal int x;

         p rivate int y;

         pub licf inal void method_1()

          {

                  //  …

         }

         pub licf inal void method_2()

          {

                  //  …

         }

}

3.3.3.4 Lớp trừu tượng

      Lớp  trừu   tượng  là   lớp  không  có  khai báo  các  thuộc  tính

thành  phần  và  các  phương  thức.  Các   lớp   dẫn  xuất   của  nó   sẽ

khai báo thuộc tính, cài đặt cụ thể các phương thức của lớp trừu

tượng.

Ví dụ:

abstract class A

 {

     abstract void method_1();

                                      60

----------------------- Page 61-----------------------

}

pub lic class B extends A

 {

     pub lic void method_1()

     {

         // cài đặt chi ti  t cho ph ương thức method_1

         // trong lớp  con B.

         //  …

     }

}

pub lic class C extends A

 {

     pub lic void method_1()

     {

         // cài đặt chi ti  t cho ph ương thức method_1

         // trong lớp  con C.

         //  …

     }

}

Lưu     ý:  Các   phương     thức   được   khai  báo    dùng    các  tiền   tố

private    và   static   thì  không    được    khai   báo   là  trừu    tượng

abstract. Tiền tố private thì không thểtruy xuất từ các lớp dẫn

xuất, còn tiền tố static thì chỉ dùng riêng cho lớp khai báo mà

thôi.

3.3.3.5 Phương thức finalize()

     Trong  java  không      có  kiểu   dữ liệu    con  trỏ nh     trong  C,

người lập trình không cần phải quá bận tâm vềviệc cấp phát và

giải phóng  vùng  nhớ,   sẽ có   một  trình   dọn   dẹp   hệ thống  đảm

trách việc này. Trình dọn dẹp hệthống sẽ dọn dẹp vùng nhớ cấp

phát cho các đối tượng trước khi hủy một đối tượng.

     Phương thứcf inalize()  là một phương thức đặc biệt được cài

đặt sẵn cho các lớp. Trình dọn dẹp hệthống sẽ gọi phương thức

này  trước  khi  hủy  một  đối  tượng. Vì  vậy  việc  cài đặt   một   số

                                      61

----------------------- Page 62-----------------------

thao tác giải phóng, dọn dẹp vùng nhớ đã cấp phát cho các đối

tượng   dữ liệu  trong  phương  thức f inalize()       sẽ giúp  cho  người

lập trình chủ động kiểm soát tốt quá trình hủy đối tượng thay vị

giao cho trình dọn dẹp hệthống tự động. Đồng thời việc cài đặt

trong   phương     thức f inalize()   sẽ giúp     cho   bộ nhớ được       giải

phóng tốt hơn, góp phần cải tiến tốc độ chương trình.

Ví dụ:

class A

{

     // Khai báo các thuộc tính

    pub lic void method_1()

     {

         //  …

     }

    p rotected voidf inalize()

     {

         // Có thể dùng để đóng tất cả các k  t nối

         // vào cơ sở dữ liệu trước khi hủy đối tượng.

         //  …

     }

}

3.4.Gói (packages)

3.4.Gói (packages)

     Việc   đóng    gói  các   lớp   lại   tạo thành   một  th   viện   dùng

chung gọi là package.

      Một package có thể chứa một hay nhiều lớp bên trong, đồng

thời cũng có thểchứa một package khác bên trong.

                                      62

----------------------- Page 63-----------------------

     Để khai báo một lớp thuộc một gói nào đấy ta phải dùng từ

khóa package.

     Dòng khai báo  gói phải là dòng đầu tiên trong tập tin khai

báo lớp.

     Các tập tin khai báo lớp trong cùng một  gói phải được l               u

trong cùng một th        mục.

Lưu ý: Việc khai báo import tất cả các lớp trong gói sẽlàm tốn

bộ nhớ. Thông thường  chúng ta chỉ nên  import  những lớp cần

dùng trong chương trình.

Ví dụ:

pa ckage phuong tiengiaothong;

class xemay

 {

         //  ….

}

class xega extends xemay

 {

         //  …

}

Khi đó  muốn   sử  dụng   lớp xemay  vào  chương  trình  ta  sẽ khai

báo nh     sau:

         impo rt phuong tiengiaothong.xemay;

3.5.Giao diện (interface)

 3.5.Giao diện (interface)

3.5.1.Khái niệm interface:

 3.5.1.Khái niệm interface:

     Nh    chúng ta đã biết một lớp trong java chỉcó một siêu lớp

trực tiếp hay một  cha duy nhất (đơn thừa kế). Để tránh đi tính

phức     tạp  của  đa   thừa    kế (multi-inheritance)     trong    lập trình

hướng đối tượng, Java thay thế bằng giao tiếp  (interface). Một

lớp  có  thể có  nhiều  giao  tiếp  (interface)   với  các   lớp  khác  để

                                      63

----------------------- Page 64-----------------------

thừa hưởng thêm vùng dữ liệu và phương thức của các giao tiếp

này.

3.5.2.Khai báo interface:

3.5.2.Khai báo interface:

     Interface được khai báo nh         một lớp. Nh      ng các thuộc tính

của interface là các  hằng  (khai báo  dùng  từ khóa  final) và các

phương thức  của giao  tiếp  là trừu   tượng (mặc dù không có từ

khóa abstract).

     Trong các lớp  có  cài đặt  các interface ta phải tiến hành cài

đặt cụthểcác phương thức này.

Ví dụ:

pub lic interf ace sanpham

 {       static   f inal   String    nhasx  = “Honda VN ”;

         static   f inal   String    dienthoai = “08-8123456 ”;

         pub lic   int     gia(String s_model);

}

// khai báo 1 lớp  có cài đặt interf ace

pub lic class xemay imp lements sanpham

 {       // cài đặt lạiph ương thức của giao diện trong lớp

         pub lic   int     gia(String s_model)

          {

                   if (s_model.equals(“2005 ”))

                           return (2000);

                  else

                           return (1500);

         }

         pub lic  String chobietnhasx()

          {

                  return (nhasx);

         }

}

                                      64

----------------------- Page 65-----------------------

     Có   một   vấn  đề khác   với   lớp  là   một   giao  diện  (interface)

không  chỉ có   một  giao  diện  cha trực tiếp  mà  có  thể  dẫn  xuất

cùng lúc nhiều giao diện khác (hay có nhiều giao diện cha). Khi

đó nó sẽ kế thừa tất cả các giá trị hằng và các phương thức của

các giao diện cha. Các giao diện cha được liệt kê thành chuỗi và

cách nhau bởi dấu phẩy “,”. Khai báo nh            sau:

p ublic interf ace Interf aceName extends interf ace1, interf ace2,

interf ace3

 {

         //  …

}

3.5.3.Ví dụminh họa

 3.5.3.Ví dụminh họa

Ví dụ 1: Minh họa tính đa hình (polymorphism) trong phân cấp

kế thừa thông qua việc mô tả và xử lý một số thao tác cơ bản

trên các đối tượng hình học.

// Định nghĩa lớp  trừu tượng cơ sở tên Shape trong

// tập  tin Shape.j ava

pub lic abstract class Shape extends Obj ect

 {

     // trả về diện tích của một đối tượng hình học shape

     pub lic double area()

     {

         return 0.0;

     }

     // trả về thể tích của một đối tượng hình học shape

     pub lic double volume()

     {

         return 0.0;

     }

                                      65

----------------------- Page 66-----------------------

     // Phương thức trừu tượng cần ph ải được hiện thực

     // trong những lớp  con để trả về tên đối tượng

     // hình học shape thích hợp

     pub lic abstract String getName();

} // end class Shape

// Định nghĩa lớp Point trong tập  tin Point.j ava

pub lic class Point extends Shape

 {

         p rotected int x, y; // Tọa độx, y của 1 điểm

         // constructor không tham số.

         pub lic Point()

          {

                   setPoint( 0, 0);

         }

         // constructor có tham số.

         pub lic Point(int xCoordinate, int y Coordinate)

          {

                   setPoint( xCoordinate, y Coordinate);

         }

         // gán tọa độx, y cho 1 điểm

         pub lic void setPoint( int xCoordinate, int y Coordinate)

          {

                   x  = xCoordinate;

                   y  =y Coordinate;

         }

         // lấy tọa độx của 1 điểm

         pub lic int getX ()

          {

                   return x;

         }

                                       66

----------------------- Page 67-----------------------

         // lấy tọa độy của 1 điểm

         pub lic int getY()

         {

                  return y;

         }

         // Thể hiện tọa độ của 1 điểm dưới dạng chuỗi

         pub lic String toString()

         {

                  return  "[ " + x  + ",  " +y  + "] ";

         }

         // trả về tên của đối tượng shape

         pub lic String getName()

         {

                  return  "Point";

         }

} // end class Point

     Định  nghĩa   một   lớp  cha  Shape  là  một   lớp  trừu   tượng  dẫn

xuất    từ Object   và  có   3  phương  thức  khai  báo       dùng  tiền   tố

public. Phương thức getName() khai báo trừu tượng vì vậy nó

phải  được  hiện  thực  trong  các   lớp      con.  Phương  thức  area()

(tính  diện  tích)  và  phương  thức  volume()  (tính  thể tích)  được

định nghĩa và trả về 0.0. Những phương thức này sẽ được khai

báo  chồng trong  các  lớp  con để thực hiện chức năng tính diện

tích  cũng  nh     thể tích phù   hợp   với những  đối  tượng hình  học

tương ứng (đường tròn, hình trụ, …)

      Lớp  Point:   dẫn  xuất   từ  lớp  Shape.  Một  điểm  thì  có  diện

tích  và  thể tích  là  0.0,  vì   vậy  những  phương  thức  area()  và

volume()      của   lớp cha  không   cần     khai  báo   chồng  trong   lớp

Point,  chúng  được  thừa   kế nh         đã  định  nghĩa  trong   lớp  trừu

tượng  Shape.  Những  phương  thức  khác  nh              setPoint(…)  để

                                      67

----------------------- Page 68-----------------------

gán tọa độ x, y cho một điểm, còn phương thức getX(), getY()

trả về tọa độ x, y của một điểm. Phương thức getName() là hiện

thực   cho   phương     thức   trừu    tượng   trong    lớp  cha,   nếu  nh

phương     thức   getName()      mà  không     được    định  nghĩa  thì   lớp

Point là một lớp trừu tượng.

// Định nghĩa lớp  Circle trong tập  tin Circle.j ava

pub lic class Circle extends Point

 {       // Dẫn xuất từ lớpPoint

         p rotected double radius;

         // constructor không tham số

         pub lic Circle()

          {

                  // ngầm gọi đ n constructor của lớp  cha

                  setRadius( 0);

         }

         // constructor có tham số

         pub lic Circle( double circleRadius, int xCoordinate,

         int y Coordinate)

          {

                  // gọi constructorcủa lớp  cha

                  super( xCoordinate, y Coordinate);

                  setRadius( circleRadius );

         }

         // Gán bán kính của đường tròn

         pub lic void setRadius( double circleRadius )

          {

                  radius = ( circleRadius >= 0 ? circleRadius:0);

         }

         // Lấy bán kính của đường tròn

                                      68

----------------------- Page 69-----------------------

         pub lic double getRadius()

         {

                  return radius;

         }

         // Tính diện tích đường tròn Circle

         pub lic double area()

         {

                  return Math.PI  * radius  * radius;

         }

         // Biểu diễn đường tròn bằng một chuỗi

         pub lic String toString()

         {

                  return  "Center = " + super.toString()  +

                   "; Radius = " + radius;

         }

         // trả về tên của shape

         pub lic String getName()

         {

                  return  "Circle";

         }

} // end class Circle

      Lớp  Circle   dẫn  xuất   từ  lớp  Point,  một  đường  tròn  có  thể

tích  là  0.0,  vì   vậy  phương  thức  volume()   của   lớp  cha  không

khai báo  chồng, nó   sẽ thừa  kế  từ  lớp  Point, mà  lớp  Point thì

thừa kế từ lớp Shape. Diện tích đường tròn khác với một điểm,

vì vậy phương thức tính diện tích  area() được khai báo chồng.

Phương thức  getName() hiện thực phương thức trừu tượng đã

khai báo trong lớp cha, nếu phương thức getName() không khai

báo  trong   lớp  Circle  thì nó   sẽ  kế thừa   từ  lớp  Point.  Phương

thức setRadius dùng để gán một bán kính (radius) mới cho một

                                      69

----------------------- Page 70-----------------------

đối  tượng đường tròn, còn phương thức  getRadius trả  về bán

kính của một đối tượng đường tròn.

// Định nghĩa lớp  hình trụ Cylinder

// trong tập  tin Cylinder.j ava.

pub lic class Cylinder extends Circle

 {

         // chiều cao của Cylinder

         p rotected double height;

         // constructor không có tham số

         pub lic Cylinder()

          {

                  // ngầm gọi đ n constructor của lớp  cha

                  setHeight( 0);

         }

         // constructor có tham số

         pub lic Cylinder( double cylinderHeight,

         double cylinderRadius, int xCoordinate,

          int y Coordinate)

          {

                  // Gọi constructor của lớp  cha

                  super( cylinderRadius, xCoordinate,

                  y Coordinate);

                  setHeight( cylinderHeight);

         }

         // Gán chiều cao cho Cylinder

         pub lic void setHeight( double cylinderHeight)

          {

                  height = ( cylinderHeight >= 0 ? cylinderHeight

                   :0);

         }

                                      70

----------------------- Page 71-----------------------

          // Lấy chiều cao của Cylinder

         pub lic double getHeight()

          {

                  return height;

         }

         // Tính diện tích xung quanh của Cylinder

         pub lic double area()

          {

                  return 2  *super.area()  + 2  *Math.PI  * radius  *

                  height;

         }

         // Tính thể tích của Cylinder

         pub lic double volume()

          {

                  return super.area()      * height;

         }

         // Biểu diễn Cylinder bằng một chuỗi

         pub lic String toString()

          {

                  return super.toString()  + "; Height = " + height;

         }

         // trả về tên của shape

         pub lic String getName()

          {

                  return  "Cylinder";

         }

} // end class Cylinder

                                      71

----------------------- Page 72-----------------------

      Lớp  Cylinder   dẫn  xuất   từ  lớp  Circle.   Một  Cylinder  (hình

trụ)  có  diện tích và thể tích khác với một  Circle (hình tròn), vì

vậy  cả hai phương thức  area() và volume()  cần phải khai báo

chồng. Phương thức getName()  là hiện thực phương thức trừu

tượng  trong  lớp  cha,  nếu  phương  thức  getName() không  khai

báo trong lớp Cylinder thì nó sẽ kếthừa từ lớp Circle. Phương

thức  setHeight dùng để gán chiều  cao mới cho một  đối tượng

hình trụ, còn phương thức getHeight trả về chiều cao của một

đối tượng hình trụ.

// Test.j ava

// Kiểm tra tính k     thừa của Point, Circle, Cylinder với

// lớp  trừu tượng Shape.

// Khai báo thư viện

impo rtj ava.text.DecimalFormat;

pub lic class Test

 {

     // Kiểm tra tính k     thừa của các đối tượng hình học

     pub lic static void main( String args[] )

     {

         // Tạo ra các đối tượng hìnhhọc

         Pointpo int = new Point( 7, 11);

          Circle circle = new Circle( 3.5, 22, 8);

          Cylinder cylinder = new Cylinder( 10, 3.3, 10, 10);

         // Tạo một mảng các đối tượng hình học

         Shape array Of Shapes[] = new Shape[ 3 ];

         // array Of Shapes[ 0 ] là một đối tượng Point

         array Of Shapes[ 0 ] =po int;

         // array Of Shapes[ 1 ] là một đối tượng Circle

         array Of Shapes[ 1 ] = circle;

         // array Of Shapes[ 2 ] là một đối tượng cylinder

         array Of Shapes[ 2 ] = cylinder;

         // Lấy  tên và biểu diễn của mỗi đối tượng hình học

                                      72

----------------------- Page 73-----------------------

         String outpu t =

         po int.getName()  + ": " +po int.toString()  + "

" +

         circle.getName()  + ": " + circle.toString()  + "

" +

         cylinder.getName()  + ": " + cylinder.toString();

         DecimalFormatp recision2 = new DecimalFormat(

          "0.00");

         // duyệt mảng array Of Shapes lấy  tên, diện tích, thể tích

         // của mỗi đối tượng hình học trong mảng.

         f or ( int i = 0; i < array Of Shapes.length; i++)

          {

              outpu t += "

" + array Of Shapes[ i ].getName()  +

              ": " + array Of Shapes[ i]. toString()  +

              "

Area = " +

              p recision2.f ormat( array Of Shapes[ i ].area() )  +

              "

Volume = " +

              p recision2.f ormat( array Of Shapes[ i ].volume() );

         }

         System.out.p rintln(outpu t);

         System.exit( 0);

     }

} // end class Test

Kết quảthực thi chương trình:

                                      73

----------------------- Page 74-----------------------

Ví dụ 2: Tương tự ví dụ 1 nh           ng trong ví dụ 2 chúng ta dùng

interface để định nghĩa cho  Shape thay vì một lớp trừu tượng.

Vì vậy tất cả các phương thức trong interface Shape phải được

hiện   thực   trong    lớp Point    là   lớp cài  đặt  trực  tiếp   interface

Shape.

// Định nghĩa một interf ace Shape trong tập  tin shape.j ava

pub lic interf ace Shape

 {

         // Tính diện tích

         pub lic abstract double area();

         // Tính thể tích

         pub lic abstract double volume();

         // trả về tên của shape

         pub lic abstract String getName();

}

Lớp Point cài đặt/hiện thực interf ace tên shape.

// Định nghĩa lớp Point trong tập  tin Point.j ava

pub lic class Point extends Obj ect imp lements Shape

 {

         p rotected int x, y; // Tọa độx, y của 1 điểm

         // constructor không tham số.

         pub lic Point()

          {

                  setPoint( 0, 0);

         }

         // constructor có tham số.

         pub lic Point(int xCoordinate, int y Coordinate)

          {

                  setPoint( xCoordinate, y Coordinate);

                                      74

----------------------- Page 75-----------------------

}

// gán tọa độx, y cho 1 điểm

pub lic void setPoint( int xCoordinate, int y Coordinate)

 {

           x  = xCoordinate;

           y  =y Coordinate;

}

// lấy tọa độx của 1 điểm

pub lic int getX ()

 {

           return x;

}

// lấy tọa độy của 1 điểm

pub lic int getY()

 {

           return y;

}

// Thể hiện tọa độ của 1 điểm dưới dạng chuỗi

pub lic String toString()

 {

           return  "[ " + x  + ",  " +y  + "] ";

}

// Tính diện tích

pub lic double area()

 {

           return 0.0;

}

// Tính thể tích

pub lic double volume()

                                 75

----------------------- Page 76-----------------------

          {

                  return 0.0;

         }

         // trả về tên của đối tượng shape

         pub lic String getName()

          {

                  return  "Point";

         }

} // end class Point

Lớp  Circle là  lớp  con  của  lớp Point, và cài đặt/hiện thực gián

tiếp interf ace tên shape.

// Định nghĩa lớp  Circle trong tập  tin Circle.j ava

pub lic class Circle extends Point

 {       // Dẫn xuất từ lớpPoint

         p rotected double radius;

         // constructor không tham số

         pub lic Circle()

          {

                  // ngầm gọi đ n constructor của lớp  cha

                  setRadius( 0);

         }

         // constructor có tham số

         pub lic Circle( double circleRadius, int xCoordinate,

          int y Coordinate)

          {

                  // gọi constructorcủa lớp  cha

                  super( xCoordinate, y Coordinate);

                  setRadius( circleRadius );

         }

                                      76

----------------------- Page 77-----------------------

         // Gán bán kính của đường tròn

         pub lic void setRadius( double circleRadius )

          {

                   radius = ( circleRadius >= 0 ? circleRadius:0);

         }

         // Lấy bán kính của đường tròn

         pub lic double getRadius()

          {

                   return radius;

         }

         // Tính diện tích đường tròn Circle

         pub lic double area()

          {

                   return Math.PI  * radius  * radius;

         }

         // Biểu diễn đường tròn bằng một chuỗi

         pub lic String toString()

          {

                   return  "Center = " + super.toString()  +

                   "; Radius = " + radius;

         }

         // trả về tên của shape

         pub lic String getName()

          {

                   return  "Circle";

         }

} // end class Circle

// Định nghĩa lớp  hình trụ Cylinder

// trong tập  tin Cylinder.j ava.

                                      77

----------------------- Page 78-----------------------

pub lic class Cylinder extends Circle

 {

         // chiều cao của Cylinder

         p rotected double height;

         // constructor không có tham số

         pub lic Cylinder()

          {

                  // ngầm gọi đ n constructor của lớp  cha

                  setHeight( 0);

         }

         // constructor có tham số

         pub lic Cylinder( double cylinderHeight,

         double cylinderRadius, int xCoordinate,

          int y Coordinate)

          {

                  // Gọi constructor của lớp  cha

                  super( cylinderRadius, xCoordinate,

                  y Coordinate);

                  setHeight( cylinderHeight);

         }

         // Gán chiều cao cho Cylinder

         pub lic void setHeight( double cylinderHeight)

          {

                   height = ( cylinderHeight >= 0 ? cylinderHeight

                   :0);

         }

          // Lấy chiều cao của Cylinder

         pub lic double getHeight()

          {

                   return height;

                                      78

----------------------- Page 79-----------------------

         }

         // Tính diện tích xung quanh của Cylinder

         pub lic double area()

          {

                  return 2  *super.area()  + 2  *Math.PI  * radius  *

                  height;

         }

         // Tính thể tích của Cylinder

         pub lic double volume()

          {

                  return super.area()      * height;

         }

         // Biểu diễn Cylinder bằng một chuỗi

         pub lic String toString()

          {

                  return super.toString()  + "; Height = " + height;

         }

         // trả về tên của shape

         pub lic String getName()

          {

                  return  "Cylinder";

         }

} // end class Cylinder

// Test.j ava

// Kiểm tra tính k     thừa của Point, Circle, Cylinder với

// interf ace Shape.

// Khai báo thư viện

impo rtj ava.text.DecimalFormat;

                                      79

----------------------- Page 80-----------------------

pub lic class Test

 {

     // Kiểm tra tính k     thừa của các đối tượng hình học

     pub lic static void main( String args[] )

     {

         // Tạo ra các đối tượng hìnhhọc

         Pointpo int = new Point( 7, 11);

          Circle circle = new Circle( 3.5, 22, 8);

          Cylinder cylinder = new Cylinder( 10, 3.3, 10, 10);

         // Tạo một mảng các đối tượng hình học

         Shape array Of Shapes[] = new Shape[ 3 ];

         // array Of Shapes[ 0 ] là một đối tượng Point

         array Of Shapes[ 0 ] =po int;

         // array Of Shapes[ 1 ] là một đối tượng Circle

         array Of Shapes[ 1 ] = circle;

         // array Of Shapes[ 2 ] là một đối tượng cylinder

         array Of Shapes[ 2 ] = cylinder;

         // Lấy  tên và biểu diễn của mỗi đối tượng hình học

         String outpu t =

         po int.getName()  + ": " +po int.toString()  + "

" +

         circle.getName()  + ": " + circle.toString()  + "

" +

         cylinder.getName()  + ": " + cylinder.toString();

         DecimalFormatp recision2 = new DecimalFormat(

          "0.00");

         // duyệt mảng array Of Shapes lấy  tên, diện tích, thể tích

         // của mỗi đối tượng hình học trong mảng.

         f or ( int i = 0; i < array Of Shapes.length; i++)

          {

              outpu t += "

" + array Of Shapes[ i ].getName()  +

              ": " + array Of Shapes[ i]. toString()  +

                                      80

----------------------- Page 81-----------------------

               "

Area = " +

              p recision2.f ormat( array Of Shapes[ i ].area() )  +

               "

Volume = " +

              p recision2.f ormat( array Of Shapes[ i ].volume() );

          }

          System.out.p rintln(outpu t);

          System.exit( 0);

     }

} // end class Test

Kết quảthực thi chương trình:

                                        81

----------------------- Page 82-----------------------

    Chương 4: THIẾT KẾGIAO DIỆN NGƯỜI

    Chương 4: THIẾT KẾGIAO DIỆN NGƯỜI

                                  DÙNG

                                  DÙNG

4.1.Mởđầu

4.1.Mởđầu

     Chương này cung cấp cho sinh viên những kiến thức cơ bản

để xây   dựng     giao   diện   (Graphic  User     Interface   -  GUI)     của

chương trình ứng dụng bằng ngôn ngữjava:

     -   Những nguyên tắc thiết kếgiao diện.

     -   Những th      viện, gói xây dựng giao diện: gồm những lớp

         (class),  những  giao  tiếp    (interface)  quản  lý   sự kiện  và

         những thành phần (components) xây dựng nên giao diện

         người dùng.

     -    Bộ quản lý trình bày (layout managers)

     -    Xử lý sựkiện

     Trong    khuôn    khổ giáo     trình   lập trình  java   căn    bản  này

chúng    tôi  trình  bày   việc   thiết   kế GUI     dùng    th    viện   awt

(abstract  windows  toolkit).  Việc  thiết   kết      GUI   sẽ trực  quan,

uyển   chuyển   hơn    khi  chúng  ta   sử  dụng  th       viện  JFC  (Java

Foundation Class) sẽ giới được giới thiệu trong chuyên đềjava

nâng cao.

                                      82

----------------------- Page 83-----------------------

4.2.Giới thiệu thưviện awt

4.2.Giới thiệu thưviện awt

     Th    viện  awt  là   bộ th    viện  dùng  để xây  dựng  giao  diện

người dùng cho một chương trình ứng dụng có đầy đủ các thành

phần     cơ  bản   nh   :  Label,   Button,    Checkbox,      Radiobutton,

Choice, List, Text Field, Text Area, Scrollbar, Menu, Frame…

     Giống nh      các API của Windows, java cung cấp cho người

lập  trình th    viện  awt. Nh    ng khác với các hàm API, th            viện

awt không phụ thuộc hệđiều hành. Th              viện awt là nền tảng, cơ

sở giúp  cho  chúng  ta tiếp   cận  với th       viện  mở  rộng JFC hiệu

quả hơn.

Cấu trúc cây phân cấp của tất cả những lớp trong th                 viện awt

chúng ta có thể xem chi tiết trong tài liệu kèm theo bộ công cụ

j2se (phần API Specification)

4.3.Các khái niệm cơbản

4.3.Các khái niệm cơbản

4.3.1.Component

4.3.1.Component

     Component là một đối tượng có biểu diễn đồ họa được hiển

thị trên màn hình mà người dùng có thể tương tác được. Chẳng

                                      83

----------------------- Page 84-----------------------

hạn   nh    những     nút  nhấn    (button),   những    checkbox,     những

scrollbar,… Lớp Component là một lớp trừu tượng.

             java.lang.Object

                 java.awt.Component

4.3.2.Container

4.3.2.Container

     Container là đối tượng vật chứa hay những đối tượng có khả

năng quản lý và nhóm các đối tượng khác lại. Những đối tượng

con thuộc thành phần awt nh           : button, checkbox, radio button,

scrollbar,  list,…  chỉ  sử  dụng  được  khi  ta  đ a  nó  vào  khung

chứa (container).

Một sốđối tượng container trong Java:

         Panel: Đối  tượng  khung  chứa  đơn  giản  nhất,  dùng  để

         nhóm  các đối  tượng, thành phần  con  lại.  Một  Panel có

         thểchứa bên trong một Panel khác.

         java.lang.Object

          +--java.awt.Component

              +--java.awt.Container

                  +--java.awt.Panel

         Frame: khung  chứa  Frame  là  một   cửa  số window   hẳn

         hoi  ở  mức  trên     cùng  bao     gồm   một   tiêu  đều   và   một

         đường biên  (border)  nh        các ứng  dụng windows thông

         thường khác. Khung  chứa Frame thường được  sử dụng

         để tạo ra cửa sổ chính của các ứng dụng.

         java.lang.Object

          +--java.awt.Component

              +--java.awt.Container

                  +--java.awt.Window

                      +--java.awt.Frame

         Dialogs: đây là  một   cửa  sổ dạng hộp hội thoại (cửa sổ

         dạng này còn được gọi là pop-up window), cửa sổ dạng

         này thường được dùng để đ a ra thông báo, hay dùng để

         lấy dữ liệu nhập từ ngoài vào thông qua các đối tượng,

         thành phần trên dialog nh         TextField chẳng hạn. Dialog

                                      84

----------------------- Page 85-----------------------

         cũng là một cửa sổ nh        ng không đầy đủ chức năng nh

         đối tượng khung chứa Frame.

         java.lang.Object

          +--java.awt.Component

              +--java.awt.Container

                  +--java.awt.Window

                      +--java.awt.Dialog

         ScrollPanes:  là   một  khung  chứa   tương   tự khung  chứa

         Panel, nh    ng  có  thêm 2 thanh trượt  giúp  ta tổ chức và

         xem được  các đối  tượng  lớn  choán nhiều  chỗ trên màn

         hình nh    những hình ảnh hay văn bản nhiều dòng.

         java.lang.Object

          +--java.awt.Component

              +--java.awt.Container

                  +--java.awt.ScrollPane

4.3.3.Layout Manager

4.3.3.Layout Manager

     Khung chứa container nhận các đối tượng từ bên ngoài đ a

vào và nó phải biết làm thếnào để tổ chức sắp xếp “chỗ ở” cho

các  đối  tượng  đó.  Mỗi đối  tượng  khung  chứa  đều  có   một   bộ

quản lý chịu trách nhiệm thực hiện công việc đấy đó là bộ quản

lý trình bày (Layout Manager). Các bộ quản lý trình bày mà th

viện AWT cung cấp cho ta bao gồm:

         FlowLayout: Sắp xếp các đối tượng từtrái qua ph ải và

         từ trên xuống dưới. Các đối tượng đều giữ nguyên kích

         thước của mình.

         BorderLayout: Các đối tượng được đặt theo các đường

         viền  của khung  chứa theo  các  cạnh  West,  East,  South,

         North  và    Center  tức  Đông,  Tây,  Nam,   Bắc  và  Trung

         tâm  hay  Trái,  Phải,  Trên,   Dưới và  Giữa  tùy  theo  cách

         nhìn của chúng ta.

         GridLayout:   Tạo   một       khung   lưới  vô  hình   với  các  ô

         bằng  nhau.  Các  đối   tượng   sẽ đặt   vừa  kích  thước   với

                                      85

----------------------- Page 86-----------------------

         từng  ô  đó. Thứ  tự  sắp   xếp   cũng  từ trái qua phải và  từ

         trên xuống dưới.

         GridBagLayout:   Tương            tự nh    GridLayout,      các  đối

         tượng khung chứa cũng được đ a vào một lưới vô hình.

         Tuy  nhiên  kích  thước  các  đối   tượng  không  nhất  thiết

         phải vừa với  1 ô mà có thể là 2, 3 ô hay nhiều hơn tùy

         theo  các ràng buộc mà ta chỉ định thông qua đối tượng

         GridBagConstraint.

         Null  Layout: Cách  trình bày  tự do. Đối  với cách trình

         bày này người  lập  trình phải tự động làm tất cả từ việc

         định kích thước của các đối tượng, cũng nh              xác định vị

         trí của nó trên màn hình. Ta không phụ thuộc vào những

         ràng buộc đông, tây , nam, bắc gì cả.

4.4.Thiết kếGUI cho chương trình

4.4.Thiết kếGUI cho chương trình

4.4.1.Tạo khung chứa cửa sổchương trình

4.4.1.Tạo khung chứa cửa sổchương trình

     Thông  thường  để  tạo   cửa   sổ chính  cho  chương  trình  ứng

dụng ta tiến hành các bước:

     -    Tạo đối tượng Frame

     -   Xác định kích thước của Frame

     -   Thểhiện Frame trên màn hình

Ví dụ:

     impo rtj ava.awt.*;

     class FrameDemo

     {

         pub lic static void main(String args[])

         {

                  // Tạo đối tượng khung chứaFrame

                  Framef r = new Frame("My First Window")  ;

                  // Xác định kích thước, vị trí của Frame

                  f r.setBounds(0, 0, 640, 480);

                  // Hiển thịFrame

                                      86

----------------------- Page 87-----------------------

                  f r.setVisible(true);

         }

    }

Kết quảthực thi chương trình:

4.4.2.Tạo hệthống thực đơn

4.4.2.Tạo hệthống thực đơn

Đối   với  th    viện   awt,  để xây   dựng   hệ thống  thực  đơn         cho

chương trình ứng dụng chúng ta có thể dùng các lớp MenuBar,

Menu, MenuItem, MenuShortcut.

                                               MenuBar

                                      MenuItem

                                           Menu

Ví dụ: Tạo hệthống thực đơn cho chương trình Calculator

impo rtj ava.awt.*;

impo rtj ava.awt.event.*;

class Calculator

{

    pub lic static void main(String[] args)

     {

                                      87

----------------------- Page 88-----------------------

     createMenu();

}

p rivate static void createMenu()

 {

     // Tao Frame ung dung

     f inal Framef r = new Frame();

     f r.setLayout(new BorderLayout());

     // Tao cac menu bar

     MenuBar menu = new MenuBar();

     Menu menuFile = new Menu("Edit");

     MenuItem copyItem = new MenuItem("Copy  Ctrl+C");

     MenuItem pasteItem = new MenuItem("Paste Ctrl+V");

     menuFile.add(copyItem);

     menuFile.add(pasteItem);

     Menu menuHelp  = new Menu("Help");

     MenuItem hTopicItem = new MenuItem("Help  Topics ");

     MenuItem hAboutItem = new MenuItem("About

     Calculator");

     menuHelp .add(hTopicItem);

     menuHelp .addSepa rator();

     menuHelp .add(hAboutItem);

     menu.add(menuFile);

     menu.add(menuHelp);

     f r.setMenuBar(menu);

     f r.setBounds(100, 100, 300, 200);

     f r.setTitle("Calculator");

     //f r.setResizable(f alse);

     f r.setVisible(true);

     // xử lý bi  n sự kiện đóng cửa số ứng dụng.

     f r.addWindowListener(

                                    88

----------------------- Page 89-----------------------

              new WindowAdapter()

              {

                  pub lic void windowClosing(WindowEvent e)

                   {

                       System.exit(0);

                  }

              });

     }

}

Kết quảthực thi chương trình:

4.4.3.Gắn Component vào khung chứa

4.4.3.Gắn Component vào khung chứa

     Để gắn một thành phần, một đối tượng component vào một

cửa  số (khung  chứa)  chúng  ta  dùng phương  thức  add  của  đối

tượng khung chứa container.

Ví dụ:

     impo rtj ava.awt.*;

     class AddDemo

     {

         pub lic static void main(String args[])

         {

                  // Tạo đối tượng khung chứaFrame

                  Framef r = new Frame("AddDemo App");

                  // Tạo đối tượng Compon ent

                                      89

----------------------- Page 90-----------------------

                  Button buttOk = new Button(“OK ”);

                  // Gắn đối tượng nút nhấn vào khung chứa

                  f r.add(buttOk);

                  // Xác định kích thước, vị trí của Frame

                  f r.setSize(100, 100);

                  // Hiển thịFrame

                  f r.setVisible(true);

         }

    }

    }

Kết quảthực thi chương trình:

4.4.4.Trình bày các Component trong khung chứa

4.4.4.Trình bày các Component trong khung chứa

     Nh    chúng  ta  đã  biết  khung  chứa  container  nhận  các  đối

tượng  từ bên ngoài đ a vào và nó phải biết  làm thế nào để tổ

chức   sắp   xếp  “chỗ ở”  cho  các  đối  tượng  đó.   Mỗi  đối  tượng

khung  chứa đều  có một bộ quản lý chịu trách nhiệm thực hiện

công  việc  đấy  đó  là   bộ quản  lý  trình  bày  (Layout  Manager).

Chúng ta sẽ tìm hiểu chi tiết về các kiểu trình bày của th               viện

AWT.

     Interface  LayoutManager        định  nghĩa  giao  tiếp     cho  những

lớp  biết  được    làm  thế nào     để trình  bày  những  trong  những

containers

4.4.4.1 FlowLayout

public class FlowLayout extends Object

                                     90

----------------------- Page 91-----------------------

         implements LayoutManager, Serializable

Đối với một container trình bày theo kiểu FlowLayout thì:

         Các component gắn vào được sắp xếp theo thứ tự từtrái

         sang phải và từtrên xuống dưới.

         Các component có kích thước nh            mong muốn.

         Nếu chiều rộng của Container không đủ chỗ cho các

         component thì chúng tự động tạo ra một dòng mới.

         FlowLayout thường được dùng đểđể sắp xếp các button

         trong 1 panel.

         Chúng     ta  có   thể điều     chỉnh   khoảng     cách   giữa   các

         component.

Ví dụ:

impo rtj ava.awt.*;

impo rtj ava.lang.Integer;

class FlowLayoutDemo

{

    pub lic static void main(String args[])

     {

         Framef r = new Frame("FlowLayout Demo");

         f r.setLayout(new FlowLayout());

         f r.add(new Button("Red"));

         f r.add(new Button("Green"));

         f r.add(new Button("Blue"));

         List li = new List();

         f or (int i=0; i<5; i++)

         {

              li.add(Integer.toString(i));

         }

         f r.add(li);

         f r.add(new Checkbox("Pick me", true));

         f r.add(new Label("Enter your name:"));

                                      91

----------------------- Page 92-----------------------

         f r.add(new TextField(20));

         // ph ương thứcpa ck()  được gọi sẽ làm cho cửa sổ

         // hiện hành sẽ có kích thước vừa với kích thước

         // trình bày bố trí những thành ph ần con của nó.

         f r.pa ck();

         f r.setVisible(true);

     }

}

Kết quảthực thi chương trình:

4.4.4.2 BorderLayout

public class BorderLayout extends Object

         implements LayoutManager2, Serializable

Đối với một container trình bày theo kiểu BorderLayout thì:

         Bộ trình      bày   khung    chứa    được    chia   làm   4   vùng:

         NORTH,  SOUTH, WEST, EAST và CENTER. (Đông,

         Tây, Nam, Bắc và trung tâm). Bộ trình bày loại này cho

         phép     sắp   xếp   và   thay   đổi   kích   thước     của  những

         components       chứa   trong   nó   sao  cho    vứa   với  5  vùng

         ĐÔNG, TÂY, NAM, BẮC, TRUNG TÂM.

         Không cần phải gắn component vào cho tất cảcác vùng.

         Các  component  ở vùng  NORTH  và  SOUTH  có  chiều

         cao  tùy  ý  nh   ng  có  chiều   rộng  đúng   bằng  chiều   rộng

         vùng chứa.

         Các component  ở vùng EAST và WEST có  chiều rộng

         tùy  ý  nh   ng  có  chiều   cao  đúng   bằng  chiều  cao  vùng

         chứa.

         Các component  ở vùng CENTER có chiều cao và chiều

         rộng phụthuộc vào các vùng xung quanh.

                                      92

----------------------- Page 93-----------------------

Ví dụ:

impo rtj ava.awt.*;

class BorderLayoutDemo extends Frame

{

     p rivate Button north, south, east, west, center;

     pub lic BorderLayoutDemo(String sTitle)

     {

          super(sTitle);

          north     = new Button("North");

          south     = new Button("South");

          east      = new Button("East");

          west      = new Button("West");

          center    = new Button("Center");

          this.add(north, BorderLayout.NORTH);

          this.add(south, BorderLayout.SOUTH);

          this.add(east, BorderLayout.EAST);

          this.add(west, BorderLayout.WEST);

          this.add(center, BorderLayout.CENTER);

     }

     pub lic static void main(String args[])

     {

          Framef r = new BorderLayoutDemo  ("BorderLayout

          Demo");

         f r.pa ck();

         f r.setVisible(true);

     }

}

Kết quảthực thi chương trình:

                                        93

----------------------- Page 94-----------------------

4.4.4.3 GridLayout

public class GridLayout extends Object

         implements LayoutManager

Đối với một container trình bày theo kiểu GridLayout thì:

         Bộ trình bày tạo một khung lưới vô hình với các ô bằng

         nhau.

         Các đối tượng sẽ đặt vừa kích thước với từng ô đó. Thứ

         tự sắp xếp từtrái qua phải và từtrên xuống dưới.

Ví dụ:

impo rtj ava.awt.*;

pub lic class GridLayoutDemo

 {

         pub lic static void main(String arg[])

          {

                  Framef     = new Frame("GridLayout Demo");

                  f .setLayout(new GridLayout(3,2));

                  f .add(new Button("Red"));

                  f .add(new Button("Green"));

                  f .add(new Button("Blue"));

                  f .add(new Checkbox("Pick me", true));

                  f .add(new Label("Enter name here:"));

                                      94

----------------------- Page 95-----------------------

                  f .add(new TextField());

                  f .pa ck();

                  f .setVisible(true);

         }

}

Kết quảthực thi chương trình:

4.4.4.4 GridBagLayout

public class GridBagLayout extends Object

         implements LayoutManager2

         (public interface LayoutManager2 extends

         LayoutManager)

Đối với một container trình bày theo kiểu GridBagLayout thì:

         Các  componets khi được  đ a vào  khung  chứa  sẽ được

         trình   bày   trên   1  khung     lưới vô   hình    tương    tự nh

         GridLayout. Tuy nhiên khác với GridLayout  kích thước

         các  đối   tượng  không  nhất  thiết  phải  vừa   với  1 ô  trên

         khung  lưới mà có  thể là 2,  3 ô hay nhiều   hơn tùy theo

         các   ràng   buộc    mà   ta  chỉ định    thông   qua   đối   tượng

         GridBagConstraints.

         Lớp  GridBagConstraints dẫn xuất   từ  lớp  Object.  Lớp

         GridBagConstraints        dùng    để chỉ định     ràng   buộc    cho

         những components trình bày trong khung chứa container

         theo kiểu GridBagLayout.

              o gridx, gridy: vị trí ô của khung lưới vô hình mà

                  ta sẽđ a đối tượng con vào

                                      95

----------------------- Page 96-----------------------

              o gridwidth,        gridheight:     kích   thước    hay   vùng

                  trình bày cho đối tượng con.

              o Insets:  là   một     biến  đối   tượng  thuộc   lớp    Inset

                   dùng  để qui  định  khoảng  cách  biên  phân  cách

                  theo 4 chiều (trên, dưới, trái, phải).

              o weightx,  weighty: chỉ định  khoảng  cách   lớn  ra

                  tương đối của các đối tượng con với nhau

Ví dụ:

impo rtj ava.awt.*;

pub lic class GridBagLayoutDemo

 {

     pub lic static void main(String arg[])

     {

         Framef     = new Frame("GridBagLayout Demo");

         // Thiet lap layout manager

         // Tao doi tuong rang buoc cho cach trinh bay

         // GridBagLayout.

          GridBagLayout layout = new GridBagLayout();

          GridBagConstraints constraints = new

          GridBagConstraints();

         f .setLayout(layout);

         // Tao ra 9 nut nhan

         String[] buttName = {"Mot",  "Hai",  "Ba",  "Bon",

          "Nam",  "Sau",  "Bay ",  "Tam",  "Chin"};

         Button[] buttons = new Button[9] ;

         f or(int i=0;i<9;i++)

          {

              buttons[i]  = new Button (buttName[i]);

         }

         // Rang buoc cac nut nhan cach nhau 2 p ixel

                                      96

----------------------- Page 97-----------------------

constraints.insets = new Insets(2,2,2,2);

// Qui dinh cac nut nhan se thay doi kich thuoc

// theo ca 2 chieu

constraints.f ill = GridBagConstraints.BOTH;

// Rang buoc cho nut nhan thu 1

constraints.gridx  = 1;

constraints.gridy  = 1;

constraints.gridheight = 2;

constraints.gridwidth = 1;

layout.setConstraints(buttons[0],  constraints);

// Rang buoc cho nut nhan thu 2

constraints.gridx  = 2;

constraints.gridy  = 1;

constraints.gridheight = 1;

constraints.gridwidth = 2;

layout.setConstraints(buttons[1],  constraints);

// Rang buoc cho nut nhan thu 3

constraints.gridx  = 2;

constraints.gridy  = 2;

constraints.gridheight = 1;

constraints.gridwidth = 1;

layout.setConstraints(buttons[2],  constraints);

// Rang buoc cho nut nhan thu 4

constraints.gridx  = 1;

constraints.gridy  = 3;

constraints.gridheight = 1;

constraints.gridwidth = 2;

layout.setConstraints(buttons[3],  constraints);

// Rang buoc cho nut nhan thu 5

                                       97

----------------------- Page 98-----------------------

constraints.gridx  = 3;

constraints.gridy  = 2;

constraints.gridheight = 2;

constraints.gridwidth = 1;

layout.setConstraints(buttons[4],  constraints);

// Rang buoc cho nut nhan thu 6

constraints.gridx  = 4;

constraints.gridy  = 1;

constraints.gridheight = 3;

constraints.gridwidth = 1;

layout.setConstraints(buttons[5],  constraints);

// Tu nut thu 7 tro di khong can rang buoc

// thay vi doi kich thuoc

constraints.f ill = GridBagConstraints.NONE;

// Rang buoc cho nut nhan thu 7

constraints.gridx  = 1;

constraints.gridy  = 4;

constraints.gridheight = 1;

constraints.gridwidth = 1;

constraints.weightx  = 1.0;

layout.setConstraints(buttons[6],  constraints);

// Rang buoc cho nut nhan thu 8

constraints.gridx  = 2;

constraints.gridy  = 5;

constraints.gridheight = 1;

constraints.gridwidth = 1;

constraints.weightx  = 2.0;

layout.setConstraints(buttons[7],  constraints);

// Rang buoc cho nut nhan thu 9

constraints.gridx  = 3;

                                        98

----------------------- Page 99-----------------------

         constraints.gridy  = 6;

         constraints.gridheight = 1;

         constraints.gridwidth = 1;

         constraints.weightx  = 3.0;

         layout.setConstraints(buttons[8],  constraints);

         // Dua cac nut nhan khung chua chuong trinh

         f or (int i=0;i<9;i++)

             f .add(buttons[i]);

         f .pa ck();

         f .setVisible(true);

     }

}

                     Kết quảthực thi chương trình:

4.4.4.5 Null Layout

      Một  khung  chứa  được trình bày theo  kiểu  Null Layout  có

nghĩa là người lập trình phải tự làm tất cả từ việc qui định kích

thước  của khung  chứa, cũng nh           kích thước và vị trí của từng

đối tượng component trong khung chứa.

     Để thiết lập cách trình bày là Null Layout cho một container

ta chỉviệc gọi phương thức setLayout(null) với tham số là null.

                                      99

----------------------- Page 100-----------------------

      Một sốphương thức của lớp trừu tượng Component dùng để

định   vị và  qui định  kích  thước   của  component  khi đ a  chúng

vào khung chứa trình bày theo kiểu kiểu tự do:

o  Public void setLocation(Point p)

o  Public void setSize(Dimension p)

o  Public void setBounds(Rectangle r)

Ví dụ:

o  MyButton.setSize(new Dimension(20, 10));

o  MyButton.setLocation(new Point(10, 10));

o  MyButton.setBounds(10, 10, 20, 10);

impo rtj ava.awt.*;

class NullLayoutDemo

{

         pub lic static void main(String args[])

         {

                  Framef r = new Frame("NullLayout Demo");

                  f r.setLayout(null);

                  Button buttOk = new Button("OK ");

                  buttOk.setBounds(100, 150, 50, 30);

                  Button buttCancel = new Button("Cancel");

                  buttCancel.setBounds(200, 150, 50, 30);

                  Checkbox checkBut = new Checkbox("Check

                  box ", true);

                  checkBut.setBounds(100, 50, 100, 20);

                  List li = new List();

                  f or (int i=0; i<5; i++)

                  {

                       li.add(Integer.toString(i));

                  }

                  li.setBounds(200, 50, 50, 50);

                  f r.add(buttOk);

                  f r.add(buttCancel);

                                     100

----------------------- Page 101-----------------------

                  f r.add(checkBut);

                  f r.add(li);

                  f r.setBounds(10, 10, 400, 200);

                  f r.setVisible(true);

         }

}

Kết quảthực thi chương trình:

4.4.5.Các đối tượng khung chứa Container

4.4.5.Các đối tượng khung chứa Container

     Nh    chúng ta đã biết  container là đối tượng khung chứa có

khả  năng  quản  lý  và  chứa  các  đối   tượng  (components)  khác

trong nó.

     Các components chỉ có thể sử dụng được khi đ a nó vào  1

đối tượng khung chứa là container.

     Mỗi     container    thường       gắn    với   một    LayoutManager

(FlowLayout, BorderLayout, GridLayout, GridBagLayout, Null

Layout) qui định cách trình bày và bố trí các components trong

một container.

     Các     lọai container     trong   java:    Frame,    Panel,    Dialog,

ScrollPanes.

                                     101

----------------------- Page 102-----------------------

4.4.5.1 Khung chứa Frame

         java.lang.Object

           +--java.awt.Component

               +--java.awt.Container

                   +--java.awt.Window

                         +--java.awt.Frame

     Khung  chứa  Frame  là   một   cửa   số window   hẳn  hoi ở  mức

trên  cùng  bao   gồm  một  tiêu  đều  và   một  đường  biên  (border)

nh    các  ứng   dụng  windows  thông  thường  khác.  Khung  chứa

Frame thường được sử dụng để tạo ra cửa sổ chính của các ứng

dụng.

     Khung chứa Panel có bộ quản lý trình bày (LayoutManager)

mặc định là FlowLayout.

4.4.5.2 Khung chứa Panel

         java.lang.Object

           +--java.awt.Component

               +--java.awt.Container

                    +--java.awt.Panel

     Khung chứa Panel có bộ quản lý trình bày (LayoutManager)

mặc định là FlowLayout.

     Đối   với  khung  chứa  Panel  thì  các  Panel  có  thể  lồng  vào

nhau, vì vậy khung chứa Panel thường được dùng để bố trí các

nhóm components bên trong một khung chứa khác.

Ví dụ:

impo rtj ava.awt.*;

pub lic class PanelDemo extends Frame

 {

     p rivate Button next, p rev,f irst;

     p rivate List li;

     pub lic PanelDemo(String sTitle)

     {

         super(sTitle);

         next = new Button("Next >>");

         p rev = new Button("<< Prev");

                                     102

----------------------- Page 103-----------------------

          f irst = new Button("First");

          Panel southPanel = new Panel();

           southPanel.add(next);

           southPanel.add(p rev);

           southPanel.add(f irst);

          // BorderLayout.SOUTH: vùng dưới

           this.add(southPanel, BorderLayout.SOUTH);

          Panel northPanel = new Panel();

           northPanel.add(new Label("Make a Selection"));

          // BorderLayout.NORTH: vùng trên

           this.add(northPanel, BorderLayout.NORTH);

           li = new List();

          f or(int i=0;i<10;i++)

           {

                     li.add("Selection" + i);

          }

           this.add(li, BorderLayout.CENTER);

     }

     pub lic static void main(String arg[])

      {

           Containerf       = new PanelDemo("Panel Demo");

          f .setSize(300, 200);

          f .setVisible(true);

     }

}

Kết quảthực thi chương trình:

                                          103

----------------------- Page 104-----------------------

4.4.5.2 Khung chứa Dialog

java.lang.Object

   +--java.awt.Component

      +--java.awt.Container

          +--java.awt.Window

                +--java.awt.Dialog

                +--java.awt.Dialog

     Dialog là một lớp khung chứa tựa Frame và còn được gọi là

popup window. Có hai loại dialog phổbiến:

         Modal Dialog: sẽkhóa tất cảcác cửa sốkhác của ứng

         dụng khi dialog dạng này còn hiển thị.

         Non-Modal Dialog: vẫn có thểđến các cửa sốkhác của

         ứng dụng khi dialog dạng này hiển thị.

      Một cửa sổ dạng Dialog luôn luôn phải gắn với một cửa sổ

ứng dụng (Frame).

     Để tạo một đối tượng khung chứa Dialog ta có thểdùng một

trong các constructor của nó:

         pub lic Dialog (Framepa rentWindow, boolean isModal)

         pub lic Dialog (Framepa rentWindow, String title,

         boolean isModal)

         pa rentWindow: cửa sổ cha

         title: tiêu đề của Dialog

         isModal: true -> là Dialog dạng modal

         isModal:f alse -> là Dialog không ph ải dạng modal

         (hay non-modal)

                                     104

----------------------- Page 105-----------------------

4.5.Xửlý biến cố/sựkiện

4.5.Xửlý biến cố/sựkiện

4.5.1.Mô hình xửlý sựkiện (Event-Handling Model)

4.5.1.Mô hình xửlý sựkiện (Event-Handling Model)

     Ở trên  chúng  ta  chỉ đề  cập  đến   vấn  đề thiết   kế giao  diện

chương  trình  ứng   dụng  mà  ch       a  đề  cập  đến   vấn  đề  xử lý  sự

kiện. Những  sự kiện được phát  sinh khi người dùng  tương tác

với giao diện chương trình (GUI). Những tương tác thường gặp

nh   : di  chuyển,    nhấn   chuột,   nhấn     một  nút   nhấn,   chọn    một

MenuItem trong  hệ thống thực đơn, nhập   dữ liệu  trong  một  ô

văn bản, đóng cửa sổứng dụng, … Khi có một tương tác xảy ra

thì một sự kiện được gởi đến chương trình. Thông tin về sự kiện

thường    được     l u trữ trong      một  đối   tượng    dẫn  xuất    từ  lớp

AWTEvent. Những  kiểu   sự kiện  trong  gói java.awt.event  có

thể dùng  cho   cả những  component  AWT và JFC. Đối  với th

viện   JFC    thì  có   thêm   những     kiểu    sự kiện    mới   trong   gói

java.swing.event.

                                     105

----------------------- Page 106-----------------------

            Những lớp sựkiện của gói java.awt.event

Có 3 yếu tố quan trọng trong mô hình xử lý sựkiện:

             -    Nguồn phát sinh sựkiện (event source)

             -     Sựkiện (event object)

             -     Bộ lắng nghe sựkiện (event listener)

Nguồn  phát       sinh   sự kiện:  là  thành  phần   của  giao  diện  mà

người dùng tác động.

Sự kiện: Tóm  tắt  thông  tin  về  xử kiện  xảy ra, bao  gồm tham

chiếu  đến nguồn  gốc phát  sinh sự kiện và thông tin sự kiện sẽ

gởi đến cho bộ lắng nghe xử lý.

Bộ lắng nghe: Một bộ lắng nghe là một đối tượng của một lớp

hiện  thực  một  hay nhiều  interface  của  gói java.awt.event  hay

java.swing.event       (đối   với những     component      trong   th    viện

JFC). Khi được thông báo, bộ lắng nghe nhận sự kiện và xử lý.

Nguồn phát  sinh sự kiện phải cung cấp những phương thức để

đăng  ký  hoặc   hủy   bỏ  một   bộ  lắng  nghe. Nguồn  phát  sinh   sự

kiện  luôn phải  gắn  với  một   bộ  lắng  nghe, và nó   sẽ thông báo

với bộ lắng nghe đó khi có sựkiện phát sinh đó.

Nh    vậy người lập trình cần làm hai việc:

                                     106

----------------------- Page 107-----------------------

         Tạo  và đăng ký  một   bộ  lắng nghe cho  một  component

         trên GUI.

         Cài đặt các phương thức quản lý và xử lý sựkiện

      Những interfaces lắng nghe của gói java.awt.event

      Một đối tượng Event-Listener lắng nghe những sự kiện khác

nhau  phát  sinh  từ các  components  của giao  diện  chương trình.

Với   mỗi   sự kiện  khác  nhau  phát      sinh  thì phương  thức   tương

ứng trong những Event-Listener sẽđược gọi thực hiện.

Mỗi  interface  Event-Listener   gồm   một  hay  nhiều  các  phương

thức mà chúng cần cài đặt trong các lớp hiện thực (implements)

interface  đó.  Những  phương  thức  trong  các  interface  là  trừu

tượng vì vậy lớp  (bộ lắng nghe) nào hiện thực các interface thì

                                     107

----------------------- Page 108-----------------------

phải cài đặt tất cảnhững phương thức đó. Nếu không thì các bộ

lắng nghe sẽtrởthành các lớp trừu tượng.

4.5.2.Xửlý sựkiện chuột

4.5.2.Xửlý sựkiện chuột

     Java cung cấp hai intefaces lắng nghe (bộ lắng nghe sự kiện

chuột)  là  MouseListener  và  MouseMotionListener  để quản  lý

và xử lý các sự kiện liên quan đến thiết bịchuột. Những sự kiện

chuột có thể “bẫy” cho bất kỳ component nào trên GUI mà dẫn

xuất từjava.awt.component.

     Các phương thức của interface MouseListener:

         pub lic void mousePressed(MouseEvent event):  được gọi

         khi   một  nút   chuột   được  nhấnvà  con  trỏ chuột        ở trên

         component.

         pub lic void mouseClicked(MouseEvent event):  được gọi

         khi một nút chuột được nhấn và nhảtrên component mà

         không di chuyển chuột.

         pub lic   void  mouseReleased(MouseEvent             event):   được

         gọi khi một nút chuột nhảsa khi kéo rê.

         pub lic void mouseEntered(MouseEvent event):  được gọi

         khi   con   trỏ chuột      vào   trong   đường     biên    của   một

         component.

         pub lic  void  mouseExited(MouseEvent  event): được   gọi

         khi   con    trỏ chuột      ra   khỏi   đường     biên     của   một

         component.

     Các phương thức của interface MouseMotionListener:

         pub lic void mouseDragged(MouseEvent even ):  phương

         thức này được  gọi khi người dùng nhấn  một  nút  chuột

         và kéo trên một component.

         pub lic  void   mouseMoved(MouseEvent             event):  phương

         thức này được gọi khi di chuyển chuột trên component.

      Mỗi  phương     thức    xử lý   sự kiện   chuột    có   một   tham   số

MouseEvent  chứa  thông  tin   về  sự kiện  chuột  phát  sinh  chẳng

hạn nh    :  tọa độ x, y  nơi  sự kiện  chuột xảy ra. Những phương

                                     108

----------------------- Page 109-----------------------

thức   tương  ứng  trong  các  interfaces  sẽ  tự động  được   gọi khi

chuột tương tác với một component.

     Để biết  được người dùng đã nhấn nút  chuột  nào, chúng ta

dùng những phuơng thức, những hằng số của lớp InputEvent (là

lớp cha của lớp MouseEvent).

Ví dụ: Chương trình tên MouseTracker bên dưới minh họa việc

dùng  những phương  thức  của  các interfaces MouseListener  và

MouseMotionListener          để “bẫy”     và   xử lý   các   sự kiện   chuột

tương ứng.

impo rtj ava.awt.*;

impo rtj ava.awt.event.*;

pub lic class MouseTracker extends Frame

     imp lements MouseListener, MouseMotionListener

 {

     p rivate Label statusBar;

     // set up GUI and register mouse event handlers

     pub lic MouseTracker()

     {   super( "Demonstrating Mouse Events ");

         statusBar = new Label();

         this.add( statusBar, BorderLayout.SOUTH );

         // application listens to its own mouse events

         addMouseListener( this );

         addMouseMotionListener( this );

         setSize( 275, 100);

         setVisible( true);

     }

     // MouseListener event handlers

     // handle event when mouse released immediately

     // af terp ress

     pub lic void mouseClicked( MouseEvent event)

     {

         statusBar.setText( "Clicked at [ " + event.getX ()  +

                                     109

----------------------- Page 110-----------------------

                ",  " + event.getY()  + "] ");

}

// handle event when mousep ressed

pub lic void mousePressed( MouseEvent event)

 {

     statusBar.setText( "Pressed at [ " + event.getX ()  +

                ",  " + event.getY()  + "] ");

}

// handle event when mouse released af ter dragging

pub lic void mouseReleased( MouseEvent event)

 {

     statusBar.setText( "Released at [ " + event.getX ()  +

                ",  " + event.getY()  + "] ");

}

// handle event when mouse enters area

pub lic void mouseEntered( MouseEvent event)

 {

     statusBar.setText( "Mouse in window");

}

// handle event when mouse exits area

pub lic void mouseExited( MouseEvent event)

 {   statusBar.setText( "Mouse outside window");

}

// MouseMotionListener event handlers

// handle event when user drags mouse with buttonp ressed

pub lic void mouseDragged( MouseEvent event)

 {

     statusBar.setText( "Dragged at [ " + event.getX ()  +

                ",  " + event.getY()  + "] ");

}

                                    110

----------------------- Page 111-----------------------

     // handle event when user moves mouse

    pub lic void mouseMoved( MouseEvent event)

     {

         statusBar.setText( "Moved at [ " + event.getX ()  +

                   ",  " + event.getY()  + "] ");

     }

     // execute application

    pub lic static void main( String args[] )

     {

         MouseTracker application = new MouseTracker();

     }

} // end class MouseTracker

Kết quảthực thi chương trình:

4.5.3.Xửlý sựkiện bàn phím

4.5.3.Xửlý sựkiện bàn phím

     Để xử lý sự kiện bàn phím java hỗ trợ một bộ lắng nghe sự

kiện  đó  là  interface KeyListener.  Một   sự kiện  bàn  phím được

                                     111

----------------------- Page 112-----------------------

phát  sinh khi người dùng nhấn và nhả một phím trên bàn phím.

Một   lớp  hiện  thực  KeyListener  phải  cài  đặt  các  phương  thức

keyPressed, keyReleased và keyTyp ed. Mỗi phương thức này có

một  tham số là một  đối tượng kiểu KeyEvent. KeyEvent là lớp

con của lớp InputEvent.

     Các phương thức của interface KeyListener

         Phương thức keyPressed được gọi khi một phím bất kỳ

         được nhấn.

         Phương  thức  keyTyp ed  được   gọi  thực  hiện  khi  người

         dùng    nhấn    một   phím   không    phải   “phím  hành     động ”

         (nh    phím   mũi  tên,  phím  Home,  End,  Page  Up,  Page

         Down,     các   phím    chức    năng   nh   : Num     Lock,    Print

          Screen, Scroll Lock, Caps Lock, Pause).

         Phương  thức  keyReleased  được   gọi  thực  hiện  khi  nhả

         phím nhấn sau khi sựkiện keyPressed hoặc keyTyp ed.

Ví dụ: minh họa việc xử lý sự kiện chuột thông qua các phương

thức   của  interface  KeyListener.   Lớp  KeyDemo  bên   dưới  hiện

thực  interface KeyListener,  vì  vậy  tất   cả 3 phương  thức trong

KeyListener phải được cài đặt trong chương trình.

// KeyDemo.j ava

// Demonstrating keystroke events.

// Java corepa ckages

impo rtj ava.awt.*;

impo rtj ava.awt.event.*;

pub lic class KeyDemo extends Frame imp lements KeyListener

 {

    p rivate String line1 = "", line2 = "";

    p rivate String line3 = "";

    p rivate TextArea textArea;

     // set up GUI

    pub lic KeyDemo()

                                     112

----------------------- Page 113-----------------------

 {

     super( "Demonstrating Keystroke Events ");

     // set up TextArea

      textArea = new TextArea( 10, 15);

      textArea.setText( "Press any key on the keyboard...");

      textArea.setEnabled(f alse);

      this.add( textArea );

     // allowf rame top rocess Key events

     addKeyListener( this );

     setSize( 350, 100);

     setVisible( true);

}

// handlep ress of  any key

pub lic void keyPressed( KeyEvent event)

 {

      line1 = "Keyp ressed: " +

      event.getKeyText( event.getKeyCode() );

     setLines2and3( event);

}

// handle release of  any key

pub lic void keyReleased( KeyEvent event)

 {

      line1 = "Key released: " +

      event.getKeyText( event.getKeyCode() );

     setLines2and3( event);

}

// handlep ress of  an action key

pub lic void keyTyp ed( KeyEvent event)

 {

                                    113

----------------------- Page 114-----------------------

         line1 = "Key typ ed: " + event.getKeyChar();

         setLines2and3( event);

     }

     // set second and third lines of  outpu t

    p rivate void setLines2and3( KeyEvent event)

     {

         line2 = "This key is  " + ( event.isActionKey()  ? "" : "not

          ")  + "an action key ";

         String        temp         =        event.getKeyModif iersText(

         event.getModif iers() );

         line3 = "Modif ier keys p ressed: " + ( temp .equals( "")  ?

          "none" : temp );

         textArea.setText(line1+"

"+line2+"

"+ line3+"

" );

     }

     // execute application

    pub lic static void main( String args[] )

     {

         KeyDemo application = new KeyDemo();

     }

} // end class KeyDemo

Kết quảthực thi chương trình:

                                     114

----------------------- Page 115-----------------------

4.6.Một sốví dụminh họa

 4.6.Một sốví dụminh họa

Ví  dụ 1: Tạo bộ lắng nghe biến cố cho đối tượng khung chứa

Frame, và xử lý biến cốđóng cửa sổ.

impo rtj ava.awt.*;

impo rtj ava.awt.event.*;

pub lic class  WindowClosingDemo

 {

     pub lic static void main(String args[])

                                       115

----------------------- Page 116-----------------------

      {

          Framef       = new Frame ("WindowClosing Demo");

           WindowCloser closer = new WindowCloser();

          f .addWindowListener(closer);

          f .setBounds(10, 10, 300, 200);

          f .setVisible(true);

     }

}

impo rtj ava.awt.event.*;

class  WindowCloser imp lements  WindowListener

{

     pub lic void windowClosing(WindowEvent e)

      {

           System.out.p rintln("windowClosing..");

           System.exit(0);

     }

     pub lic void windowActivated(WindowEvent e)

      {

           System.out.p rintln("windowActivated...");

     }

     pub lic void windowClosed(WindowEvent e)

      {

           System.out.p rintln("windowClosed...");

     }

     pub lic void windowDeactivated(WindowEvent e)

      {

           System.out.p rintln("windowDeactivated...");

     }

     pub lic void windowDeiconif ied(WindowEvent e)

      {

           System.out.p rintln("windowDeiconif ied...");

     }

     pub lic void windowIconif ied(WindowEvent e)

      {

                                          116

----------------------- Page 117-----------------------

         System.out.p rintln("windowIconif ied...");

     }

     pub lic void windowOp ened(WindowEvent e)

     {   System.out.p rintln("windowOp ened...");

     }

}

Có thểdùng lớp trừu tượng WindowAdapter để tạo ra bộ lắng

nghe.

         public abstract class WindowAdapter extends Object

                   implements WindowListener

          (WindowAdapter  hiện  thực  interface  WindowListener

         nên  lớp  ảo này  cũng  có  7 phương thức giống nh              giao

         diện WindowListener)

impo rtj ava.awt.event.*;

class  WindowCloser extends  WindowAdapter

 {   pub lic void windowClosing(WindowEvent e)

     {   System.out.p rintln("windowClosing..");

         System.exit(0);

     }

}

Ví dụ2: CheckboxGroup Demo

impo rtj ava.awt.*;

pub lic class CheckboxGroupDemo extends Frame

 {

     p rivate Checkbox red, green, blue;

     p rivate CheckboxGroup checkGroup;

     pub lic CheckboxGroupDemo(String title)

     {   super(title);

         checkGroup = new CheckboxGroup();

         red = new Checkbox("Red", checkGroup,f alse);

         green = new Checkbox("Green", checkGroup,f alse);

         blue = new Checkbox("Blue", checkGroup,f alse);

                                     117

----------------------- Page 118-----------------------

           //add the checkboxes to thef rame

           Panel north = new Panel();

           north.add(red);

           north.add(green);

           north.add(blue);

           this.add(north, BorderLayout.NORTH);

           //register the event listener

           SetColor listener = new SetColor(this);

           red.addItemListener(listener);

           green.addItemListener(listener);

           blue.addItemListener(listener);

     }

     pub lic static void main(String [] args)

      {

           Framef      = new

           CheckboxGroupDemo("CheckboxGroupDemo");

          f .setSize(300,300);

          f .setVisible(true);

     }

} // end of  class

 impo rtj ava.awt.*;

 impo rtj ava.awt.event.*;

pub lic class SetColor imp lements ItemListener

 {

     p rivate Framepa llette;

     p rivate Color c;

     pub lic SetColor(Frame c)

      {

          pa llette = c;

     }

                                           118

----------------------- Page 119-----------------------

      pub lic void itemStateChanged(ItemEvent e)

       {

             String item = (String)  e.getItem();

             int state = e.getStateChange();

             if (item.equalsIgnoreCase("red"))

                         c = new Color(255, 0, 0);

             if (item.equalsIgnoreCase("green"))

                         c = new Color(0, 255, 0);

             if (item.equalsIgnoreCase("blue"))

                         c = new Color(0, 0, 255);

            pa llette.setBackground(c);

      }

} // end of  class

Kết quảthực thi chương trình:

Ví dụ 3: TextComponent

impo rtj ava.awt.*;

class TextCompon entDemo extends Frame

 {

      p rivate TextField textField;

      p rivate TextArea textArea;

      p rivate Button enter, clear;

      pub lic TextCompon entDemo (String title)

       {

             super(title);

                                                   119

----------------------- Page 120-----------------------

      textArea = new TextArea("", 0, 0,

      TextArea.SCROLLBARS_VERTICAL_ONLY);

      textArea.setEditable(f alse);

      textField = new TextField();

      enter = new Button("Enter");

      clear = new Button("Clear");

     //layout the GUI

      this.add(textArea, BorderLayout.CENTER);

      Panel southEast = new Panel(new BorderLayout());

      southEast.add(enter, BorderLayout.EAST);

      southEast.add(clear, BorderLayout.WEST);

      Panel south = new Panel(new BorderLayout());

      south.add(textField, BorderLayout.CENTER);

      south.add(southEast, BorderLayout.EAST);

      this.add(south, BorderLayout.SOUTH);

     //setup the event handling

      CreateList listener = new CreateList(textField,

      textArea);

      enter.addActionListener(listener);

      clear.addActionListener(listener);

      textField.addActionListener(listener);

}

pub lic TextField getTextField()

 {

      return textField;

}

pub lic static void main(String [] args)

                                      120

----------------------- Page 121-----------------------

     {

          TextCompon entDemof            = new TextCompon entDemo

          ("TextCompon entDemo ");

         f .setSize(300,200);

         f .setVisible(true);

         f .getTextField() .requestFocus();

     }

}

impo rtj ava.awt.*;

impo rtj ava.awt.event.*;

pub lic class CreateList imp lements ActionListener

 {

     p rivate int counter = 0;

     p rivate TextField source;

     p rivate TextArea destination;

     pub lic CreateList(TextField s, TextArea d)

     {    source = s;

          destination = d;

     }

     pub lic void actionPerf ormed(ActionEvent e)

     {

          String action = e.getActionCommand();

          if (action.equalsIgnoreCase("Enter"))

          {

               String text = source.getText();

               counter++;

               destination.append(counter + "." + text + "

");

               source.setText("");

          }

          else

               if (action.equalsIgnoreCase("Clear"))

               {

                                        121

----------------------- Page 122-----------------------

                               destination.setText("");

                               counter = 0;

                       }

        }

}

 Kết quảthực thi chương trình:

 Ví dụ 4: ListDemo

 impo rtj ava.awt.*;

pub lic class ListDemo extends Frame

 {      p rivate List li;

        p rivate Label selected;

        pub lic ListDemo(String title)

         {

                super(title);

                li = new List();

                li.add("Monday ");

                li.add("Tuesday ");

                li.add("Wednesday ");

                li.add("Thursday ");

                li.add("Friday ");

                li.add("Saturday ");

                li.add("Sunday ");

                                                               122

----------------------- Page 123-----------------------

           selected = new Label("Double click a day :",

           Label.CENTER);

           this.setLayout(new BorderLayout());

           this.add(selected , BorderLayout.NORTH);

           this.add(li, BorderLayout.CENTER);

           // Tao listener cho List

           ShowSelectionListener listener = new

           ShowSelectionListener(selected);

           li.addActionListener(listener);

     }

     pub lic static void main(String args[])

      {    ListDemof        = new ListDemo("List Demo");

          f .setBounds(10, 10, 300, 200);

          f .setVisible(true);

     }

}

impo rtj ava.awt.*;

impo rtj ava.awt.event.*;

class ShowSelectionListener imp lements ActionListener

{    p rivate Label lab;

     pub lic ShowSelectionListener(Label label_sel)

      {

           lab = label_sel;

     }

     pub lic void actionPerf ormed(ActionEvent e)

      {    // Tra ve Obj ect ma Event da xuat hien

           // getSource la phuong  thuc ke thua tu

           //j ava.util.EventObj ect

           Obj ect source = e.getSource();

                                           123

----------------------- Page 124-----------------------

          // Nguon gocpha t sinh bien co khong pha i la List

          if (!(source instanceof  List))

          {    return;

          }

          else

          {

              List li = (List) source;

               String selected = li.getSelectedItem();

               lab.setText(selected);

          }

     }

}

Kết quảthực thi chương trình:

Ví dụ 5: Xây dựng 1 lớp khung chứa Dialog dùng đểhiển thị

message giống nh         hàm MessageBox trên Windows.

impo rtj ava.awt.*;

impo rtj ava.awt.event.*;

class DialogDemo

{

     pub lic static void main(String[] args)

     {

          createMenu();

     }

                                       124

----------------------- Page 125-----------------------

p rivate static void createMenu()

 {

     // Tao Frame ung dung

     f inal Framef r = new Frame();

     f r.setLayout(new BorderLayout());

     // Tao cac menu bar

     MenuBar menubar = new MenuBar();

     Menu mTest = new Menu("Test");

     MenuItem testDlg  = new MenuItem("Test Dialog");

     testDlg.addActionListener(

          new ActionListener()

          {

               pub lic void actionPerf ormed(ActionEvent e)

               {

                         MessageBox msgBox  = new

                         MessageBox(f r,  "Here it is ",  "T/bao

                         Dialog");

                         msgBox.show();

               }

          }

     );

     mTest.add(testDlg);

     menubar.add(mTest);

     f r.setMenuBar(menubar);

     f r.setBounds(100, 100, 300, 200);

     f r.setVisible(true);

     f r.addWindowListener(

               new WindowAdapter()

               {

                    pub lic void windowClosing(WindowEvent e)

                    {

                         System.exit(0);

                                    125

----------------------- Page 126-----------------------

                        }

                   }

         );

     }// end of  createmenu()

} // end of  class

impo rtj ava.awt.*;

impo rtj ava.awt.event.*;

pub lic class MessageBox

 {

     Dialog msgBox;

     / * ----------------------------------------------------------------

     // Contructor cua lop MessageBox

     // pa rentWindow: cua so cha

     // title: Tieu de cua Dialog

     // msg: chuoi thong bao

     -----------------------------------------------------------------*/

     pub lic MessageBox(Framepa rentWindow, String msg,

     String title)

     {

          if (pa rentWindow == null)

          {

              Frame emp ty Win = new Frame();

              // Tao Modal Dialog (tham so thu 3:true)

               msgBox  = new Dialog(emp ty Win, title, true);

          }

          else

          {

               msgBox  = new Dialog(pa rentWindow, title, true);

          }

          // Doi tuong nhan dung de trinh bay cau thong bao

          Label Message = new Label(msg);

          // Thiet lap che do trinh bay layout cho cac doi tuong.

                                       126

----------------------- Page 127-----------------------

          msgBox.setLayout(new FlowLayout());

          // Dua nhan thong bao Label vao khung chua Dialog

          msgBox.add(Message);

          // Dua nut nhan OK vao trong khung chua Dialog

          Button okButton = new Button("OK ");

          msgBox.add(okButton);

          // Khai bao kich thuoc cua cua so thong bao

          msgBox.setSize(200, 100);

          // Xu ly  tinh huong khi nguoi dung nhan nut OK

          okButton.addActionListener(

               new ActionListener()

               {

                   pub lic void actionPerf ormed(ActionEvent evt)

                   {

                             msgBox.setVisible(f alse);

                   }

              }

         );

     }

     pub lic void show()

     {

          msgBox.show();

     }

} // end of  class MessageBox

Kết quảthực thi chương trình:

                                       127

----------------------- Page 128-----------------------

              Chương 5: LUỒNG VÀ TẬP TIN

              Chương 5: LUỒNG VÀ TẬP TIN

                   (STREAMS & FILES)

5.1.Mởđầu

5.1.Mởđầu

     Việc l   u trữ dữ liệu trong các biến chương trình, các mảng

có tính chất tạm thời và dữ liệu sẽ mất  đi khi biến ra khỏi tầm

ảnh   hưởng   của  nó  hoặc  khi  chương  trình   kết  thúc. Files  giúp

cho các chương trình có thể l        u trữ một lượng lớn dữ liệu, cũng

nh    có  thể l  u trữ dữ liệu trong một  thời gian dài ngay cả khi

chương trình  kết  thúc. Trong chương này chúng ta sẽ tìm hiểu

làm thế nào các chương trình java có thể tạo, đọc, ghi và xử lý

các files tuần tự và các file truy cập ngẫu nhiên thông qua một

sốví dụminh họa.

      Xử lý files là một vấn đề hết sức cơ bản, quan trọng mà bất

kỳ một ngôn ngữ lập trình nào cũng phải hỗ trợnhững th                  viện,

hàm để xử lý một số thao tác cơ bản nhất  đối với kiểu dữ liệu

file.

      Xử lý files là một phần của công việc xử lý các luồng, giúp

cho một chương trình có thể đọc, ghi dữ liệu trong bộ nhớ, trên

files và trao đổ dữ liệu thông qua các kết nối trên mạng.

     Chương này  sẽ cung  cấp  cho  chúng ta những kiến thức cơ

bản vềluồng (streams) và files:

     -   Th    viện các lớp về luồng trong java: luồng byte, luồng

         ký tự.

     -   Xuất nhập Console dùng luồng byte, luồng ký tự.

     -   Xuất nhập files dùng luồng ký tựvà luồng byte.

     -    Vấn   đề  xử lý     files  truy    cập  ngẫu    nhiên   dùng     lớp

         RandomAccessFile.

     -    Xử lý file và th    mục dùng lớp File.

                                     128

----------------------- Page 129-----------------------

5.2.Luồng (Streams)

5.2.Luồng (Streams)

5.2.1.Khái niệm luồng

5.2.1.Khái niệm luồng

      Tất cả những hoạt  động nhập/xuất dữ liệu  (nhập dữ liệu từ

bàn  phím,   lấy  dữ liệu   từ  mạng  về,  ghi  dữ liệu  ra  đĩa, xuất   dữ

liệu  ra màn  hình, máy  in,  …)  đều  được quy  về  một  khái niệm

gọi là luồng  (stream). Luồng  là  nơi có  thể “sản xuất” và “tiêu

thụ”  thông  tin.  Luồng  thường  được  hệ thống  xuất  nhập  trong

java   gắn   kết   với  một  thiết   bị  vật  lý.  Tất   cả các  luồng  đều  có

chung  một  nguyên  tắc hoạt  động  ngay  cả khi chúng được  gắn

kết   với  các  thiết   bị  vật lý  khác  nhau.  Vì   vậy  cùng   một   lớp,

phương thức xuất nhập có thể dùng chung cho các thiết bị vật lý

khác nhau. Chẳng  hạn  cùng  một  phương  thức  có  thể dùng  để

ghi  dữ liệu  ra  console, đồng  thời  cũng  có  thể dùng  để ghi  dữ

liệu xuống một  file trên đĩa. Java hiện thực luồng bằng tập hợp

các lớp phân cấp trong góij ava.io.

     Java định nghĩa hai kiểu luồng: byte và ký tự (phiên bản gốc

chỉ định  nghĩa  kiểu  luồng  byte,  và  sau  đó  luồng  ký   tự được

thêm vào trong các phiên bản vềsau).

     Luồng byte (hay luồng dựa trên byte) hỗ trợ việc xuất nhập

dữ liệu  trên  byte,  thường  được  dùng  khi  đọc  ghi  dữ liệu  nhị

phân.

     Luồng ký tự được thiết kế hỗ trợviệc xuất nhập dữ liệu kiểu

ký tự (Unicode). Trong một vài trường hợp luồng ký tự sử dụng

hiệu quả hơn luồng byte, nh        ng ở mức hệthống thì tất cảnhững

xuất nhập đều phải qui vềbyte. Luồng ký tự hỗ trợhiệu quả chỉ

đối với việc quản lý, xử lý các ký tự.

5.2.2.Luồng byte (Byte Streams)

5.2.2.Luồng byte (Byte Streams)

     Các  luồng  byte  được  định  nghĩa  dùng  hai   lớp  phân   cấp.

Mức     trên    cùng    là  hai    lớp   trừu    tượng    InputStream      và

Outpu tStream. InputStream  định  nghĩa  những  đặc  điểm  chung

cho những luồng nhập byte. Outpu tStream mô tả cách xử lý của

các luồng xuất byte.

                                     129

----------------------- Page 130-----------------------

     Các     lớp  con     dẫn   xuất     từ  hai    lớp  InputStream       và

Outpu tStream sẽ hỗ trợ chi tiết tương ứng với việc đọc ghi dữ

liệu trên những thiết bịkhác nhau. Đừng choáng ngợp với hàng

loạt rất nhiều các lớp khác nhau. Đừng quá lo lắng, mỗi khi bạn

nắm vững, sử dụng thành thạo một luồng byte nào đó thì bạn dễ

dàng làm việc với những luồng còn lại.

    Lớp luồng byte                               Ý nghĩa

BufferedInputStream          Buffered input stream

BufferedOutputStream         Buffered output stream

ByteArrayInputStream         Input stream đọc dữ liệu từ một mảng

                             byte

ByteArrayOutputStream        Output stream ghi dữ liệu đến một mảng

                             byte

DataInputStream              Luồng nhập có những phương thức đọc

                             những kiểu dữ liệu chuẩn trong java

DataOutputStream             Luồng xuất có những phương thức ghi

                             những kiểu dữ liệu chuẩn trong java

FileInputStream              Luồng nhập cho phép đọc dữ liệu từ file

FileOutputStream             Luồng xuất  cho phép ghi dữ liệu xuống

                             file

FilterInputStream            Hiện thực lớp trừu tượng InputStream

FilterOutputStream           Hiện thực lớp trừu tượng Outpu tStream

InputStream                  Lớp trừu tượng, là lớp cha của tất cảcác

                             lớp luồng nhập kiểu Byte

OutputStream                 Lớp trừu tượng, là lớp cha của tất cảcác

                             lớp xuất nhập kiểu Byte

PipedInputStream             Luồng     nhập    byte    kiểu   ống    (piped)

                             thường    phải   được    gắn   với   một  luồng

                             xuất kiểu ống.

                                     130

----------------------- Page 131-----------------------

PipedOutputStream            Luồng     nhập    byte    kiểu   ống    (piped)

                             thường    phải   được    gắn   với   một  luồng

                             nhập  kiểu  ống  để  tạo  nên   một   kết   nối

                             trao đổi dữ liệu kiểu ống.

PrintStream                  Luồng xuất có chứa phương thức p rint()

                             vàp rintln()

PushbackInputStream          Là một  luồng nhập kiểu Byte mà hỗ trợ

                             thao tác trả lại (push back) và phục hồi

                             thao tác đọc một byte (unread)

RandomAccessFile             Hỗ trợ các thao tác đọc, ghi đối với file

                             truy cập ngẫu nhiên.

SequenceInputStream          Là   một  luồng  nhập  được   tạo  nên   bằng

                             cách nối kết logic các luồng nhập khác.

5.2.3.Luồng ký tự(Character Streams)

5.2.3.Luồng ký tự(Character Streams)

     Các  luồng  ký   tự được  định  nghĩa  dùng  hai  lớp  phân   cấp.

Mức  trên  cùng  là  hai   lớp  trừu   tượng  Reader  và       Writer.   Lớp

Reader dùng cho việc nhập dữ liệu của luồng, lớp  Writer dùng

cho việc xuất dữ liệu cua luồng. Những lớp dẫn xuất từ Reader

và Writer thao tác trên các luồng ký tựUnicode.

  Lớp luồng ký tự                              Ý nghĩa

BufferedReader            Luồng  nhập  ký   tự đọc   dữ liệu  vào   một

                          vùng đệm.

BufferedWriter            Luồng xuất ký tự ghi dữ liệu tới một vùng

                          đệm.

CharArrayReader           Luồng  nhập  đọc  dữ liệu   từ  một   mảng ký

                          tự

CharArrayWriter           Luồng  xuất  ghi  dữ liệu   tời  một   mảng  ký

                          tự

                                     131

----------------------- Page 132-----------------------

FileReader                Luồng nhập ký tự đọc dữ liệu từ file

FileWriter                Luồng xuất ký tự ghi dữ liệu đến file

FilterReader              Lớp    đọc    dữ liệu    trung   gian   (lớp   trừu

                          tượng)

FilterWriter              Lớp xuất trung gian trừu tượng

InputStreamReader         Luồng nhập chuyển bytes thành các ký tự

LineNumberReader          Luồng nhập đếm dòng

OutputStreamWriter        Luồng xuất chuyển những ký tự thành các

                          bytes

PipedReader               Luồng đọc dữ liệu bằng cơchếđường ống

PipedWriter               Luồng ghi dữ liệu bằng cơchếđường ống

PrintWriter               Luồng  ghi  văn  bản  ra thiết   bị xuất  (chứa

                          phương thứcp rint() vàp rintln() )

PushbackReader            Luồng  nhập  cho  phép  đọc  và  khôi phục

                          lại dữ liệu

Reader                    Lớp nhập dữ liệu trừu tượng

StringReader              Luồng nhập đọc dữ liệu từ chuỗi

StringWriter              Luồng xuất ghi dữ liệu ra chuỗi

Writer                    Lớp ghi dữ liệu trừu tượng

5.2.4.Những luồng được định nghĩa trước (The Predefined

5.2.4.Những luồng được định nghĩa trước (The Predefined

Streams)

Streams)

      Tất cả các chương trình viết bằng java luôn tự động import

góij ava.lang. Gói này có định nghĩa lớp System, bao gồm một

số đặc điểm của môi trường run-time, nó có ba biến luồng được

định  nghĩa  trước  là  in,  out  và  err,  các  biến  này  là  các  fields

được khai báo static trong lớp System.

                                     132

----------------------- Page 133-----------------------

         System.out:     luồng    xuất   chuẩn,    mặc   định   là  console.

         System.out là một đối tượng kiểu PrintStream.

         System.in:  luồng      nhập   chuẩn,   mặc    định   là  bàn  phím.

         System.in là một đối tượng kiểu InputStream.

         System.err: luồng  lỗi chuẩn,  mặc  định  cũng  là console.

         System.out      cũng   là   một  đối   tượng   kiểu   PrintStream

         giống System.out.

5.3.Sửdụng luồng Byte

5.3.Sửdụng luồng Byte

    Nh     chúng ta đã biết hai lớp InputStream và Outpu tStream

là hai  siêu   lớp  (cha)  đối  với  tất   cả những  lớp  luồng xuất  nhập

kiểu  byte. Những  phương  thức  trong  hai  siêu   lớp  này  ném  ra

các lỗi kiểu IOException. Những phương thức định nghĩa trong

hai siêu lớp này là có thể dùng trong các lớp con của chúng. Vì

vậy tập  các phương thức đó là tập tối tiểu các chức năng nhập

xuất mà những luồng nhập xuất kiểu byte có thể sử dụng.

              Những phương thức định nghĩa trong lớp

                     InputStream và OutputStream

      Phương thức                                 Ý nghĩa

InputStream

int available( )               Trả về số luợng bytes có thể đọc được

                               từ luồng nhập

void close( )

                               Đóng    luồng    nhập   và   giải  phóng    tài

                               nguyên      hệ  thống      gắn    với  luồng.

                               Không  thành  công   sẽ ném  ra   một   lỗi

                               IOException

void mark(int numBytes)

                               Đánh dấu  ở vị trí hiện tại trong luồng

                               nhập

boolean markSupported( )

                               Kiểm  tra  xem  luồng  nhập        có   hỗ trợ

                               phương thức mark() và reset() không.

                                     133

----------------------- Page 134-----------------------

int read( )

                                Đọc byte tiếp theo từ luồng nhập

int read(byte buffer[ ])

                                Đọc    buffer.length    bytes    và   l u  vào

                                trong vùng nhớ buffer. Kết  quả trả về

                                sốbytes thật sự đọc được

int read(byte buffer[ ], int

offset,                         Đọc numBytes bytes bắt đầu từ địa chỉ

int numBytes)                   offset   và    l u  vào   trong    vùng    nhớ

                                buffer. Kết  quả trả về số bytes thật sự

                                đọc được

void reset( )

                                Nhảy con trỏ đến vị trí được xác định

                                bởi việc gọi hàm mark() lần sau cùng.

long skip(long numBytes)

                                Nhảy  qua  numBytes  dữ liệu   từ luồng

                                nhập

OutputStream

void close( )

                                Đóng    luồng    xuất   và   giải  phóng     tài

                                nguyên      hệ  thống      gắn     với  luồng.

                                Không  thành  công   sẽ ném  ra   một   lỗi

                                IOException

void flush( )

                                Ép   dữ liệu   từ  bộ đệm  phải  ghi  ngay

                                xuống luồng (nếu có)

void write(int b)

                                Ghi byte dữ liệu chỉđịnh xuống luồng

void write(byte buffer[ ])

                                Ghi   buffer.length     bytes     dữ liệu     từ

                                mảng chỉđịnh xuống luồng

void write(byte buffer[ ], int

offset,                         Ghi  numBytes  bytes   dữ liệu   từ  vị trí

int numBytes)                   offset của mảng chỉ định buffer xuống

                                luồng

5.3.1.Đọc dữliệu từConsole

5.3.1.Đọc dữliệu từConsole

     Trước  đây, khi Java  mới ra  đời để thực hiện việc nhập   dữ

liệu   từ Console người ta chỉ dùng  luồng nhập  byte. Về sau thì

                                      134

----------------------- Page 135-----------------------

chúng ta có thể dùng cả luồng byte và luồng ký tự, nh               ng trong

một số trường hợp thực tế để đọc dữ liệu từ Console người ta

thích dùng luồng kiểu ký tự hơn, vì lý do đơn giản và dễ bảo trì

chương  trình.  Ở đây   với   mục  đích  minh   họa  chúng  ta  dùng

luồng byte thực hiện việc nhập xuất Console.

Ví   dụ:  chương  trình  minh   họa  việc  đọc   một         mảng  bytes   từ

System.in

Impo rtj ava.io.*;

class ReadBytes

{

         pub lic static void main(String args[])

                  throws IOExcep tion

         {

                  byte data[] = new byte[100] ;

                  System.out.p rint("Enter some characters.");

                  System.in.read(data);

                  System.out.p rint("You entered: ");

                  f or(int i=0; i < data.length; i++)

                           System.out.p rint((char)  data[i]);

         }

}

Kết quảthực thi chương trình:

5.3.2.Xuất dữliệu ra Console

5.3.2.Xuất dữliệu ra Console

      Tương  tự nh     nhập   dữ liệu   từ Console,  với phiên  bản đầu

tiên  của java để xuất   dữ liệu  ra Console tả chỉ có thể sử dụng

                                     135

----------------------- Page 136-----------------------

luồng byte. Kể từ phiên bản  1.1 (có thêm luồng ký tự), để xuất

dữ liệu ra Console có thể sử dụng cả luồng ký tự và luồng byte.

Tuy  nhiên,    cho   đến  nay  để xuất       dữ liệu  ra  Console  thường

người ta vẫn dùng luồng byte.

     Chúng  ta  đã  khá  quen  thuộc   với  phương  thức  print()  và

println(), dùng để xuất dữ liệu ra Console. Bên cạnh đ1o chúng

ta cũng có thểdùng phương thức write().

Ví   dụ: minh   họa   sử  dụng  phương  thức  System.out.write()  để

xuất ký tự ‘X’ ra Console

impo rtj ava.io.*;

class  WriteDemo

{

    pub lic static void main(String args[])

     {

         int b;

         b = 'X ';

         System.out.write(b);

         System.out.write('

');

     }

}

Kết quảthực thi chương trình:

5.3.3.Đọc và ghi file dùng luồng Byte

5.3.3.Đọc và ghi file dùng luồng Byte

      Tạo    một    luồng    Byte      gắn    với  file   chỉ  định     dùng

FileInputStream và FileOutputStream. Để mở một file, đơn giản

chỉ cần tạo một đối tượng của những lớp này, tên file cần mở là

thông số trong constructor. Khi file mở, việc đọc và ghi dữ liệu

                                     136

----------------------- Page 137-----------------------

trên  file  được  thực  hiện   một  cách  bình  thường  thông  qua  các

phương thức cung cấp trong luồng.

5.3.3.1 Đọc dữliệu từfile

         Mở một file đểđọc dữ liệu

         FileInputStream(Stringf ileName)  throws

         FileNotFoundExcep tion

         N  uf ile không tồn tại: thì ném ra

         FileNotFoundExcep tion

         Đọc dữ liệu: dùng phương thức read()

         int read()  throws IOExcep tion: đọc từng byte từ file và

         trả vềgiá trị của byte đọc được. Trả về-1 khi hết file, và

         ném ra IOException khi có lỗi đọc.

         Đóng file: dùng phương thức close()

         void close()  throws IOExcep tion: sau khi làm việc xong

         cần đóng file đểgiải phóng tài nguyên hệthống đã cấp

         phát cho file.

Ví dụ:

/ *

Hiển thị nội dung của mộtf ile tên test.txt lưu tạiD:\test.txt

 */

impo rtj ava.io.*;

class ShowFile

 {

    pub lic static void main(String args[])  throws IOExcep tion

     {

         int i;

         FileInputStreamf in;

         try

         {

             f in = new FileInputStream(“D:\\test.txt ”);

         }

          catch(FileNotFoundExcep tion exc)

         {

                  System.out.p rintln("File Not Found");

                                     137

----------------------- Page 138-----------------------

                  return;

         }

         catch(ArrayIndexOutOf BoundsExcep tion exc)

          {

                  System.out.p rintln("Usage: ShowFile File");

                  return;

         }

         // read bytes until EOF is encountered

         do

          {

                  i =f in.read();

                  if (i != -1)  System.out.p rint((char)  i);

         } while(i != -1);

         f in.close();

     }

}

Kết quảthực thi chương trình:

5.3.3.2 Ghi dữliệu xuống file

         Mở một file đểghi dữ liệu

         FileOutpu tStream(Stringf ileName)  throws

         FileNotFoundExcep tion

         N  uf ile không tạo được: thì ném ra

         FileNotFoundExcep tion

         Ghi dữ liệu xuống: dùng phương thức write()

         void   write(int   byteval)    throws    IOExcep tion:     ghi   một

         byte xác định bởi tham số byteval xuống file, và ném ra

         IOException khi có lỗi ghi.

         Đóng file: dùng phương thức close()

                                     138

----------------------- Page 139-----------------------

         void close( )  throws IOExcep tion: sau khi làm việc xong

         cần đóng file để giải phóng tài nguyên hệ thống đã cấp

         phát cho file.

Ví dụ: copy nội dung một file text đến một file text khác.

/ * Copy nội dung của một file text */

impo rtj ava.io.*;

class CopyFile

{

    pub lic static void main(String args[]) throws IOExcep tion

     {

         int i;

         FileInputStreamf in;

         FileOutpu tStreamf out;

         try

         {

              // open inputf ile

              try

              {

                  f in = new FileInputStream(“D:\\source.txt ”);

              }

              catch(FileNotFoundExcep tion exc)

              {

                  System.out.p rintln("Input File Not Found");

                   return;

              }

              // open outpu tf ile

              try

              {

                  f out = new FileOutpu tStream(“D:\\dest.txt ”);

              }

              catch(FileNotFoundExcep tion exc)

              {

                                      139

----------------------- Page 140-----------------------

                  System.out.p rintln("Error Op ening Outpu t

                  File");

                  return;

              }

         }

          catch(ArrayIndexOutOf BoundsExcep tion exc)

          {

              System.out.p rintln("Usage: CopyFile From To");

              return;

         }

         // Copy File

         try

         {

              do

              {

                  i =f in.read();

                  if (i != -1) f out.write(i);

              } while(i != -1);

         }

         catch(IOExcep tion exc)

         {

              System.out.p rintln("File Error");

         }

         f in.close();

         f out.close();

     }

}

Kết  quả thực thi chương trình: chương trình  sẽ copy  nội dung

của file D:\source.txt và ghi vào một file mới D:\dest.txt.

                                     140

----------------------- Page 141-----------------------

5.3.4.Đọc và ghi dữliệu nhịphân

5.3.4.Đọc và ghi dữliệu nhịphân

     Phần trên chúng ta đã đọc và ghi các bytes dữ liệu là các ký

tự mã ASCII. Để đọc và ghi những giá trịnhịphân của các kiểu

dữ liệu    trong  java,    chúng    ta   sử  dụng   DataInputStream        và

DataOutpu tStream.

DataOutputStream: hiện  thực  interface DataOuput. Interface

DataOutput  có các phương thức cho phép ghi tất cảnhững kiểu

dữ liệu cơ sở của java đến luồng (theo định dạng nhịphân).

        Phương thức                               Ý nghĩa

 void writeBoolean               Ghi    xuống      luồng     một   giá   trị

 (boolean val)                   boolean được xác định bởi val.

 void writeByte (int val)        Ghi   xuống     luồng    một  byte   được

                                 xác định bởi val.

 void writeChar (int val)        Ghi  xuống  luồng   một       Char   được

                                 xác định bởi val.

 void writeDouble                Ghi    xuống      luồng     một   giá   trị

 (double val)                    Double được xác định bởi val.

 void writeFloat (f loat         Ghi  xuống  luồng   một  giá  trị float

 val)                            được xác định bởi val.

 void writeInt (int val)         Ghi   xuống     luồng    một  giá   trị int

                                 được xác định bởi val.

 void writeLong (long            Ghi  xuống  luồng   một  giá  trị long

 val)                            được xác định bởi val.

 void writeShort (int val)       Ghi xuống  luồng  một  giá trị short

                                 được xác định bởi val.

     Contructor: DataOutputStream(OutputStream outputStream)

     Outpu tStream: là luồng xuất   dữ liệu. Để ghi  dữ liệu  ra file

     thì đối tượng outpu tStream có thểlà FileOutpu tStream.

                                     141

----------------------- Page 142-----------------------

DataInputStream:          hiện   thực   interface   DataInput.     Interface

DataInput có các phương thức cho phép đọc tất cả những kiểu

dữ liệu cơ sở của java (theo định dạng nhịphân).

        Phương thức                               Ý nghĩa

 boolean readBoolean()           Đọc một giá trịboolean

 Byte readByte()                 Đọc một byte

 char readChar()                 Đọc một Char

 double readDouble()             Đọc một giá trịDouble

 f loat readFloat()              Đọc một giá trịfloat

 int readInt()                   Đọc một giá trịint

 Long readLong()                 Đọc một giá trịlong

 short readShort()               Đọc một giá trịshort

     Contructor: DataInputStream(InputStream inputStream)

     InputStream: là luồng nhập dữ liệu. Đểđọ dữ liệu từ file thì

     đối tượng InputStream có thểlà FileInputStream.

Ví dụ: dùng DataOutputStream và DataInputStream đểghi và

đọc những kiểu dữ liệu khác nhau trên file.

impo rtj ava.io.*;

class R WData

{

    pub lic static void main(String args[])  throws IOExcep tion

     {

         DataOutpu tStream dataOut;

         DataInputStream dataIn;

         int i = 10;

         double d = 1023.56;

         boolean b = true;

         try

         {

              dataOut = new DataOutpu tStream(

                           new FileOutpu tStream("D:\\testdata"));

         }

         catch(IOExcep tion exc)

                                     142

----------------------- Page 143-----------------------

 {

      System.out.p rintln("Cannot openf ile.");

       return;

}

try

 {

      System.out.p rintln("Writing  " + i);

      dataOut.writeInt(i);

      System.out.p rintln("Writing  " + d);

      dataOut.writeDouble(d);

      System.out.p rintln("Writing  " + b);

      dataOut.writeBoolean(b);

      System.out.p rintln("Writing  " + 12.2  * 7.4);

      dataOut.writeDouble(12.2  * 7.4);

}

catch(IOExcep tion exc)

 {

      System.out.p rintln("Write error.");

}

dataOut.close();

System.out.p rintln();

// Now, read them back.

try

 {

      dataIn = new DataInputStream(

             new FileInputStream("D:\\testdata"));

}

catch(IOExcep tion exc)

 {

      System.out.p rintln("Cannot openf ile.");

       return;

}

                                      143

----------------------- Page 144-----------------------

             try

             {

                   i = dataIn.readInt();

                   System.out.p rintln("Reading  " + i);

                   d = dataIn.readDouble();

                   System.out.p rintln("Reading  " + d);

                   b = dataIn.readBoolean();

                   System.out.p rintln("Reading  " + b);

                   d = dataIn.readDouble();

                   System.out.p rintln("Reading  " + d);

            }

             catch(IOExcep tion exc)

             {     System.out.p rintln("Read error.");

            }

             dataIn.close();

      }

}

Kết quảthực thi chương trình:

Dữ liệu ghi xuống file D:\\testdata

Kết quảđọc và xuất ra Console:

                                                   144

----------------------- Page 145-----------------------

5.4.File truy cập ngẫu nhiên (Random Access Files)

5.4.File truy cập ngẫu nhiên (Random Access Files)

     Bên   cạnh  việc   xử lý  xuất  nhập  trên  file  theo  kiểu  tuần   tự

thông qua các luồng, java cũng hỗ trợ truy cập ngẫu nhiên nội

dung      của     một   file   nào     đó    dùng     RandomAccessFile.

RandomAccessFile          không      dẫn   xuất     từ  InputStream       hay

OutputStream       mà    nó    hiện   thực    các   interface   DataInput,

DataOutpu t      (có  định   nghĩa   các   phương     thức   I/O    cơ  bản).

RandomAccessFile hỗ trợ vấn đề định vị con trỏ file bên trong

một file dùng phương thức seek(long newPos).

Ví   dụ:  minh   họa  việc  truy   cập  ngẫu  nhiên  trên  file.  Chương

trình  ghi  6   số kiểu  double  xuống  file,  rồi đọc  lên  theo  thứ  tự

ngẫu nhiên.

impo rtj ava.io.*;

class RandomAccessDemo

{

    pub lic static void main(String args[])  throws IOExcep tion

     {

         double data[] = {19.4, 10.1, 123.54, 33.0, 87.9,  74.25};

         double d;

         RandomAccessFile raf ;

         try

         {

              raf   =   new    RandomAccessFile("D:\\random.dat",

              "rw");

         }

         catch(FileNotFoundExcep tion exc)

         {

              System.out.p rintln("Cannot openf ile.");

              return ;

         }

                                     145

----------------------- Page 146-----------------------

 //  Write values to thef ile.

f or(int i=0; i < data.length; i++)

 {

      try

      {

            raf .writeDouble(data[i]);

      }

      catch(IOExcep tion exc)

      {

            System.out.p rintln("Error writing tof ile.");

            return ;

      }

}

 try

 {

      // Now, read back sp ecif ic values

      raf .seek(0); // seek tof irst double

      d = raf .readDouble();

      System.out.p rintln("First value is  " + d);

      raf .seek(8); // seek to second double

      d = raf .readDouble();

      System.out.p rintln("Second value is  " + d);

      raf .seek(8 * 3); // seek tof ourth double

      d = raf .readDouble();

      System.out.p rintln("Fourth value is  " + d);

      System.out.p rintln();

      // Now, read every other value.

      System.out.p rintln("Here is every other value: ");

     f or(int i=0; i < data.length; i+=2)

      {     raf .seek(8 * i); // seek to ith double

            d = raf .readDouble();

            System.out.p rint(d + " ");

      }

                                  146

----------------------- Page 147-----------------------

              System.out.p rintln("

");

         }

         catch(IOExcep tion exc)

         {

              System.out.p rintln("Error seeking or reading.");

         }

         raf .close();

     }

}

Kết quảthực thi chương trình:

5.5.Sửdụng luồng ký tự

5.5.Sửdụng luồng ký tự

     Chúng ta đã tìm hiểu và sử dụng luồng byte đểxuất/nhập dữ

liệu.  Tuy  có  thể nh     ng  trong   một   số trường   hợp  luồng  byte

không phải là cách “lý tưởng” để quản lý xuất nhập dữ liệu kiểu

character,  vì  vậy java  đã  đ a ra kiểu  luồng  character  phục  vụ

cho việc xuất nhập dữ liệu kiểu character trên luồng.

      Mức trên cùng là hai lớp trừu tượng Reader và  Writer. Lớp

Reader dùng cho việc nhập dữ liệu của luồng, lớp  Writer dùng

cho việc xuất dữ liệu của luồng. Những lớp dẫn xuất từ Reader

và Writer thao tác trên các luồng ký tựUnicode.

        Những phương thức định nghĩa trong lớp trừu tượng

                             Reader và Writer

       Phương thức                                Ý nghĩa

                                     147

----------------------- Page 148-----------------------

Reader

abstract void close()               Đóng luồng

void mark(int numChars)             Đánh dấu vịtrí hiện tại trên luồng

boolean markSupported()             Kiểm tra xem luồng có hỗtrợ

                                    thao tác đánh dấu mark() không?

int read()                          Đọc một ký tự

int read(char buff er[ ])           Đọc buffer.length ký tự cho vào

                                    buffer

abstract int read(char              Đọc numChars ký tự cho vào

buff er[ ],                         vùng đệm buffer tại vịtrí

int off set,                        buffer[offset]

int numChars)

boolean ready ()                    Kiểm tra xem luồng có đọc được

                                    không?

void reset()                        Dời con trỏnhập đến vịtrí đánh

                                     dấu trước đó

long skip (long numChars)           Bỏ qua numChars của luồng nhập

Writer

abstract void close()               Đóng luồng xuất. Có lỗi ném ra

                                    IOException

abstract voidf lush()               Dọn dẹp luồng (buffer xuất)

void write(int ch)                   Ghi một ký tự

void write(byte buff er[ ])          Ghi một mảng các ký tự

abstract void write(char             Ghi một phần của mảng ký tự

buff er[ ],

int off set,

int numChars)

void write(String str)               Ghi một chuỗi

void write(String str, int           Ghi một phần của một chuỗi ký tự

off set,

int numChars)

                                     148

----------------------- Page 149-----------------------

5.5.1.Nhập Console dùng luồng ký tự

5.5.1.Nhập Console dùng luồng ký tự

     Thường thì việc nhập dữ liệu từ Console dùng luồng ký tự

thì thuận lợi hơn dùng luồng byte. Lớp tốt nhất để đọc dữ liệu

nhập    từ Console  là   lớp  Buff eredReader.  Tuy  nhiên  chúng  ta

không    thể xây      dựng    một    lớp Buff eredReader      trực   tiếp   từ

System.in.  Thay  vào      đó   chúng  ta  phải  chuyển  nó  thành   một

luồng ký tự. Để làm điều này chúng ta dùng InputStreamReader

chuyển bytes thành ký tự.

     Để có    được     một   đối   tượng   InputStreamReader         gắn   với

System.in ta dùng constructor của InputStreamReader.

         InputStreamReader(InputStream inputStream)

     Tiếp  theo  dùng đối  tượng InputStreamReader đã  tạo ra để

tạo ra một Buff eredReader dùng constructor Buff eredReader.

         BufferedReader(Reader inputReader)

Ví dụ: Tạo một BufferedReader gắn với Keyboard

         Buff eredReader br = new Buff eredReader(new

         Buff eredReader br = new Buff eredReader(new

                  InputStreamReader(System.in));

Sau khi thực hiện câu lệnh trên, br là một  luồng ký tự gắn với

Console thông qua System.in.

Ví dụ: Dùng BufferedReader  đọc từng ký tự từ Console. Việc

đọc  kết  thúc khi gặp dấu  chấm (dấu  chấm để kết  thúc chương

trình).

impo rtj ava.io.*;

class ReadChars

{

    pub lic static void main(String args[])  throws IOExcep tion

     {

         char c;

         Buff eredReader br = newBuff eredReader(

                                     149

----------------------- Page 150-----------------------

                           new InputStreamReader(System.in));

         System.out.p rintln("Nhap chuoi ky tu,

                                    gioi han dau cham.");

         // read characters

         do

         {

                  c = (char)  br.read();

                  System.out.p rintln(c);

         } while(c != '.');

     }

}

Kết quảthực thi chương trình:

Ví    dụ:  Dùng    BufferedReader       đọc   chuỗi   ký    tự  từ Console.

Chương trình kết thúc khi gặp chuỗi đọc là chuỗi “stop”

impo rtj ava.io.*;

class ReadLines

{

    pub lic static void main(String args[])  throws IOExcep tion

     {

         // create a Buff eredReader using System.in

         Buff eredReader br = new Buff eredReader(new

                                    InputStreamReader(System.in));

         String str;

         System.out.p rintln("Nhap chuoi.");

         System.out.p rintln("Nhap 'stop' ket thuc chuong trinh.");

                                     150

----------------------- Page 151-----------------------

         do

          {

                  str = br.readLine();

                  System.out.p rintln(str);

         } while(!str.equals("stop"));

     }

}

Kết quảthực thi chương trình:

5.5.2.Xuất Console dùng luồng ký tự

 5.5.2.Xuất Console dùng luồng ký tự

     Trong  ngôn  ngữ java,  bên   cạnh  việc  dùng  System.out  để

xuất   dữ liệu ra Console (thường dùng để debug  chương trình),

chúng  ta  có  thể dùng  luồng  PrintWriter  đối   với  các  chương

trình   “chuyên    nghiệp”.    PrintWriter     là  một   trong   những     lớp

luồng ký  tự. Việc dùng các lớp  luồng ký tự để xuất dữ liệu ra

Console thường được “         a chuộng” hơn.

     Để xuất dữ liệu ra Console dùng PrintWriter cần thiết phải

chỉđịnh System.out cho luồng xuất.

Ví dụ: Tạo đối tượng PrintWriter đểxuất dữ liệu ra Console

         PrintWriterp w = new PrintWriter(System.out, true);

Ví dụ: minh họa dùng PrintWriter đểxuất dữ liệu ra Console

impo rtj ava.io.*;

pub lic class PrintWriterDemo

 {

     pub lic static void main(String args[])

     {

         PrintWriterp w = new PrintWriter(System.out, true);

         int i = 10;

                                     151

----------------------- Page 152-----------------------

         double d = 123.67;

         double r = i+d

         p w.p rintln("Using a PrintWriter.");

         p w.p rintln(i);

         p w.p rintln(d);

         p w.p rintln(i + " + " + d + " = " + r);

     }

}

Kết quảthực thi chương trình:

5.5.3.Đọc/ghi File dùng luồng ký tự

5.5.3.Đọc/ghi File dùng luồng ký tự

     Thông  thường  để đọc/ghi file người ta thường  dùng  luồng

byte, nh    ng đối với luồng ký tự chúng ta cũng có thể thực hiện

được. Ưu điểm của việc dùng luồng ký tự là chúng thao tác trực

tiếp trên các ký tự Unicode. Vì vậy luồng ký tự là chọn lựa tốt

nhất khi cần l    u những văn bản Unicode.

     Hai  lớp  luồng  thường  dùng  cho việc đọc/ghi  dữ liệu  ký  tự

xuống file là FileReader và FileWriter.

Ví dụ: Đọc những dòng văn bản nhập từ bàn phím và ghi chúng

xuống  file tên là “test.txt”. Việc đọc và ghi kết  thúc khi người

dùng nhập vào chuỗi “stop”.

impo rtj ava.io.*;

class KtoD

{

    pub lic static void main(String args[])  throws IOExcep tion

     {

         String str;

         FileWriterf w;

                                     152

----------------------- Page 153-----------------------

         Buff eredReader br = new Buff eredReader(

                  new InputStreamReader(System.in));

         try

         {

             f w = new FileWriter("D:\\test.txt");

         }

         catch(IOExcep tion exc)

         {

              System.out.p rintln("Khong the mof ile.");

              return ;

         }

         System.out.p rintln("Nhap        ('stop'  de   ket   thuc   chuong

         trinh) .");

         do

         {

              System.out.p rint(": ");

              str = br.readLine();

              if (str.compa reTo("stop")  == 0)  break;

              str = str + "

";

             f w.write(str);

         } while(str.compa reTo("stop")  != 0);

         f w.close();

     }

}

Kết quảthực thi chương trình

Dữ liệu nhập từ Console:

                                     153

----------------------- Page 154-----------------------

Dữ liệu ghi xuống file:

Ví dụ: đọc và hiển thị nội dung của file “test.txt” lên màn hình.

impo rtj ava.io.*;

class DtoS

{

     pub lic static void main(String args[])  throws Excep tion

     {

         FileReaderf r = new FileReader("D:\\test.txt");

         Buff eredReader br = new Buff eredReader(f r);

          String s;

          while((s = br.readLine())  != null)

          {

              System.out.p rintln(s);

         }

         f r.close();

     }

}

Kết quảthực thi chương trình

Nội dung của file test.txt:

                                      154

----------------------- Page 155-----------------------

Kết quảđọc file  và hiển thịra Console:

5.6.Lớp File

5.6.Lớp File

      Lớp  File  không  phục   vụ cho  việc  nhập/xuất   dữ liệu  trên

luồng.  Lớp  File    thường được dùng để biết  được các thông tin

chi  tiết   về  tập  tin   cũng  nh  th    mục  (tên,  ngày  giờ  tạo,  kích

thước, …)

         java.lang.Object

          +--java.io.File

Các Constructor:

     Tạo đối tượng File từ đường dẫn tuyệt đối

    pub lic File(String pa thname)

     ví dụ: Filef   = new File(“C:\\Java\\vd1.j ava ”);

     Tạo đối tượng File từtên đường dẫn và tên tập tin tách biệt

    pub lic File(String pa rent, String child)

     ví dụ: Filef   = new File(“C:\\Java ”,  “vd1.j ava ”);

     Tạo đối tượng File từ một đối tượng File khác

    pub lic File(Filepa rent, String child)

     ví dụ:       File dir = new File (“C:\\Java ”);

                  Filef   = new File(dir,  “vd1.j ava ”);

                                     155

----------------------- Page 156-----------------------

      Một số phương thức thường gặp của lớp File (chi tiết về các

phương thức đọc thêm trong tài liệu J2SE API Specification)

 pub lic String getName()               Lấy tên của đối tượng File

 pub lic String getPath()               Lấy đường dẫn của tập tin

 pub lic boolean isDirectory()          Kiểm tra xem tập tin có phải

                                        là th  mục không?

 pub lic boolean isFile()               Kiểm tra xem tập tn có phải là

                                        một file không?

  …

 pub lic String[] list()                Lấy danh sách tên các tập tin

                                        và th   mục con của đối tượng

                                        File đang xét và trả vềtrong

                                        một mảng.

Ví dụ:

impo rtj ava.awt.*;

impo rtj ava.io.*;

pub lic class FileDemo

 {

     pub lic static void main(String args[])

     {

         Framef r = new Frame ("File Demo");

         f r.setBounds(10, 10, 300, 200);

         f r.setLayout(new BorderLayout());

         Panelp  = new Panel(new GridLayout(1,2));

         List list_C = new List();

         list_C.add("C:\\");

         File driver_C = new File ("C:\\");

         String[] dirs_C = driver_C.list();

                                     156

----------------------- Page 157-----------------------

           f or (int i=0;i<dirs_C.length;i++)

            {     Filef     = new File ("C:\\" + dirs_C[i]);

                  if (f .isDirectory ())

                        list_C.add("<DIR>" + dirs_C[i]);

                  else

                        list_C.add("            " + dirs_C[i]);

            }

            List list_D  = new List();

            list_D.add("D:\\");

            File driver_D  = new File ("D:\\");

            String[] dirs_D  = driver_D.list();

           f or (int i=0;i<dirs_D.length;i++)

            {     Filef     = new File ("D:\\" + dirs_D[i]);

                  if (f .isDirectory ())

                        list_D.add("<DIR>" + dirs_D[i]);

                  else

                        list_D.add("            " + dirs_D[i]);

            }

            p .add(list_C);

            p .add(list_D);

           f r.add(p, BorderLayout.CENTER);

           f r.setVisible(true);

      }

}

Kết quảthực thi chương trình:

                                                157

----------------------- Page 158-----------------------

       Chương 6: LẬP TRÌNH CƠSỞDỮLIỆU

       Chương 6: LẬP TRÌNH CƠSỞDỮLIỆU

6.1.GIỚI THIỆU

6.1.GIỚI THIỆU

Hầu  hết  các  ch    ơng  trình  máy  tính  hiện  này  đếu  ít  nhiều  liên

Hầu  hết  các  ch    ơng  trình  máy  tính  hiện  này  đếu  ít  nhiều  liên

quan đến việc truy xuất thông tin trong các cơ sởdữ liệu. Chính

quan đến việc truy xuất thông tin trong các cơ sởdữ liệu. Chính

vì thế nên  các  thao  tác hỗ trợ lập  trình  cơ sở dữ liệu  là  chức

vì thế nên  các  thao  tác hỗ trợ lập  trình  cơ sở dữ liệu  là  chức

năng không thể thiếu của các ngôn ngữ lập trình hiện đại, trong

năng không thể thiếu của các ngôn ngữ lập trình hiện đại, trong

đó có Java. JDBC API là th           viện chứa các lớp và giao diện hỗ

đó có Java. JDBC API là th           viện chứa các lớp và giao diện hỗ

trợ lập trình viên Java kết  nối và truy cập đến các hệ cơ sở dữ

trợ lập trình viên Java kết  nối và truy cập đến các hệ cơ sở dữ

liệu.

liệu.

Phiên  bản  JDBC  API  mới  nhất  hiện  nay  là  3.0,  là  một  thành

Phiên  bản  JDBC  API  mới  nhất  hiện  nay  là  3.0,  là  một  thành

phần trong J2SE, nằm trong 2 gói th           viện:

phần trong J2SE, nằm trong 2 gói th           viện:

            ß java.sql:      chứa    các  lớp   và  giao   diên  cơ sở của

            ß java.sql:       chứa   các  lớp   và  giao   diên  cơ sở của

                JDBC API.

                JDBC API.

            ß javax.sql:  chứa các lớp và giao diện mởrộng.

            ß javax.sql:  chứa các lớp và giao diện mởrộng.

JDBC  API  cung  cấp  cơ chế cho  phép  một  ch              ơng  trình  viết

JDBC  API  cung  cấp  cơ chế cho  phép  một  ch              ơng  trình  viết

bằng Java có khả năng độc lập với các hệ cơ sở dữ liệu, có khả

bằng Java có khả năng độc lập với các hệ cơ sở dữ liệu, có khả

năng truy cập đến các hệ cơ sở dữ liệu khác nhau mà không cần

năng truy cập đến các hệ cơ sở dữ liệu khác nhau mà không cần

viết  lại ch  ơng trình. JDBC đơn  giản hóa việc tạo và thi hành

viết  lại ch  ơng trình. JDBC đơn  giản hóa việc tạo và thi hành

các câu truy vấn SQL trong ch          ơng trình.

các câu truy vấn SQL trong ch          ơng trình.

6.2.KIẾN TRÚC JDBC

6.2.KIẾN TRÚC JDBC

Kiến  trúc  của  của  JDBC  t       ơng  tự nh      kiến  trúc  ODBC  do

Kiến  trúc  của  của  JDBC  t       ơng  tự nh      kiến  trúc  ODBC  do

Microsoft  xây dựng. Theo kiến trúc này các thao tác liên quan

Microsoft  xây dựng. Theo kiến trúc này các thao tác liên quan

đến cơ sở dữ liệu trong ch        ơng trình đ ợc thực hiện thông qua

đến cơ sở dữ liệu trong ch         ơng trình đ ợc thực hiện thông qua

các JDBC API. Sau đó các JDBC API sẽtruyền các yêu cầu của

các JDBC API. Sau đó các JDBC API sẽtruyền các yêu cầu của

ch   ơng trình đến bộ quản lý trình điều khiển JDBC, là bộ phận

ch   ơng trình đến bộ quản lý trình điều khiển JDBC, là bộ phận

có nhiệm vụ lựa chọn trình điều khiển thích hợp  để có thể làm

có nhiệm vụ lựa chọn trình điều khiển thích hợp  để có thể làm

việc với cơsởdữ liệu cụthểmà ch            ơng trình muốn kết nối.

việc với cơsởdữ liệu cụthểmà ch            ơng trình muốn kết nối.

                                     158

----------------------- Page 159-----------------------

Nh    vậy kiến trúc của JDBC gồm 2 tầng:              tầng đầu tiên là các

Nh    vậy kiến trúc của JDBC gồm 2 tầng:              tầng đầu tiên là các

JDBC API, có nhiệm vụ chuyển các câu lệnh SQL cho bộ quản

JDBC API, có nhiệm vụ chuyển các câu lệnh SQL cho bộ quản

lý trình điều khiển JDBC; tầng thứ 2 là các JDBC Driver API,

lý trình điều khiển JDBC; tầng thứ 2 là các JDBC Driver API,

thực hiện nhiệm vụ liện hệ vớ trình điều  khiển  của hệ quản trỉ

thực hiện nhiệm vụ liện hệ vớ trình điều  khiển  của hệ quản trỉ

cơsởdữ liệu cụthể.

cơsởdữ liệu cụthể.

                                     159

----------------------- Page 160-----------------------

Hình  bên    d  ới  minh  họa  các  lớp  và  giao  diện  cơ bản  trong

Hình  bên    d  ới  minh  họa  các  lớp  và  giao  diện  cơ bản  trong

JDBC API.

JDBC API.

6.3.Các khái niệm cơbản

6.3.Các khái niệm cơbản

6.3.1.JDBC Driver

6.3.1.JDBC Driver

Để có thểtiến hành truy cập đến các hệ quản trịcơsởdữ liệu sử

Để có thểtiến hành truy cập đến các hệ quản trịcơsởdữ liệu sử

dụng  kỹ thuật     JDBC,  chúng  ta  cần  phải  cò  trình  điều  khiển

dụng  kỹ thuật      JDBC,  chúng  ta  cần  phải  cò  trình  điều  khiển

JDBC của hệ quản trị CSDL mà chúng ta đang sử dụng. Trình

JDBC của hệ quản trị CSDL mà chúng ta đang sử dụng. Trình

điều khiển JDBC là đoạn ch           ơng trình, do chính nhà xây dựng

điều khiển JDBC là đoạn ch           ơng trình, do chính nhà xây dựng

hệ quản  trị CSDL hoặc do nhà cung ứng thứ ba cung  cấp, có

hệ quản  trị CSDL hoặc do nhà cung ứng thứ ba cung  cấp, có

khả năng  yêu  cầu  hệ quản  trị CSDL  cụ thể thực hiện  các  câu

khả năng  yêu  cầu  hệ quản  trị CSDL  cụ thể thực hiện  các  câu

lệnh SQL.

lệnh SQL.

Danh sách các trình điều khiển JDBC cho các hệ quản trịCSDL

Danh sách các trình điều khiển JDBC cho các hệ quản trịCSDL

khác nhau  đ ợc  Sun  cung  cấp  và cập  nhật  liên tục tại địa chỉ:

khác nhau  đ ợc  Sun  cung  cấp  và cập  nhật  liên tục tại địa chỉ:

http ://industry.j ava.sun.com/p roducts/j dbc/drivers.

http ://industry.j ava.sun.com/p roducts/j dbc/drivers.

Các trình điều khiển JDBC đ ợc phân làm 04 loại khác nhau.

Các trình điều khiển JDBC đ ợc phân làm 04 loại khác nhau.

            ß Loại  1:      có  tên  gọi  là Bridge Driver. Trình  điều

            ß Loại  1:      có  tên  gọi  là Bridge Driver. Trình  điều

                khiển loại này kết nối với các hệ CSDL thông qua

                khiển loại này kết nối với các hệ CSDL thông qua

                cầu   nối   ODBC.  Đây       chính   là  chình   điều  khiển

                cầu   nối   ODBC.  Đây       chính   là  chình   điều  khiển

                                     160

----------------------- Page 161-----------------------

     đ ợc sử dụng phổ biến nhất trong những ngày đầu

     đ ợc sử dụng phổ biến nhất trong những ngày đầu

     Java    xuất    hiện.    Tuy  nhiên,  ngày  nay  trình             điều

     Java    xuất    hiện.    Tuy  nhiên,  ngày  nay  trình             điều

     khiển  loại  này  không  còn  phổ biến  do  có  nhiều

     khiển  loại  này  không  còn  phổ biến  do  có  nhiều

     hạn chế. Trình điều khiển loại này luôn đ ợc cung

     hạn chế. Trình điều khiển loại này luôn đ ợc cung

     cấp        kèm        trong        bộ       J2SE         với       tên:

     cấp        kèm        trong        bộ        J2SE        với       tên:

     sun.jdbc.odbc.JdbcOdbcDriver.

     sun.jdbc.odbc.JdbcOdbcDriver.

ß Loại  2:         có  tên  gọi  là Native API  Driver.  Trình

ß Loại  2:         có  tên  gọi  là Native API  Driver.  Trình

     điều    khiển     loại   này    sẽ chuyển        các    lời  gọi    của

     điều    khiển     loại   này    sẽ chuyển        các    lời  gọi    của

     JDBC  API         sang  th      viện  hàm  (API)  t         ơng  ứng

     JDBC  API         sang  th       viện  hàm  (API)  t        ơng  ứng

     với  từng  hệ CSDL  cụ thể.  Trình  điều  khiện  loại

     với  từng  hệ CSDL  cụ thể.  Trình  điều  khiện  loại

     này  th    ờng  chỉ do  nhà  xây  dựng  hệ CSDL  cung

     này  th    ờng  chỉ do  nhà  xây  dựng  hệ CSDL  cung

     cấp. Để có  thề thi hành  ch              ơng trình mã lệnh để

     cấp. Để có  thề thi hành  ch              ơng trình mã lệnh để

     làm việc với hệ CSDL cụ thể cần phải đ ợc cung

     làm việc với hệ CSDL cụ thể cần phải đ ợc cung

     cấp đi kèm với ch          ơng trình.

     cấp đi kèm với ch          ơng trình.

ß Loại  3:          có  tên  gọi  là  JDBC-Net  Driver.  Trình

ß Loại  3:          có  tên  gọi  là  JDBC-Net  Driver.  Trình

     điều  khiển  loại  này  sẽ chuyển  các  lời  gọi  JDBC

     điều  khiển  loại  này  sẽ chuyển  các  lời  gọi  JDBC

     API     sang    một     dạng     chuẩn     độc    lập   với    các   hệ

     API     sang    một     dạng     chuẩn     độc    lập   với    các   hệ

     CSDL,  và  sau  đ ợc  chuyển  sang  lời  gọi  của  hệ

     CSDL,  và  sau  đ ợc  chuyển  sang  lời  gọi  của  hệ

     CSDL cụ thể bỡi 1 ch              ơng trình trung gian. Trình

     CSDL cụ thể bỡi 1 ch              ơng trình trung gian. Trình

     điều    khiển  của  các  nhà  cung  ứng  thứ 3  th                 ờng

     điều    khiển  của  các  nhà  cung  ứng  thứ 3  th                 ờng

     thuộc  loại  này.  Lợi  thế của  trình  điều  khiển  loại

     thuộc  loại  này.  Lợi  thế của  trình  điều  khiển  loại

                             161

----------------------- Page 162-----------------------

                 này  là không  cần  cung  cấp  mã  lệnh  kèm theo và

                 này  là không  cần  cung  cấp  mã  lệnh  kèm theo và

                 có thể sử dụng cùng một  trình điều khiển để truy

                 có thể sử dụng cùng một  trình điều khiển để truy

                 cập đến nhiều hệCSDL khác nhau.

                 cập đến nhiều hệCSDL khác nhau.

            ß Loại  4:       có   tên  gọi  là  Native  Protocol  Driver.

             ß Loại  4:      có   tên  gọi  là  Native  Protocol  Driver.

                 Trình   điều   khiển    loại  này   chuyển    các   lời  gọi

                 Trình   điều   khiển    loại  này   chuyển    các   lời  gọi

                 JDBC API sang mã lệnh của hệ CSDL cụ thể. Đây

                 JDBC API sang mã lệnh của hệ CSDL cụ thể. Đây

                 là  các  trình  điều   khiển   thần   Java,   có   nghĩa   là

                 là  các  trình   điều  khiển   thần   Java,   có   nghĩa   là

                 không  cần  phải  có  mã  lệnh  của hệ CSDL  cụ thể

                 không  cần  phải  có  mã  lệnh  của hệ CSDL  cụ thể

                 khi thi hành ch    ơng trình.

                 khi thi hành ch    ơng trình.

 6.3.2.JDBC URL

 6.3.2.JDBC URL

 Để có  thể kết  nối với CSDL, chúng ta cần xác định nguồn dữ

 Để có  thể kết  nối với CSDL, chúng ta cần xác định nguồn dữ

 liệu cùng với các thông số liên quan d         ới dạng  1 URL nh        sau:

 liệu cùng với các thông số liên quan d          ới dạng  1 URL nh       sau:

j dbc:<subp rotocol>:<dsn>:<others>

j dbc:<subp rotocol>:<dsn>:<others>

 Trong đó:

 Trong đó:

            ß <subp rotocol>:        đ ợc dùng để xác định trình điều

             ß <subp rotocol>:        đ ợc dùng để xác định trình điều

                 khiển đểkết nối với CSDL.

                 khiển đểkết nối với CSDL.

            ß <dsn>:        địa  chỉ CSDL.  Cú  pháp  của  <dsn> phụ

             ß <dsn>:       địa  chỉ CSDL.  Cú  pháp  của  <dsn> phụ

                 thuộc vào từng  trình điều khiển cụthể.

                 thuộc vào từng  trình điều khiển cụthể.

            ß <other>: các tham sốkhác

             ß <other>: các tham sốkhác

 Ví dụ:

 Ví dụ:

                                     162

----------------------- Page 163-----------------------

            ß jdbc:odbc:dbname  là  URL  để kết  nối  với  CSDL

            ß jdbc:odbc:dbname  là  URL  để kết  nối  với  CSDL

                tên dbname sử dụng cầu nối  ODBC.

                tên dbname sử dụng cầu nối  ODBC.

            ß jdbc:microsoft:sqlserver://hostname:1433              là  URL

            ß jdbc:microsoft:sqlserver://hostname:1433              là  URL

                để kết     nối  với   CSDL      Microsoft     SQL    Server.

                để kết     nối   với  CSDL      Microsoft     SQL    Server.

                Trong đó hostname là tên máy cài SQL Server.

                 Trong đó hostname là tên máy cài SQL Server.

6.4.KẾT NỐI CSDL VỚI JDBC

6.4.KẾT NỐI CSDL VỚI JDBC

Việc  kết   nối  với  CSDL  bằng  JDBC  đ ợc  thực  hiện  qua  hai

Việc  kết   nối  với  CSDL  bằng  JDBC  đ ợc  thực  hiện  qua  hai

b  ớc:    đăng    ký   trình  điều   khiển   JDBC;  tiếp     theo   thực   thi

b  ớc:    đăng    ký   trình  điều   khiển   JDBC;  tiếp     theo   thực   thi

ph   ơng thức getConnection() của lớp DriverManager.

ph   ơng thức getConnection() của lớp DriverManager.

6.4.1.Đăng ký trình điều khiển

6.4.1.Đăng ký trình điều khiển

Trình điều khiển JDBC đ ợc nạp khi mã bytecode của nó đ ợc

Trình điều khiển JDBC đ ợc nạp khi mã bytecode của nó đ ợc

nạp vào JVM. Một cách đơn giản đểthực hiện công việc này là

nạp vào JVM. Một cách đơn giản đểthực hiện công việc này là

thực thi ph    ơng thức Class.forName(“<JDBC Driver>”).

thực thi ph    ơng thức Class.forName(“<JDBC Driver>”).

Ví dụ:    để nạp trình điều khiển sử dụng cầu nối ODBC do Sun

Ví dụ:    để nạp trình điều khiển sử dụng cầu nối ODBC do Sun

cung      cấp,      chúng      ta     sử     dụng       câu     lệnh      sau

cung      cấp,      chúng       ta    sử      dụng      câu      lệnh     sau

Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”).

Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”).

6.4.2.Thực hiện kết nối

6.4.2.Thực hiện kết nối

Sau  khi đã nạp  trình điều  khiển JDBC, việc kết  nối với CSDL

Sau  khi đã nạp  trình điều  khiển JDBC, việc kết  nối với CSDL

đ ợc  thực  hiện  với một  trong  các  ph        ơng  thức  sau  trong  lớp

đ ợc  thực  hiện  với một  trong  các  ph        ơng  thức  sau  trong  lớp

DriverManager:

DriverManager:

            ß public static Connection getConnection(String url)

            ß public static Connection getConnection(String url)

                throws     SQLException:        thực   hiện   kết   nối   với

                throws     SQLException:        thực   hiện   kết   nối   với

                CSDL đ ợc yêu  cầu. Bộ quản lý trình điều khiển

                 CSDL đ ợc yêu  cầu. Bộ quản lý trình điều khiển

                sẽtự động lựa chọn trình điều khiển phù hợp trong

                 sẽtự động lựa chọn trình điều khiển phù hợp trong

                số các trình điều khiển đã đ ợc nạp.

                 số các trình điều khiển đã đ ợc nạp.

            ß public static Connection getConnection(String url,

            ß public static Connection getConnection(String url,

                String   user,   String  pass)   throws    SQLException:

                 String  user,   String  pass)   throws    SQLException:

                tiến hành kết  nối tới CSDL với tài khoản user và

                tiến hành kết  nối tới CSDL với tài khoản user và

                mật mã pass.

                mật mã pass.

            ß public static Connection getConnection(String url,

            ß public static Connection getConnection(String url,

                Properties info) throws  SQLException:             t  ơng tự

                Properties info) throws  SQLException:             t  ơng tự

                hai ph    ơng thức trên ngoài ra cung cấp thêm các

                hai ph    ơng thức trên ngoài ra cung cấp thêm các

                                     163

----------------------- Page 164-----------------------

                thông tin qui định thuộc tính kết nối thông qua đối

                thông tin qui định thuộc tính kết nối thông qua đối

                t  ợng của lớp Properties.

                t  ợng của lớp Properties.

Kết  quả trả về của các ph        ơng thức trên là một đối t        ợng của

Kết  quả trả về của các ph        ơng thức trên là một đối t        ợng của

lớp java.sql.Connection đ ợc dùng để đại diện cho kết  nối đến

lớp java.sql.Connection đ ợc dùng để đại diện cho kết  nối đến

CSDL.

CSDL.

6.4.3.Ví dụ

6.4.3.Ví dụ

Trong phần ví dụ này chúng ta sẽ tìm hiếu các cách khác nhau

Trong phần ví dụ này chúng ta sẽ tìm hiếu các cách khác nhau

đểkết nối với tập tin CSDl Access movies.mdb có một bảng tên

đểkết nối với tập tin CSDl Access movies.mdb có một bảng tên

Movies. Bảng này gồm các cột number, title, category và fomat.

Movies. Bảng này gồm các cột number, title, category và fomat.

Để có thểtiến hành kết nối với Microsoft Access thông qua cầu

Để có thểtiến hành kết nối với Microsoft Access thông qua cầu

nối ODBC  sau  khi đã tạo tập tin CSDL movies.mdb, chúng ta

nối ODBC  sau  khi đã tạo tập tin CSDL movies.mdb, chúng ta

cần   phải  tạo   Data   Source  Name       cho   CSDL  bằng      cách   vào

cần   phải  tạo   Data   Source  Name       cho   CSDL  bằng       cách  vào

Control Panel và chọn ODBC Data Source.

Control Panel và chọn ODBC Data Source.

                                     164

----------------------- Page 165-----------------------

Tiếp theo nhấn vào nút Add, bạn sẽ thấy hiển thị danh sách các

Tiếp theo nhấn vào nút Add, bạn sẽ thấy hiển thị danh sách các

trình điều khiển CSDL hiện có.

trình điều khiển CSDL hiện có.

                                      165

----------------------- Page 166-----------------------

Bạn chọn Microsoft Access Driver(*.mdb) và nhấn Finish. Cửa

Bạn chọn Microsoft Access Driver(*.mdb) và nhấn Finish. Cửa

sổ cấu hình cho tập tin Access sẽxuất hiện và nhập moviesDSN

sổ cấu hình cho tập tin Access sẽxuất hiện và nhập moviesDSN

vào ô Data Source Name

vào ô Data Source Name

Bạn nhấn nút  Select và chọn tập tin CSDL cần tạo data source

Bạn nhấn nút  Select và chọn tập tin CSDL cần tạo data source

name. Sau đó nhấn OK đểkết thúc.

name. Sau đó nhấn OK đểkết thúc.

                                     166

----------------------- Page 167-----------------------

 Sau khi đã hoàn tất công việc tạo DSN cho tập tin movies.mdb,

 Sau khi đã hoàn tất công việc tạo DSN cho tập tin movies.mdb,

chúng ta có thể sử dụng đoạn mã sau  để tiến hành kết  nối với

 chúng ta có thể sử dụng đoạn mã sau  để tiến hành kết  nối với

tập tin movies.mdb.

tập tin movies.mdb.

impo rtj ava.sql.Connection;

impo rtj ava.sql.DriverManager;

impo rtj ava.sql.SQLExcep tion;

pub lic class TestConnection{

    pub lic static void main(String args[])  {

        Connection connection = null;

        if ( args.length != 1)  {

           System.out.p rintln("Syntax: j ava        TestConnection      "   +

                                              "DSN ");

           return;

       }

        try  { // load driver

           Class.f orName("sun.j dbc.odbc.JdbcOdbcDriver ");

           System.out.p rintln("Loading the driver...");

       }

        catch(  Excep tion    e  )  {  //p roblem   load  driver,class    not

exist

           e.p rintStackTrace();

           return;

       }

        try  {

           String dbURL  = "j dbc:odbc:" + args[0] ;

           System.out.p rintln("Establishing connection...");

           connection =

                  DriverManager.getConnection(dbURL, "", "");

           System.out.p rintln("Connect to  ” +

                  connection.getCatalog()  + “successf ully !");

           // Do whatever queries or updates you want here!!!

       }

        catch( SQLExcep tion e)  {

           e.p rintStackTrace();

       }

                                     167

----------------------- Page 168-----------------------

       f inally  {

           if ( connection != null)  {

               try  { connection.close(); }

               catch( SQLExcep tion e)  {

                  e.p rintStackTrace();

              }

           }

       }

    }

}

 Sau khi biên dịch đoạn ch        ơng trình trên, chúng ta có thể thực

 Sau khi biên dịch đoạn ch        ơng trình trên, chúng ta có thể thực

 hiện kết nối với CSDL bằng cách thực thi câu lệnh:

 hiện kết nối với CSDL bằng cách thực thi câu lệnh:

j ava TestConnection moviesDSN

j ava TestConnection moviesDSN

 6.5.KIỂU DỮLIỆU SQL VÀ KIỂU DỮLIỆU JAVA

 6.5.KIỂU DỮLIỆU SQL VÀ KIỂU DỮLIỆU JAVA

 Trong quá trình thao tác với CSDL, chúng ta sẽgặp phải vấn đề

 Trong quá trình thao tác với CSDL, chúng ta sẽgặp phải vấn đề

 chuyển đổi giữa kiểu dữ liệu trong CSDL sang kiểu dữ liệu Java

 chuyển đổi giữa kiểu dữ liệu trong CSDL sang kiểu dữ liệu Java

 hỗ trợ và ng     ợc  lai. Việc  chuyển  đổi này đ ợc thực hiện  nh

 hỗ trợ và ng     ợc  lai. Việc  chuyển  đổi này đ ợc thực hiện  nh

 trong 2 bảng sau.

 trong 2 bảng sau.

                 SQL Type                           Java Type

     BIT                                  Boolean

     TINYINT                              Byte

     SMALLINT                              Short

     INTEGER                              Int

     BIGINT                               Long

     REAL                                 Float

     FLOAT                                Double

     DOUBLE                               Double

                                     168

----------------------- Page 169-----------------------

DECIMAL                                      java.math.BigDecimal

NUMERIC                                      java.math.BigDecimal

CHAR                                         java.lang.String

VARCHAR                                      java.lang.String

LONGVARCHAR                                  java.lang.String

DATE                                         java.sql.Date

TIME                                         java.sql.Time

TIMESTAMP                                    java.sql.Timestamp

BINARY                                        byte[ ]

VARBINARY                                     byte[ ]

LONGVARBINARY                                 byte[ ]

BLOB                                         java.sql.Blob

CLOB                                          Java.sql.Clob

ARRAY                                         Java.sql.Array

REF                                           Java.sql.Ref

STR UCT                                       Java.sql.Struct

     Bảng chuyển đổi từkiểu dữliệu SQL sang Java

              Java Type                                  SQL Type

boolean                                     BIT

byte                                        TINYINT

short                                       SMALLINT

int                                         INTEGER

long                                        BIGINT

float                                       REAL

double                                      DOUBLE

java.math.BigDecimal                        NUMERIC

java.lang.String                            VARCHAR or

                                            LONGVARCHAR

byte[ ]                                     VARBINARY or

                                            LONGVARBINARY

java.sql.Date                               DATE

java.sql.Time                               TIME

java.sql.Timestamp                          TIMESTAMP

java.sql.Blob                               BLOB

java.sql.Clob                               CLOB

java.sql.Array                              ARRAY

java.sql.Ref                                REF

                                       169

----------------------- Page 170-----------------------

     java.sql.Struct                     STRUCT

        Bảng chuyển đổi từkiểu dữ liệu Java sang SQL

6.6.CÁC THAO TÁC CƠBẢN TRÊN CSDL

6.6.CÁC THAO TÁC CƠBẢN TRÊN CSDL

Các thao tác truy vấn CSDL chỉ có thể đ ợc thực hiện sau khi

Các thao tác truy vấn CSDL chỉ có thể đ ợc thực hiện sau khi

đã có đối t    ợng Connection, đ ợc tạo ra từ quá trình kết nối vào

đã có đối t    ợng Connection, đ ợc tạo ra từ quá trình kết nối vào

CSDL. Chúng ta sử dụng đối t            ợng của lớp Connection để tạo

CSDL. Chúng ta sử dụng đối t            ợng của lớp Connection để tạo

ra các thểhiện của lớp java.sql.Statement. Sau khi tạo ra các đối

ra các thểhiện của lớp java.sql.Statement. Sau khi tạo ra các đối

t  ợng của lớp  Statement chúng ta có thể thực hiện các thao tác

t  ợng của lớp  Statement chúng ta có thể thực hiện các thao tác

trong các đối t    ợng statement trên connection t         ơng ứng.

trong các đối t     ợng statement trên connection t        ơng ứng.

Nội dung trong một  statement  chính là các câu  SQL. Câu lệnh

Nội dung trong một  statement  chính là các câu  SQL. Câu lệnh

SQL  trong  các  statement  chỉ đ ợc thực hiện  khi chúng  ta gửi

 SQL  trong  các  statement  chỉ đ ợc thực hiện  khi chúng  ta gửi

chúng  đến  CSDL. Nếu  câu  lện  SQL  là  một  câu  truy  vấn  nội

chúng  đến  CSDL. Nếu  câu  lện  SQL  là  một  câu  truy  vấn  nội

dung     thì  kết   quả trả về sẽ là           một    thể hiện     của    lớp

dung     thì  kết   quả trả về sẽ là           một    thể hiện      của   lớp

java.sql.ResultSet,  ng     ợc  lại  (các  câu  lệnh  thay  đổi  nội  dung

java.sql.ResultSet,  ng     ợc  lại  (các  câu  lệnh  thay  đổi  nội  dung

CSDL)  sẽ trả về kết  quả là mộ số nguyên. Các đối t                ợng của

CSDL)  sẽ trả về kết  quả là mộ số nguyên. Các đối t                ợng của

lớp ResultSet cho phép chúng ta truy cập đến kết quảtrảvề của

lớp ResultSet cho phép chúng ta truy cập đến kết quảtrảvề của

các câu truy vấn.

các câu truy vấn.

6.6.1.Các lớp cơbản

6.6.1.Các lớp cơbản

     ß java.sql.Statement

         Statement  là một trong 3 lớp JDBC cơ bản dùng để thể

         hiện  một  câu   lệnh  SQL.  Mọi thao tác trên CSDL được

         thực hiện thông qua 3 phương thức của lớp Statement.

         Phương     thức   executeQuery()      nhận    vào   1  tham   số là

         chuỗi nội dung câu lện  SQL và trả về 1 đối tượng kiểu

         ResultSet.  Phương  thức  này  được   sử  dụng  trong            các

         trường   hợp  câu   lệnh  SQL  có  trả  về các  kết  quả trong

         CSDL.

         Phương thức executeUpdate() cũng nhận vào  1 tham số

         là chuỗi nội dung câu lệnh SQL. Tuy nhiện phương thức

         này chỉ sử dụng được đối với các cây lệnh cập nhật nội

         dung  CSDL.  Kết  quả trả về là số dòng bị tác động bỡi

         câu lệnh SQL.

                                     170

----------------------- Page 171-----------------------

         Phương  thức  execute()  là  trường   hợp   tổng  quát   của  2

         phương thức trên. Phương thức nhận vào chuỗi nội dung

         câu lệnh SQL. Câu lệnh SQL có thể là câu lệnh truy vấn

         hoặc   cập  nhật.   Nếu   kết  quả  của  câu   lệnh  là  các  dòng

         trong CSDL thì phương thức trả vềgiá trịtrue, ngược lại

         trả về giá trị false.   Trong trường hợp giá trịtrue, sau đó

         chúng ta có thể dùng phương thức getResultSet() để lấy

         các dòng kết quảtrả về.

     ß java.sql.ResultSet

         Đối  tượng  resultset  là  các  dòng  dữ liệu  trả  về  của câu

         lệnh truy vấn CSDL. Lớp này cung cấp các phương thức

         để rút trích các cột trong từng dòng kết  quả trả về. Tất

         cảcác phương thức này đều có dạng:

                            type getType(int | String)

         Trong đó tham số có thểlà sốthứ tự của cột hoặc tên cột

         cần lấy nội dung.

         Tại 1 thời điểm chúng ta chỉcó thểthao tác trên  1 dòng

         của resultset. Đểthao tác trên dòng tiếp theo chúng ta sử

         dụng phương thức next(). Phương thức trả vềgiá trịtrue

         trong trường hợp có dòng tiếp theo, ngược lại trả về giá

         trịfalse.

6.6.2.Ví dụtruy vấn CSDL

 6.6.2.Ví dụtruy vấn CSDL

pub lic class Movie{

    p rivate String movieTitle, category, mediaFormat;

    p rivate int number;

    pub lic Movie(int n, String title, String cat, Stringf ormat) {

       number = n;

       movieTitle = title;

        category  = cat;

       mediaFormat =f ormat;

    }

                                     171

----------------------- Page 172-----------------------

    pub lic int getNumber() {return number;}

    pub lic String getMovieTitle() {return movieTitle;}

    pub lic String getCategory () {return category;}

    pub lic void setCategory (String c) {category  = c;}

    pub lic String getFormat() {return mediaFormat;}

    pub lic void setFormat(Stringf) {mediaFormat =f ;}

    pub lic String toString() {

       return number + ": " + movieTitle + " -  " + category  + "

 "                                                     + mediaFormat;

    }

}

impo rtj ava.sql.*;

pub lic class MovieDatabase{

    p rivate Connection connection;

    p rivate Prepa redStatementf indByNumber, updateCategory;

    p rivate CallableStatementf indBy Category;

    pub lic MovieDatabase(Connection connection)  throws

                                                      SQLExcep tion{

        this.connection = connection;

    }

    pub lic void showAllMovies() {

        try {

           Statement selectAll = connection.createStatement();

           String sql = "SELECT *FROM Movies ";

                                     172

----------------------- Page 173-----------------------

           ResultSet results =      selectAll.executeQuery (sql);

           while(results.next()) {

               int number = results.getInt(1);

               String title = results.getString("title");

               String category  = results.getString(3);

               Stringf ormat = results.getString(4);

              Movie movie  = new Movie(number,  title,  category,

                                                               f ormat);

               System.out.p rintln(movie.toString());

           }

           results.close();

           selectAll.close();

       }

        catch(SQLExcep tion e) {

           e.p rintStackTrace();

       }

    }

}

impo rtj ava.sql.*;

pub lic class ShowMovies{

    pub lic static void main(String [] args) {

       String url = "j dbc:odbc:" + args[0] ;

        try {

           Class.f orName("sun.j dbc.odbc.JdbcOdbcDriver");

           Connection connection =

                           DriverManager.getConnection(url);

           MovieDatabase                   db              =             new

MovieDatabase(connection);

           db.showAllMovies();

           connection.close();

       }

        catch(Excep tion e) {

                                     173

----------------------- Page 174-----------------------

           e.p rintStackTrace();

       }

    }

}

6.6.3.Ví dụcập nhật CSDL

 6.6.3.Ví dụcập nhật CSDL

Ph   ơng    thức    addMovie()      bên    d  ới   đ ợc    thêm    vào    lớp

 Ph  ơng    thức    addMovie()      bên    d  ới   đ ợc    thêm     vào   lớp

MovieDatabase đã định nghĩa ởví dụtrên.

 MovieDatabase đã định nghĩa ởví dụtrên.

pub lic class MovieDatabase{

          …

    pub lic void addMovie(Movie movie) {

       System.out.p rintln(“Adding movie:  “ + movie.toString());

        try {

           Statement addMovie = connection.createStatement();

           String sql = “INSERT INTO Movies  VAL UES(“

                            + movie.getNumber()  + “,  “

                            + “‘“ + movie.getMovieTitle()  + “‘,  “

                            + “‘“ + movie.getCategory ()  + “‘,  “

                            + “‘“ + movie.getFormat()  + “‘)”;

           System.out.p rintln(“Executing statement:  “ + sql);

           addMovie.executeUpda te(sql);

           addMovie.close();

           System.out.p rintln(“Movie added successf ully !”);

       }

        catch(SQLExcep tion e) {

           e.p rintStackTrace();

       }

    }

}

impo rtj ava.sql.*;

pub lic class AddMovies{

    pub lic static void main(String [] args) {

       String url = “j dbc:odbc: ” + args[0] ;

                                     174

----------------------- Page 175-----------------------

       System.out.p rintln(“Attemp ting to connect to  “ + url);

       try {

           System.out.p rintln(“Loading the driver... ”);

           Class.f orName(“sun.j dbc.odbc.JdbcOdbcDriver ”);

           System.out.p rintln(“Establishing a connection... ”);

           Connection connection =

                           DriverManager.getConnection(url);

           System.out.p rintln(“Connect to  “

                   + connection.getCatalog()  + “a success!”);

           MovieDatabase                   db              =             new

MovieDatabase(connection);

           Movie [] movies = new Movie[6] ;

           movies[0]  = new Movie(1,  “Star Wars: A New Hope ”,

                                     “Science Fiction ”,  “D VD ”);

           movies[1]  = new Movie(2,  “Citizen Kane ”,  “Drama ”,

                                     “VHS ”);

           movies[2]  = new Movie(3,  “The Jungle Book ”,

                                     “Children ”,  “VHS ”);

           movies[3]  = new Movie(4,  “Dumb and Dumber ”,

                            “Comedy ”,  “D VD ”);

           movies[4]  = new Movie(5,  “Star Wars: Attack of  the

                            Clones ”,  “Science Fiction ”,  “D VD ”);

           movies[5]  = new Movie(6,  “Toy Story ”,  “Children ”,

                            “D VD ”);

          f or(int i = 0; i < movies.length; i++) {

               db.addMovie(movies[i]);

           }

           System.out.p rintln(“Closing the connection... ”);

           connection.close();

       }

       catch(Excep tion e) {

           e.p rintStackTrace();

       }

    }

}

                                     175

----------------------- Page 176-----------------------

                        Tài liệu tham khảo:

                         Tài liệu tham khảo:

[1] java.sun.com

[2]  Herbert     Schildt.  Java    2.  A   Beginner’s      Guide.    Second

Edition. McGraw-Hill - 2003.

[3]  Dr.   Harvey     M.   Deitel   -  Paul   J.  Deitel.   Java    How    to

Program, 4th Ed (Deitel). Prentice Hall -           2002

[4]  Simon Roberts –  Philip  Heller – Michael Ernest. Complete

Java 2 Certification – study guide. BPB Publications – 2000.

[5]  Cay  S. Horstmann –  Gary  Cornell.  Core Java  Volum  1 -

Fundamentals. The Sun Microsystems press. 1997

[6]  Cay  S. Horstmann –  Gary Cornell. Core Java  Volum 2 –

Advanced Features. The Sun Microsystems press. 1997

                                     176

----------------------- Page 177-----------------------

              Phụlục A: Trắc nghiệm kiến thức

              Phụlục A: Trắc nghiệm kiến thức

1.   Chọn phát biểu đúng

a.   InputStream và OuputStream là           2 luồng dữ liệu kiểu byte

b.   Reader và Writer là 2 luồng dữ liệu kiểu character.

c.   Câu a) và b) đúng

d.    Tất cảcác câu trên đều sai

2.   Cho biết sốbyte mà đoạn chương trình sau ghi ra tập tin

temp.txt

a.   2 bytes

b.   4 bytes

c.   8 bytes

d.   16 bytes

3.   Chọn phát biểu đúng

a.    Một thểhiện của lớp File có thểđược dùng đểtruy cập các

tập tin trong th     mục hiện hành

b.   Khi một thểhiện của lớp File được tạo ra thì một tập tin

tương ứng cũng được tạo ra trên đĩa.

c.   Các thểhiện của lớp File được dùng đểtruy cập đến các tập

tin và th    mục trên đĩa

d.   Câu a) và c) đúng

                                      177

----------------------- Page 178-----------------------

4.   Cho biết cách tạo một thểhiện của InputStreamReader từ

một thểhiện của InputStream.

a.    Sử dụng phương thức createReader() của lớp InputStream

b.    Sử dụng phương thức createReader() của lớp

InputStreamReader

c.    Tạo một thểhiện của InputStream rồi truyền vào cho hàm

khởi tạo của InputStreamReader

d.    Tất cảcác câu trên đều sai

5.   Chọn phát biểu đúng

a.    Lớp Writer có thểđược dùng đểghi các ký tự có cách mã

hóa khác nhau ra luồng xuất

b.    Lớp Writer có thểđược dùng đểghi các ký tựUnicode ra

luồng xuất

c.    Lớp Writer có thểđược dùng đểghi giá trịcác kiểu dữ liệu

cơ sởra luồng xuất

d.   Câu a) và b) đúng

6.   Chọn phát biểu đúng:

a.   Các event listeners là các interface qui định các phương

thức cần phải cài đặt để xử lý các sựkiên liên quan khi sựkiện

đó xảy ra.

b.    Một event adapter là một cung cấp các cài đặt mặc định cho

các event listener tương ứng

c.    Lớp WindowAdapter được dùng để xử lý các sựkiện liên

quan đến cửa sổmàn hình.

d.    Tất cảcác câu trên đều đúng

7.   Khi có nhiều component được gắn các bộ lắng nghe của

cùng một loại sựkiện thì component nào sẽnhận được sựkiện

đầu tiên?

a.   Component đầu tiên được gắn bộ lắng nghe sựkiện

b.   Component cuối cùng được gắn bộ lắng nghe sựkiện

c.   Không thểxác định component nào sẽnhận trước

                                      178

----------------------- Page 179-----------------------

d.   Không thểcó nhiều hơn một bộ lắng nghe cho cùng một

loại sựkiện

8.   Chọn các component có phát sinh action event

a.   Button

b.   Label

c.   Checkbox

d.   Windows

9.   Chọn phát biểu đúng

a.   Thểhiện của TextField có thểphát sinh ActionEvent

b.   Thểhiện của TextArea có thểphát sinh ActionEvent

c.   Thểhiện của button có thểphát sinh ActionEvent

d.   Câu a) và c) đúng

10. Chọn phát biểu đúng

a.   MouseListener interface định nghĩa các phương thức để xử

lý sựkiện nhấn chuột.

b.   MouseMotionListener interface định nghĩa các phương thức

để xử lý sựkiện nhấn chuột.

c.   MouseClickListener interface định nghĩa các phương thức

để xử lý sựkiện nhấn chuột.

d.    Tất cảcác câu trên đều đúng

11. Giả sữ chúng ta có thểhiện e của bộ lắng nghe sựkiện

TextEvent và thểhiện t của lớp TextArea. Cho biết cách để gắn

bộ lắng nghe e vào t?

a.   t.addTextListener(e)

b.   e.addTextListener(t)

c.   addTextListener(e,t)

d.   addTextListener(t,e)

12. Màn hình sau sử dụng kiểu trình bày nào?

                                      179

----------------------- Page 180-----------------------

a.   CardLayout

b.   nullLayout

c.   BorderLayout

d.   SetLayout

13. Màn hình sau sử dụng kiểu trình bày nào?

a.   GridLayout

b.   FlowLayout

c.   BorderLayout

d.   GridBagLayout

14. Cho một component comp và một container cont có kiểu

trình bày là BorderLayout. Cho biết cách để gắn comp vào vịtrí

đầu của cont.

a.   addTop(cont,comp)

b.   comp.add(“North”, cont)

c.   cont.addTop(comp)

d.   cont.add(comp,BorderLayout.NORTH)

15. Cho   một  component  comp  và   một  container  cont  có  kiểu

trình bày là FlowLayout. Cho biết cách để gắn comp vào cont.

                                     180

----------------------- Page 181-----------------------

a.   cont.add(comp)

b.   comp.add(cont)

c.   cont.addComponent(comp)

d.   cont.addAllComponents()

16. Chọn phương thức dùng đểxác định cách trình bày của một

khung chứa

a.   startLayout()

b.   initLayout()

c.   layoutContainer()

d.   setLayout()

17. Chọn phương thức dùng đểxác định vịtrí và kích thước của

các component

a.   setBounds()

b.   setSizeAndPosition()

c.   setComponentSize()

d.   setComponent()

18. Chọn kiểu trình bày đểđặt          các component trên khung chứa

dưới dạng bảng.

a.   CardLayout

b.   BorderLayout

c.   GridLayout

d.   FlowLayout

19. Chọn phương thức dùng đểgán nội dung cho Label

a.   setText()

b.   setLabel()

c.   setTextLabel()

d.   setLabelText()

20. Chọn phát biểu đúng

a.   TextComponent extends TextArea

b.   TextArea extends TextField

                                      181

----------------------- Page 182-----------------------

c.   TextField extends TextComponent

d.   TextComponent extends TextField

21. Chọn phát biểu đúng

a.    Lớp CheckboxGroup dùng đểđịnh nghĩa cá RadioButtons

b.    Lớp RadioGroup dùng đểđịnh nghĩa cá RadioButtons

c.    Tất cảcác câu trên đều đúng

d.    Tất cảcác câu trên đều sai

22. Chọn câu lệnh để tạo ra TextArea có 10 dòng và 20 cột

a.   new TexArea(10,20)

b.   new TexArea(20,10)

c.   new TexArea(200)

d.    Tất cảcác câu trên đều sai

23. Chọn câu lệnh để tạo ra một danh sách gồm 5 mục chọn và

cho phép thực hiện chọn nhiều mục cùng lúc

a.   new List(5, true)

b.   new List(true, 5)

c.   new List(5, false)

d.   new List(false, 5)

24. Chọn phương thức đểhiện thịFrame lên màn hình

a.   setVisible()

b.   display()

c.   displayFrame()

d.    Tất cảcác câu trên đều sai

25. Chọn phát biểu đúng

a.    Lớp Class là lớp cha của lớp Object

b.    Lớp Object là một lớp final

c.    Mọi lớp đề kếthừa trực tiếp hoặc gián tiếp từ lớp Object

d.    Tất cảcác câu trên đều sai

                                      182

----------------------- Page 183-----------------------

26. Lớp nào sau đây dùng đểthực hiện các thao tác nhập xuất

cơ bản với console

a.   System

b.   Math

c.   String

d.   StringBuffer

27. Lớp nào sau đây không phải là lớp bao?

a.   String

b.   Integer

c.   Boolean

d.   Character

28. Đoạn mã sau sai chổnào?

a.   Đoạn mã không có lỗi

b.   Điều kiện của câu lệnh if phải có kiểu boolean thay vì

Boolean

c.   Chỉ số của câu lệnh for là int thay vì Integer

d.   Câu b) và c) đú

29. Phương thức nào sau đây sẽlàm cho giá trịbiến s bịthay

đổi

a.   s.concat()

                                       183

----------------------- Page 184-----------------------

b.   s.toUpperCase()

c.   s.replace()

d.   Câu a) và b) đúng

30. Hãy cho biết kết xuất của đoạn chương trình sau:

a.   S1

b.   S2

c.   S1S2

d.   S2S1

31. Chọn phát biểu đúng cho hàm khởi tạo

a.    Một lớp sẽ kết     thừa các hàm khởi tạo từ lớp cha

b.   Trình biên dịch sẽ tự động tạo hàm khởi tạo mặc định nếu

lớp không định nghĩa hàm khởi tạo

c.    Tất cảcác hàm khởi tạo có kiểu trả vềlà void

d.    Tất cảcác câu trên đều sai

32. Cho biết kết xuất của đoạn chương trình sau:

                                       184

----------------------- Page 185-----------------------

a.   S1

b.   S2

c.   null

d.   S1S2

33. Một kiểu dữ liệu số có dấu có 2 giá trị+0 và -0 bằng nhau:

a.   Đúng

b.   Sai

c.   Chỉđúng với kiểu sốnguyên

d.   Chỉđúng với kiểu sốthực

34. Chọn khai báo tên đúng

a.   Big01LongStringWidthMeaninglessName

b.   $int

c.   bytes

d.    Tất cảcác câu trên đều đúng

                                      185

----------------------- Page 186-----------------------

35. Chọn khai báo đúng cho phương thức main()

a.   public static void main( )

b.   public void main(String[] arg)

c.   public static void main(String[] args)

d.   public static int main(String[] arg)

36. Chọn thứ tự đúng của các thành phần trong một tập tin

nguồn

a.   Câu lệnh import, khai báo package, khai báo lớp.

b.   Khai báo package đầu tiên; thứ tự của câu lệnh import và

khai báo lớp là tùy ý.

c.   Khai báo package, câu lệnh import, khai báo lớp

d.   Câu lệnh import trước tiên; thứ tự của khai báo package và

khai báo lớp là tùy ý.

37. Cho câu lệnh sau:

int[] x = new int[25];

Chọn kết quảđúng sau khi thi hành câu lệnh trên

a.   x[24] ch    a được định nghĩa

b.   x[25] có giá trị0

c.   x[0] =   có giá trịnull

d.   x.length = 25

38. Cho đoạn mã sau:

1 : class Q6{

2 :           pub lic static void main(String args[]) {

3 :                Holder h = new Holder();

4 :                h.held = 100;

5 :                h.bump (h);

6 :                System.out.p rintln(h.held);

7 :           }

8 : }

9 : class Holder{

10 :              pub lic int held;

11 :              pub lic void bump (Holder theHolder) {

                                      186

----------------------- Page 187-----------------------

12 :                            theHolder.held++;

13 :                 }

14 :            }

Giá trịin ra của câu lệnh ởdòng thứ 6 là:

a.   0

b.    1

c.    100

d.    101

39. Cho đoạn mã sau:

1 : class Q7{

2 :             pub lic static void main(String args[]) {

3 :                  double d = 12.3;

4 :                  Decrementer dec = new Decrementer();

5 :                  dec.decrement(d);

6 :                  System.out.p rintln(d);

7 :             }

8 : }

9 : class Decrementer{

10 :                 pub lic void decrement(double decMe) {

11 :                            decMe = decMe – 1.0;

12 :                 }

13 :            }

Giá trịin ra của câu lệnh ởdòng thứ 6 là:

a.   0.0

b.   -1.0

c.    12.3

d.    11.3

40. Miền giá trị của biến kiểu short là:

a.   Nó phụthuộc vào nền phần cứng bên dưới

b.    Từ 0 đến 216 –  1

c.    Từ -215 đến 215 –  1

d.    Từ -231  đến 231 –  1

                                            187

----------------------- Page 188-----------------------

41. Miền giá trị của biến kiểu byte là:

a.   Nó phụthuộc vào nền phần cứng bên dưới

b.    Từ 0 đến 28 –  1

c.    Từ -27  đến 27 –  1

d.    Từ -215 đến 215 –  1

42. Cho biết giá trị của x, a và b sau khi thi hành đoạn mã sau:

1 :  int x, a = 6, b = 7;

2 :  x = a++ + b++;

a.   x = 15, a = 7, b = 8

b.   x = 15, a = 6, b = 7

c.   x = 13, a = 7, b = 8

d.   x = 13, a = 6, b = 7

43. Biểu thức nào sau đây là hợp lệ

a.   int x = 6;x = !x;

b.   itn x = 6; if (!(x > 3))  {}

c.   int x = 6; x = ~x;

d.   Câu b) và c) đúng

44. Biểu thức nào sau đây cho x có giá trị dương:

a.   int x = -1; x = x >>> 5;

b.   int x = -1; x = x >>> 32;

c.   byte x   = -1; x = x >>> 5;

d.   int x = -1; x = x >> 5;

45. Biểu thức nào sau đây hợp lệ

a.   String x = “Hello”; int y = 9; x +=y;

b.   String x = “Hello”; int y = 9; x = x        + y;

c.   String x = null; int y = (x != null) && (x.length() > 0) ?

x.length() : 0;

d.    Tất cảcác câu trên đều đúng

46. Đoạn mã nào sau đây in ra màn hình chữ “Equal”:

a.

                                       188

----------------------- Page 189-----------------------

          int x  = 100;f loat y  = 100.0F;

          if (x  ==y)

          {

                    System.out.p rintln(“Equal ”);

          }

b.

          Integer x  = new Integer(100);

          Integer y  = new Integer(100);

          if (x  ==y)

          {

                    System.out.p rintln(“Equal ”);

          }

c.

          String x  = “100”; String y  = “100”;

          if (x  ==y)

          {

                    System.out.p rintln(“Equal ”);

          }

d.   Câu a. và c. đúng

47. Cho biết kết quảsau khi thi hành chương trình sau:

1 : pub lic class Short{

2 :           pub lic static void main(String[] args) {

3 :                 StringBuff er s = new StringBuff er(“Hello ”);

4 :                 if ((s.length()  > 5)  &&

5 :                      s.append(“there ”) .equals(“False ”)))

6 :                           ;//do nothing

7 :                 System.out.p rintln(“value is  ” + s);

8 :           }

9 : }

a.   Giá trịxuất là Hello

b.    Lỗi biên dịch tại dòng 4 và 5

c.   Không có giá trịxuất

d.   Thông báo NullPointerException

                                        189

----------------------- Page 190-----------------------

48. Cho biết kết quảsau khi thực hiện chương trình sau:

1 : pub lic class Xor{

2 :           pub lic static void main(String[] args) {

3 :                byte b = 10;//00001010

4 :                byte c = 15;//00001111

5 :                b = (byte) (b    ^ c);

6 :                System.out.p rintln(“b contains  ” + b);

7 :           }

8 : }

a.    Kết quảlà:  b contains 10

b.    Kết quảlà:  b contains 5

c.    Kết quảlà:  b contains 250

d.    Kết quảlà:  b contains 245

49. Cho biết kết quảsau khi biên dịch và thi hành chương trình

sau:

1 : pub lic class Conditional{

2 :           pub lic static void mai n(String[] args) {

3 :                int x  = 4;

4 :                System.out.p rintln(“value is  ” +

5 :                         ((x > 4 ? 99.99 : 9));

6 :           }

7 : }

a.    Kết quảlà:  value is 99.99

b.    Kết quảlà:  value is 9

c.    Kết quảlà:  value is 9.0

d.    Lỗi biên dịch tại dòng số 5

50. Cho biết kết quả của đoạn mã sau:

1 :  int x  = 3; int y  = 10;

2 : System.out.p rintln(y  % x);

a.   0

b.   1

c.   2

d.   3

                                      190

----------------------- Page 191-----------------------

51. Chọn câu khai báo không hợp lệ

a.   String s;

b.   abstract double d;

c.   abstract final double hyperbolCosine();

d.    Tất cảcác câu trên đều đúng

52. Chọn câu phát biểu đúng

a.    Một lớp trừu tượng không thểchứa phương thức final

b.    Một lớp final không thểchứa các phương thức trừu tượng

c.    Cảa) và b) đều đúng

d.    Cảa) và b) đều sai

53. Chọn cách sửa ít nhất đểđoạn mã sau biên dịch đúng

3 : f inal class Aaa

4 :  {

5 :           int xxx;

6 :           void yyy () {xxx  = 1;}

7 : }

8 :

9 :

10 :          class Bbb extends Aaa

11 :           {

12 :               f inal Aaaf inalRef     = new Aaa();

13 :

14 :               f inal void yyy ()

15 :               {

16 :                         System.out.p rintln(“In method yyy () ”);

17 :                        f inalRef .xxx  = 12345;

18 :               }

19 :          }

a.   Xóa từ final ởdòng 1

b.   Xoá từ final ởdòng 10

c.   Xóa từ final ởdòng 1 và 10

d.   Không cần phải chỉnh sửa gì

                                       191

----------------------- Page 192-----------------------

54. Chọn phát biểu đúng cho chương trình sau

1 : class StaticStuff

2 :  {

3 :           static int x  = 10;

4 :

5 :           static {x  += 5;}

6 :

7 :          pub lic static void main(String args[])

8 :           {

9 :               System.out.p ritln(“x  = ” + x);

10 :              }

11 :

12 :              static {x / = 5}

13 :         }

a.    Lỗi biên dịch tại dòng 5 và  12 bỡi vì thiếu tên phương thức

và kiểu trả về

b.   Chương trình chạy và cho kết quảx = 10

c.   Chương trình chạy và cho kết quảx = 15

d.   Chương trình chạy và cho kết quảx = 3

55. Chọn phát biểu đúng cho chương trình sau:

1 : class HasStatic

2 :  {

3 :          p rivate static int x  = 100;

4 :

5 :          pub lic static void main(String args[])

6 :           {

7 :               HasStatic hs1 = new HasStatic();

8 :               hs1.x++;

9 :               HasStatic hs2 = new HasStatic();

10 :                       hs2.x++;

11 :                       hs1 = new HasStatic();

12 :                       hs1.x++;

13 :                       HasStatic.x++;

14 :                       System.out.p rintln(“x  = “ + x);

                                     192

----------------------- Page 193-----------------------

15 :              }

16 :          }

a.   Chương trình chạy và cho kết quảx = 102

b.   Chương trình chạy và cho kết quảx = 103

c.   Chương trình chạy và cho kết quảx = 104

d.    Tất cảcác câu trên đều sai

56. Cho đoạn mã sau:

1 : class SuperDuper

2 :  {

3 :           void aMethod() {}

4 : }

5 :

6 : class Sub extends SuperDuper

7 :  {

8 :           void aMethod() {}

9 : }

     Hãy chọn từkhóa chỉphạm vi hợp lệđứng trước aMethod()

ởdòng 8

a.   default

b.   protected

c.   public

d.    Tất cảcác câu trên đều đúng

ÿ Đoạn mã sau dùng cho 2 câu hỏi tiếp theo

1 : pa ckage abcde;

2 :

3 : pub lic class Bird{

4 :           p rotected static int ref erneceCount = 0;

5 :           pub lic Bird() {ref erenceCount++;}

6 :           p rotected voidf ly () {…}

7 :           static int getRef Count() {return ref erenceCount;}

8 : }

57. Chọn phát biểu đúng cho lớp Bird trên và lớp Parrot sau:

                                      193

----------------------- Page 194-----------------------

1 : pa ckage abcde;

2 :

3 : class Parrot extends abcde.Bird{

4 :           pub lic voidf ly () {

5 :               //

6 :           }

7 :           pub lic int getRef Count() {

8 :                return ref erenceCount;

9 :           }

10 :          }

a.    Lỗi biên dịch ởdòng 4 tập tin Parrot.java vì phương thức

fly() là protected trong lớp cha và lớp Bird và Parrot nằm trong

cùng package

b.    Lỗi biên dịch ởdòng 4 tập tin Parrot.java vì phương thức

fly() là protected trong lớp cha và public trong lớp con.

c.    Lỗi biên dịch ởdòng 7 tập tin Parrot.java vì phương thức

getRefCount() là static trong lớp cha.

d.   Chương trình biên dịch thành công nh            ng sẽphát sinh

Exception khi chạy nếu phương thức fly() của lớp Parrot không

được gọi

58. Chọn phát biểu đúng cho lớp Bird trên và lớp Nightingale

sau:

1 : pa ckage singers;

2 :

3 : class Nightingale extends abcde.Bird{

4 :           Nightingale() { ref ernceCount++;}

5 :

6 :           pub lic static void main(String args[]) {

7 :                System.out.p rint(“Bef ore:  “ + ref ernceCount);

8 :               Nightingalef lorence = new Nightingale();

9 :                System.out.p rint(“Af ter:  “ + ref ernceCount);

10 :                       f lorence.f ly ();

11 :              }

12 :          }

                                      194

----------------------- Page 195-----------------------

a.    Kết quảtrên màn hình là:  Before: 0              After: 2

b.    Kết quảtrên màn hình là:  Before: 0              After: 1

c.    Lỗi biên dịch ởdòng 4 của lớp Nightingale vì không thể

overidde thành viên static

d.    Lỗi biên dịch ởdòng 10 của lớp Nightingale vì phương thức

fly() là protected trong lớp cha.

59. Chọn phát biểu đúng

a.   Chỉkiểu dữ liệu cơ sở mới được chuyển đổi kiểu tự động;

đểchuyển đổi kiểu dữ liệu của biến tham chiểu phải sử dụng

phép ép kiểu

b.   Chỉbiến tham chiếu mới được chuyển đổi kiểu tự động; để

chuyển kiểu của 1 biến kiểu cơ sởphải sử dụng  phép toán ép

kiểu

c.    Cảkiểu dữ liệu cơ sởvà kiểu tham chiếu đều có thểchuyển

đổi tự động và ép kiểu

d.   Phép ép kiểu đối với dữ liệu số có thể cần phép kiểm tra khi

thực thi

60. Dòng lệnh nào sau đây sẽkhông thểbiên dịch:

1 : byte b = 5;

2 : char c =  ‘5 ’;

3 : short s = 55;

4 :  int i = 555;

5 : f loatf  = 555.5f ;

6 : b = s;

7 :  i = c;

8 :  if (f > b)

9 :     f = i;

a.   Dòng 3

b.   Dòng 4

c.   Dòng 5

d.   Dòng 6

61. Chọn dòng phát sinh lỗi khi biên dịch

                                      195

----------------------- Page 196-----------------------

1 : byte b = 2;

2 : byte b1 = 3;

3 : b = b  * b1;

a.   Dòng 1

b.   Dòng 2

c.   Dòng 3

d.    Tất cảcác câu trên đều đúng

62. Trong đoạn mã sau kiểu dữ liệu của biến result có thểlà

những kiểu nào?

1 : byte b = 11;

2 : short s =13;

3 : result    = b  * ++s;

a.   byte, short, int, long, float, double

b.   boolean, byte, short, char, int, long, float, double

c.   byte, short, char, int, long, float, double

d.   int, long, float, double

63. Cho đoạn chương trình sau:

1 : class Cruncher{

2 :      void crunch(int i) {

3 :                System.out.p rintln(“int version ”):

4 :     }

5 :      void crunch(String s) {

6 :      System.out.p rintln(“String version ”);

7 :     }

8 :

9 :     pub lic static void main(String[] args) {

10 :               Cruncher crun = new Cruncher();

11 :               char ch =  ‘p ’;

12 :               crun.crunch(ch);

13 :     }

14 :    }

a.   Dòng 5 sẽkhông biên dịch vì phương thức trả vềkiểu void

không thểoverridde

                                      196

----------------------- Page 197-----------------------

 b.  Dòng 12 sẽkhông biên dịch vì không có             phiên bản nào của

 phương thức crunch() nhận vào tham sốkiểu char

 c.  Đoạn mã biên dịch được nh          ng sẽphát sinh Exception ở

 dòng 12

 d.   Chương trình chạy và in ra kết quả:  int version

 64. Chọn phát biểu đúng

 a.   Tham  chiếu   của  đối   tượng  có  thể được  chuyển  đổi  trong

 phép  gán  nh    ng  không  thể thực  hiện  trong  phép   gọi phương

 thức

 b.   Tham chiếu   của đổi tượng có thể được ép kiểu trong phép

 gọi phương thức nh       ng không thểthực hiện trong  phép gán

 c.   Tham  chiểu   của  đối   tượng  có  thể được  chuyển  đổi  trong

 phép gọi phương thức và phép gán nh             ng tuân theo những quy

 tắc khác nhau

 d.   Tham  chiếu   của  đối   tượng  có  thể được  chuyển  đổi  trong

 phép gọi phương       thức và    phép gán và tuân theo những quy tắc

 giống nhau

 65. Cho  đoạn mã nh         bên  dưới. Hãy cho biết  dòng nào không

 thểbiên dịch

1 :   Obj ect ob = new Obj ect();

2 :  String stringarr[] = new String[50] ;

3 :  Floatf loater = new Float(3.14f);

4 :   ob = stringarr;

5 :   ob = stringarr[5] ;

6 :  f loater = ob;

7 :   ob =f loater;

 a.  Dòng 4

 b.  Dòng 5

 a.  Dòng 6

 b.  Dòng 7

                                      197

----------------------- Page 198-----------------------

                                    Animal

                                     Mammal

    Dog                   Cat                    Racoon                Swamp

                     (implements               (implements              Thing

                       Washer)                   Washer)

                  Hình sau áp dụng cho các câu 66, 67, 68

66. Cho đoạn mã sau:

  1 :Dog           rover,f ido;

  2 :Animal        anim;

  3 :

  4 :rover = new Dog();

  5 :anim = rover;

  6 :f ido = (Dog) anim;

Hãy chọn phát biểu đúng

a.    Dòng 5 không thểbiên dịch

b.    Dòng 6 không thểbiên dịch

c.    Đoạn mã biên dịch thành công nh                   ng sẽphát sinh

Exception tại dòng 6

d.    Đoạn mã biên dịch thành công  và có thểthi hành

67. Cho đoạn mã sau:

  1 :Cat sunf lower;

  2 :Washer wawa;

  3 :Swamp Thing pogo ;

  4 :

  5 :sunf lower = new Cat();

                                             198

----------------------- Page 199-----------------------

 6 :wawa = sunf lower;

  7 :pogo  = (Swamp Thing) wawa;

Hãy chọn phát biểu đú

a.   Dòng 6 không thểbiên dịch; cần có một phép ép kiểu để

chuyển từkiểu Cat sang kiểu Washer

b.   Dòng 7 không thểbiên dịch vì không thểép từkiểu

interface sang kiểu class

c.   Đoạn mã sẽ dịch và chạy nh         ng phép ép kiểu ởdòng 7 là

thừa và có thể bỏ di

d.   Đoạn mã biên dịch thành công nh           ng sẽphát sinh

Exceptiono ởdòng 7 vì kiểu lớp của đối tượng trong biến wawa

lúc thi hành không thểchuyển sang kiểu SwampThing

68. Cho đoạn mã sau

 1 :Racoon rocky;

 2 :Swamp Thing pogo ;

 3 :Washer w;

 4 :

 5 :rocky = new Racooon();

 6 :w = rocky;

  7 :pogo  = w;

a.   Dòng 6 sẽkhông biên dịch; cần phải có phép ép kiểu để

chuyển từkiểu Racoon sang kiểu Washer

b.   Dòng 7 sẽkhông biên dịch; cần có phép ép kiểu đểchuyển

từkiểu Washer sang kiểu SwampThing

c.   Đoạn mã sẽbiên dịch nh         ng sẽphát sinh Exception ởdòng

7 vì chuyển đổi kiểu khi thực thi từ interface sang class là

không được phép

d.   Đoạn mã sẽbiên dịch và sẽphát sinh Exception ởdòng 7 vì

kiểu lớp của w tại thời điểm thực thi không thểchuyển sang

kiểu SwampThing

69. Cho đoạn mã sau:

1 : f or (int i = 0; i < 2; i++) {

2 :          f or (intj  = 0;j   < 3;j ++) {

                                     199

----------------------- Page 200-----------------------

3 :                 if (i ==j) {

4 :                           continue;

5 :                 }

6 :                 System.out.p rintln(“i = “ + i + “j            = “ +j);

7 :            }

8 : }

Dòng nào sẽlà một trong số các kết quảđược in ra?

a.   i = 0 j = 0

b.   i = 2 j = 1

c.   i = 0 j = 2

d.   i = 1j = 1

70. Cho đoạn mã sau:

1 :  outer: f or (int i = 0; i < 2; i++) {

2 :           f or (intj   =0;j    < 3;j ++) {

3 :                 if (i ==j) {

4 :                           continue outer;

5 :                 }

6 :                 System.out.p rintln(“i = “ + i + “j            = “ +j);

7 :            }

8 : }

Dòng nào sẽlà một trong số các kết quảđược in ra?

a.   i = 0 j = 0

b.   i = 0 j = 1

c.   i = 0 j = 2

d.   i = 1j = 0

71. Chọn vòng lặp đúng

a.

1 : while (int i < 7) {

2 :            i++;

3 :            System.out.p rintln(“i is  “ + i);

4 : }

b.

                                        200

----------------------- Page 201-----------------------

5 :  int i = 3;

6 : while (i) {

7 :            System.out.p rintln(“i is  “ + i);

8 : }

c.

1 :  intj  = 0;

2 : f or(int k = 0;j     + k != 10;j ++, k++) {

3 :                System.out.p rintln(“j  is  “ +j       + “k is  “ + k);

4 : }

d.

1 :  intj  = 0;

2 : do{

3 :                System.out.p rintln(“j  is  “ +j ++);

4 :                 if (j == 3)  { continue loop;}

5 : }while (j    < 10);

72. Cho biết kết xuất của đoạn mã sau

1 :  int x  = 0, y  = 4, z    = 5;

2 :  if ( x > 2) {

3 :                 if (y  < 5) {

4 :                          System.out.p rintln(“message one ”);

5 :                }

6 :                 else{

7 :                          System.out.p rintln(“message two ”);

8 :                }

9 : }

10 :      else if  (z > 5) {

11 :               System.out.p rintln(“message three ”);

12 :     }

13 :                else{

14 :                         System.out.p rintln(“messagef our ”);

15 :               }

a.   message one

b.   message two

c.   message three

                                       201

----------------------- Page 202-----------------------

d.   message four

73. Chọn phát biểu đúng cho đoạn mã sau:

1 :  intj  = 2;

2 : switch (j) {

3 :                case 2:

4 :                         System.out.p rintln(“value is two ”);

5 :                case 2 + 1:

6 :                         System.out.p rintln(“value is three ”);

7 :                         break;

8 :                def ault:

9 :                         System.out.p rintln(“value is ” +j);

10 :                                 break;

11 :              }

a.   Đoạn mã không hợp lệ bỡi biểu thức ởdòng 5

b.   Biến j trong cấu trúc switch() có thểlà một trong các kiểu:

byte, short, int hoặc long

c.    Kết xuất của chương trình chỉlà dòng:  value is two

d.    Kết xuất của chương trình chỉlà dòng:  value is two và

value is three

74. Cho biết kết quảsau khi dịch và thực thi đoạn chương trình

sau:

1. impo rtj ava.awt.*;

2.

3. pub lic class Test extends Frame {

4.   Test()  {

     5.            setSize(300,300);

     6.            Button b = new Button(“App ly ”);

     7.            add(b);

     8.  }

     9.

10.      pub lic static void main(String args[])  {

11.                Test f  = new Test();

12.      f .setVisible(true);

                                      202

----------------------- Page 203-----------------------

13.      }

14. }

a)   Có lỗi biên dịch tại dòng 11 bởi vì constructor ởdòng 4

không khai báo public.

b)   Chương trình biên dịch thành công nh           ng có sẽném ra

exception khi thực thi câu lệnh ởdòng thứ 7.

c)    Chương trình hiển thịframe trống.

d)   Chương trình hiển thị 1 nút nhấn (Button) sử dụng font chữ

mặc định cho nhãn của Button. Button chỉđủ lớn đểbao quanh

nhãn của nó.

e)   Chương trình hiển thịnút nhấn (Button) dùng font chữ mặc

định cho nhãn nút. Nút nhấn sẽchoán tất cảvùng hiển thị của

frame.

75. Nếu  1 frame dùng bộ quản lý trình bày (layout manager) là

GridLayout và không chứa bất kỳpanel hay container nào khác

bên trong nó thì tất cảnhững components khi đ a vào trong

frame này có cùng kích thước nh           nhau (ngang, dọc)?

a)   Đúng.

b)   Sai.

76. Nếu  1 frame dùng bộ quản lý trình bày (layout manager)

mặc định và không chứa bất kỳpanel nào bên trong thì tất cả

những components bên trong frame là cùng kích thước (ngang,

dọc) ?

a)   Đúng.

b)   Sai.

77. Với bộ quản lý trình bày BorderLayout không nhất thiết các

vùng phải có chứa các components.

a)   Đúng.

b)   Sai.

78. Bộ quản lý trình bày mặc định cho 1 khung chứa kiểu Panel

là:

                                     203

----------------------- Page 204-----------------------

a)   FlowLayout

b)   BorderLayout

c)   GridLayout

d)   GridBagLayout

79. Một Container có bộ quản lý trình bày là GridBagLayout thì

mỗi component sẽcó kích thước bằng nhau khi thêm vào khung

chứa (container) này?

a)   Đúng

b)   Sai

80. Bạn có thể tạo ra cửa sổ chính của ứng dụng bằng cách gọi:

    Framef     = new Frame(“Main Frame ”);

Nh   ng  khi   bạn   chạy  chương  trình  thì  Frame  không  hiển  thị.

Dòng nào bên dưới sẽlàm hiển thịFrame.

a)   f.setSize(300, 200);

b)   f.setBounds(10, 10, 500, 400);

c)   f.setForeground(Color.white);

d)   f.setVisible(true);

81. Đối tượng nào bên dưới có thểchứa 1 menubar (chọn

những câu đúng)

a)   Panel

b)   ScrollPane

c)   Frame

d)   Menu

82. Sau khi tạo  1 frame bằng câu lệnh Frame f             = new Frame()

và tạo menu bar bằng câu lệnh MenuBar mb = new MenuBar(),

làm thếnào để gắn MenuBar tên mb vàof .

a)   f.add(mb)

b)   f.setMenu(mb)

c)   f.addMenu(mb)

d)   f.setMenuBar(mb)

                                     204

----------------------- Page 205-----------------------

        PhụLục B: Đáp án trắc nghiệm kiến thức

        PhụLục B: Đáp án trắc nghiệm kiến thức

1.c; 2.b; 3.d; 4.c; 5.d; 6.d; 7.c; 8.a; 9.d;  10.a;  11.a;  12.c;  13.b;

14.d;  15.a;  16.d;  17.a;  18.c;  19.a; 20.c; 21.a; 22.a; 23.a; 24.a;

25.c; 26.a; 27.a; 28.d; 29.d; 30.c; 31.b; 32.a; 33.b; 34.d; 35.c;

36.c; 37.d; 38.d; 39.c; 40.c; 41.c; 42.c; 43.d; 44.a; 45.d; 46.d;

47.a; 48.b; 49.c; 50.b; 51.d; 52.b; 53.a; 54.d; 55.c; 56.d; 57.c;

58.a; 59.c; 60.d; 61.c; 62.d; 63.d; 64.d; 65.c; 66.d; 67.d; 68.b;

69.c; 70.d; 71.c; 72.d; 73.d; 74.e; 75.a; 76.b; 77.a; 78.a; 79.b;

80.d; 81.c; 82.d

                                     205

Bạn đang đọc truyện trên: truyentop.pro

Tags: