Tải bản đầy đủ (.doc) (75 trang)

Tổng quan về Lập Trình Java

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (329.79 KB, 75 trang )

Chơng I lập trình là gì ?
Đối với đại đa số mọi ngời, hình ảnh về chiếc máy tính hiện ra nh một trò ma
thuật. Đó là một thế giới quyền lực vô hình và thờng đợc cảm nhận nh một thực thể toàn
năng có khả năng, với một chút tác động của con ngời, trả lời cho những diễn biến th-
ơng mại, chính trị, khoa học, và rất nhiều phơng diện khác trong cuộc sống của chúng
ta. Những chiếc máy tính làm gợi nhớ sự lo ngại không quen thuộc; những lầm lỗi của
con ngời thờng đợc che giấu bằng những lời nguỵ biện tỷ nh máy tính đã nghỉ hoặc
đó phải là sai sót của máy tính. Song le, một chiếc máy tính thì không có gì hơn là
một tập hợp vô hồn các dây nhợ và thành phần silicon đợc tổ chức nh thế nào đó sao
cho nó có thể thực hiện nhanh chóng những thao tác đơn giản nh cộng hai con số với
nhau. Thế thì làm thế nào nó có đợc sức mạnh ghê gớm nh vậy ? Bàn tay tài ba nào đã
biến tập hợp những thành phần điện tử này thành một công cụ vạn năng ?
Lập trình chính là để thực hiện trò ma thuật đó. Một chơng trình là một tập hợp
các hớng dẫn (directions) chính xác những việc cần làm cho máy tính; nh vậy chơng
trình là phơng tiện trung gian đợc dùng để giao tiếp với máy tính.
Các chơng trình có thể đợc viết trên nhiều ngôn ngữ lập trình (programming
languages)- những ngôn ngữ đặc tả các hớng dẫn cho máy tính. Trong cuốn sách này
chúng ta sử dụng ngôn ngữ Java.
Công việc trớc tiên khi lập trình là phải sáng sủa hoá bài toán tới mức có thể.
Chính xác yêu cầu của bài toán là gì ? Nó có thể đợc chia thành những vấn đề nhỏ hơn
để dễ quản lý ra sao ? Thuật toán nào đợc dùng để giải quyết ? Cách cài đặt thuật toán
vào chơng trình ? Chơng trình có làm việc hay không ? Cách trình bày đã trong sáng
hay cha ? Có nhanh không ? Có dễ thay đổi khi cần thiết ? Có yêu cầu quá nhiều tài
nguyên của hệ thống ? Đó là những thách thức đối với các lập trình viên- những ngời
thiết kế và viết chơng trình.
Con chuột máy trong mê cung
Chúng ta bắt đầu bài học bằng một bài toán nhỏ chứa những yếu tố cơ bản của bất
kỳ một đề án lập trình nào: thực hiện những chỉ thị (instructions) lên một con chuột
máy để giúp nó thoát khỏi một mê cung. ở đây, mê cung là một khu hình chữ nhật đợc
bố trí các phòng hình vuông trong đó; hai phòng kề nhau có thể đợc ngăn cách bởi một
bức tờng hoặc mở thông với nhau. Chúng ta đặt con chuột ở lối vào mê cung với một đ-


ờng kẻ đậm mô tả các bức tờng, và đờng chấm chấm mô tả đờng thông qua.
Con chuột cũng giống nh một chiếc máy tính, nó chỉ biết làm theo những chỉ thị
đơn giản xác định nào đó: step forward đi vào phòng tiếp theo, turn right rẽ phải,
turn left rẽ trái. Chúng ta phải lập trình cho nó bằng cách viết tỉ mỉ các chỉ thị mà nó
phải làm theo để thoát ra ngoài mê cung. Với trờng hợp đơn giản này, các chỉ thị sẽ là:
Máy tính và ngôn ngữ lập trình
Những chiếc máy tính mà bạn sẽ học cách lập trình cho chúng cũng giống nh lũ
chuột máy ở trên. Chúng hiểu cách đáp lại một danh mục các chỉ thị đơn giản gọi là tập
lệnh (instruction set). Công việc viết một chơng trình là diễn đạt cách giải quyết bằng
thuật toán cho một vấn đề bằng tập lệnh máy tính. Đơng nhiên, tập lệnh của các máy
tính thì phức tạp hơn tập các chỉ thị chuột rất nhiều. Các tập lệnh thay đổi qua các máy
khác nhau, song chúng đều có những điểm chung sau:
Chúng có thể thực hiện đợc những thao tác số học đơn giản trên số nguyên
và số thập phân; có khả năng lu giữ các kết quả trung gian tạm thời.
Chúng có những thuận lợi khi làm việc với các chuỗi chữ cái, ký hiệu, số; và
có thể so sánh bằng nhau hay tơng đơng.
Chúng có khả năng nhận thông tin (input) từ những nguồn dữ liệu nh bàn
phím, đĩa từ, điện thoại, băng từ hay các máy tính khác; có khả năng gửi
thông tin (output) tới những thiết bị nh máy đầu cuối, máy in, đĩa, băng từ
hay các máy tính khác.
Cũng nh việc kết hợp các chỉ thị đơn giản có thể đa chú chuột máy thoát khỏi một
mê cung, một sự phối hợp thông minh các chỉ lệnh đơn giản của máy tính có thể thực
hiện đợc những công việc phức tạp nh thể là chúng có phép lạ vậy. u thế lớn của máy
tính là có thể thực thi với tốc độ vài triệu chỉ lệnh trên một giây. Dù cho khi nó thực
hiện những lệnh đơn giản, việc thi hành đợc thực hiện quá nhanh và kết quả có thể tinh
vi đến mức đáng ngạc nhiên.
Trong thời thơ ấu của máy tính, các chơng trình đợc viết bởi những tập lệnh đơn
giản này- đợc gọi là ngôn ngữ máy (machine language). Ngày nay, chúng ta sử dụng
một ngôn ngữ lập trình mức cao (high- level programming languages), giống nh ngôn
ngữ mà chúng ta đã dùng để lập trình cho chú chuột máy, và máy tính sẽ tự động

chuyển đổi kết quả thành ngôn ngữ riêng của nó để thực thi.
Có nhiều ngôn ngữ lập trình mức cao. Java là một trong số đó; các ngôn ngữ khác
nh BASIC, C++, Pascal, Tất cả chúng đều chia sẻ một tính chất quan trọng, cũng giống
nh ngôn ngữ của chuột máy, rằng các ngôn ngữ phải đợc sử dụng theo những quy tắc
chặt chẽ. Điểm khác biệt với ngôn ngữ tự nhiên, với tính đa nghĩa và tinh tế của nó, là
các ngôn ngữ lập trình đều không mềm dẻo; và giao tiếp với máy tính là công việc vất
vả nhất cho những lập trình viên mới vào nghề.
Java đợc thiết kế đặc biệt để lập trình an toàn trên Internet, và nó nhanh chóng trở
nên đợc a chuộng tuyệt đối. Java cũng là một ngôn ngữ rất giàu có, vì thế những bài học
để nắm vững ngôn ngữ này sẽ gắn với việc lập trình trên bất kỳ một ngôn ngữ nào mà
bạn đã nói lời từ biệt. Hơn nữa, với tính năng lập trình an toàn, Java giúp ngời mới
học tránh đợc những cạm bẫy thờng có trong các ngôn ngữ khác. Cuối cùng, lập trình
trên Java, đặc biệt là cho các trình duyệt Internet, là rất lý thú! Nhiều ví dụ trong cuốn
sách này kéo theo những chơng trình mà bạn có thể đa vào những trang Web của mình
để cả thế giới cùng thởng thức!
Chơng trình và thuật toán
Ví dụ về chú chuột máy đã chỉ ra một cách rõ ràng rằng, trớc khi bắt đầu viết một
chơng trình (trên Java hay bất kỳ một ngôn ngữ nào khác), bạn cần phải hiểu đích xác
bạn muốn chơng trình đó làm cái gì và làm nh thế nào. Trừ khi bạn đã nghiên cứu kỹ l-
ỡng thuật toán, còn thì việc viết một chơng trình chắc chắn sẽ là một thảm hoạ, và trong
trờng hợp tồi nhất là không thể thực hiện đợc.
Trong cuốn sách này chúng tôi sẽ hớng dẫn bạn cách thiết kế các thuật toán và đa
chúng vào Java. Có ba công việc riêng rẽ ở đây: học ngữ pháp và cú pháp Java, học
những kinh nghiệm đầu tiên đợc bàn luận về kiểu mẫu viết chơng trình, học cách thiết
kế và thực hiện các thuật toán. Trớc tiên, viết những chơng trình theo đúng cú pháp d-
ờng nh là công việc khó khăn nhất. Viết những chơng trình đúng cú pháp là vấn đề quan
trọng trong việc nắm bắt tập các quy tắc về ngữ pháp. Sử dụng thành thạo cú pháp Java
là việc rất khó bởi vì máy tính là thứ hoàn toàn không khoan nhợng đối với bất kỳ một
sai sót nào.
Việc viết chơng trình sử dụng một kiểu mẫu tốt là một công việc khó bởi vì có rất

ít những quy tắc tuyệt đối mà hầu hết là những nguyên lý chung thờng đợc sử dụng.
Tính tổ chức, sự tỉ mỉ, sự nhạy bén mang tính kinh nghiệm và một chút óc sáng tạo là
những yếu tố cần thiết để viết một chơng trình kiểu mẫu. Cuối cùng, sau khi bạn đã làm
chủ đợc những rắc rối về mặt ngôn ngữ, thì công việc thứ ba của chúng ta- thiết kế và
thực thi những thuật toán- là nhiệm vụ mang tính thách thức nhất, thú vị nhất và quan
trọng nhất. Nó đòi hỏi tài năng và những kỹ xảo trong giải quyết vấn đề. Trong cuốn
sách này bạn sẽ đợc học nhiều những kỹ thuật mà thờng là có thể tìm thấy sự phối hợp
của chúng trong những công việc khác nhau.
ứng dụng và Applet
Trong Java, bạn có thể viết hai kiểu chơng trình phân biệt: các ứng dụng và các
Applet. Các ứng dụng (applications) là những chơng trình đứng một mình và chạy trên
máy tính riêng của bạn. Chúng không khác gì với những kiểu chơng trình mà bạn có
thể viết trên các ngôn ngữ lập trình khác, nh C++ hay BASIC. Các ứng dụng này có thể
đọc và thao tác dữ liệu lu trên đĩa của máy tính, cũng nh dữ liệu mà bạn gõ vào từ bàn
phím. Chúng cũng có thể ghi dữ liệu vào đĩa, hiển thị ra màn hình, và in ra máy in.
Không giống với các ứng dụng, các Applet đợc thực thi trong một trình duyệt, nh
Netscape Communicator hay Suns HotJava. Các Applet điển hình là cho phép ngời sử
dụng điều khiển sự thực thi thông qua một giao diện đồ họa ngời sử dụng (Graphical
User Interface- GUI), đó là một tuyển tập các thành phần (components) nh button và
scrollbar trong một cửa sổ. Một khi bạn đã viết một Applet, bạn không chỉ có thể thực
thi nó trong trình duyệt của mình, mà còn có khả năng thực thi trên những trình duyệt
khác, của những ngời khác. Tơng tự, bạn có thể thực thi những Applet mà những lập
trình viên khác phát triển. Khả năng này thực sự đã đ World Wide Web vào cuộc sống
của chúng ta.
Chúng tôi sẽ hớng dẫn bạn cách làm thế nào để viết các ứng dụng và các Applet.
Viết các Applet thì khoái hơn, nhng các ứng dụng thì lại giống hơn với các ngôn ngữ lập
trình truyền thống nh BASIC. Trong mọi trờng hợp, sự khác biệt giữa chúng chủ yếu chỉ
mang tính hình thức; cái khó khi viết một chơng trình vẫn là công việc thiết kế thuật
toán cơ sở của nó.
Biên dịch và thông dịch#

Hãy nói về cơ chế. Sau khi thiết kế và viết chơng trình ứng dụng hay applet
trên giấy, bạn bắt đầu tiến hành gõ nội dung của nó vào một file trên máy tính và gỡ rối
(debugging) cho nó loại trừ những lỗi có thể gặp trong giai đoạn lập trình. Một file
đợc hiểu tơng tự nh là một thùng chứa điện tử mà ở đó các thông tin nh văn bản, dữ
liệu hay các chơng trình có thể đợc lu trữ. Việc soạn thảo và sửa chữa chơng trình của
bạn trên máy tính đợc thực hiện thông qua một trình soạn thảo (editor), một chơng trình
đợc hỗ trợ có khả năng hiểu những chỉ thị nh chèn và xoá các dòng ký tự, di chuyển
chúng qua lại, và tìm kiếm những mẫu tự đặc biệt. Các trình soạn thảo cho phép lu và
phục hồi dữ liệu thông qua đĩa (disk), một thành phần nhớ chính của máy tính. Học
cách sử dụng một trình soạn thảo sẽ giúp bạn tiến hành viết và gỡ rối chơng trình đợc dễ
dàng hơn.
Nhớ rằng chơng trình mà bạn viết và gõ vào máy tính là chơng trình Java, một
ngôn ngữ lập trình mức cao, cho phép các lập trình viên diễn giải những t tởng của anh
ta theo những thuật ngữ phức tạp nhng trong sáng và dễ thể hiện. Những ví dụ khác về
ngôn ngữ lập trình mức cao là BASIC, Pascal, và C++. Hầu hết các ngôn ngữ mức cao
đều cần phải đợc chuyển đổi thành một ngôn ngữ cơ sở hơn có khả năng đợc thực thi
trực tiếp bởi phần cứng máy tính. Java khác với đa số các ngôn ngữ lập trình mức cao.
Bởi vì một trong các mục tiêu của Java là đạt tới khả năng độc lập phần cứng (platform-
independence), Java sẽ không đợc chuyển đổi thành một ngôn ngữ mã máy cụ thể nào.
Thay vì nh vậy, Java đợc chuyển đổi thành một ngôn ngữ trung gian gọi là Java
Bytecode. Các Java Bytecode sau đó đợc thông dịch theo cùng một phơng pháp chính
xác trên tất cả các máy tính, vì vậy một chơng trình Java sẽ làm những công việc giống
nhau cho dù nó đợc chạy trên một máy IBM PC, Apple Macintosh, hay bất kỳ một máy
tính nào khác.
Khi đã có một file chơng trình chứa mã Java, bạn sẽ dùng hai chơng trình khác đ-
ợc hỗ trợ sẵn: một trình biên dịch (compiler) có nhiệm vụ chuyển đổi chơng trình của
bạn thành một chơng trình theo ngôn ngữ Java Bytecode, và một trình thông dịch
(interpreter), để thực thi các Java Bytecode này. Một tính năng đặc biệt hấp dẫn của
Java là rất nhiều các trình duyệt Internet hiện đại đều có kết hợp với những trình thông
dịch Java.

Những bớc thực hiện mà bạn phải làm để biên dịch và chạy chơng trình Java của
bạn phụ thuộc vào hệ thống mà bạn đang sử dụng và chơng trình của bạn là một ứng
dụng hay một Applet. Trờng hợp đơn giản nhất là khi bạn viết một ứng dụng (stand-
alone program) trên một hệ thống hớng dòng lệnh (command-oriented systems), nh
DOS hay UNIX. Trong trờng hợp này, bạn dể chơng trình của mình trong một file có
tên là whatever.java (whatever có thể là bất kỳ, nhng java phải là java). Gõ dòng
lệnh:
java whatever.java
để biên dịch chơng trình. Sau đó gõ:
javac whatever
để chạy.
Nhớ rằng, trớc tiên bạn phải biên dịch chơng trình. Sau đó bạn có thể chạy nó bao
nhiêu lần tùy thích.
Nếu chơng trình của bạn có lỗi cú pháp (syntactic errors, grammatical errors),
nghĩa là khi có những quy tắc văn phạm của Java không đợc tôn trọng, công việc biên
dịch chơng trình thành các Bytecode không thể hoàn thành, và trình biên dịch sẽ cảnh
báo cho bạn thờng là bằng những thông báo cộc lốc và hết sức không thân thiện. Bạn
phải tìm xem chỗ nào trong chơng trình cần phải thay đổi và dùng trình soạn thảo để
sửa lỗi, sau đó cố gắng biên dịch lại. Bạn có thể sẽ mất một vài lần sửa chữa để việc
biên dịch thành công.
Song le, một chơng trình đợc biên dịch thành công (không có lỗi) thì cha đủ đảm
bảo để chơng trình có thể làm việc một cách đúng đắn. Có thể bạn đã viết những đoạn
mã rất đúng cú pháp nhng chơng trình lại không làm việc chính xác nh bạn mong đợi.
Những lỗi nhận đợc trong quá trình thực hiện chơng trình đợc gọi là các lỗi logic (logic
errors hay run-time errors); cũng nh các lỗi cú pháp, chúng cần đợc sửa chữa lại. Các lỗi
logic có thể đợc phát sinh do đơn giản là một lỗi đánh máy hay do sai lầm trong thuật
toán.
Lập trình hớng đối tợng: thăm lại chú
chuột trong mê cung
Java có những tính năng đáng ca ngợi. Trung tâm của những tính năng này đó là

Java là một ngôn ngữ hớng đối tợng (object - oriented language). Điều này có nghĩa là
Java cổ vũ thậm chí ép buộc mô hình lập trình hớng đối tợng (OOP Object -
Oriented Programming.) OOP là một cách nghĩ trong giải quyết vấn đề một kiểu
mẫu (paradigm) lập trình. Trong OOP, một chơng trình đợc xem xét nh là một tập các
đối tợng (objects) tơng tác lẫn nhau bằng cách gửi các thông điệp (messages) cho nhau.
Chẳng hạn, sử dụng OOP, chúng ta sẽ tiếp cận chú chuột máy của chúng ta theo
cách sau đây. Mê cung và chuột mỗi thứ là một đối tợng. Một đối tợng thứ ba gọi
là quan sát viên (observer)- có nhiệm vụ hiển thị cấu trúc của mê cung trên màn hình
máy tính và chỉ ra con đờng mà chú chuột đã dùng để tẩu thoát khỏi mê cung.
Để quan sát viên có thể hiển thị cấu trúc mê cung, nó phải có khả năng nhận ra
những bức tờng đợc sắp xếp ở trong đó. Thông tin này thu đợc bằng cách gửi thông điệp
tới mê cung nhớ rằng mê cung là một đối tợng - , hỏi nó, với mỗi một căn phòng
xác định phải chăng có một bức tờng chắn ở các hớng Bắc, Nam, Tây, Đông. Bằng cách
hỏi han có hệ thống về các phòng, quan sát viên có thể vẽ kiến trúc mê cung lên màn
hình. Thêm vào đó, quan sát viên sẽ gỉ thông điệp tới chuột máy, hỏi xem di chuyển tiếp
theo của nó là gì, và sử dụng câu trả lời để tái hiện con đờng thoát khỏi mê cung.
Nh chúng ta đã biết, chuột máy phải có khả năng xác định xem có phải nó đang
đối diện với một bức tờng hay không. Để làm điều này, chuột ta phải biết đợc phơng h-
ớng hiện tại của nó (Bắc, Nam, Tây, Đông) và nó đang ở tại vị trí nào trong mê cung. Sử
dụng các thông tin này, nó sẽ gửi một thông điệp tới mê cung, hỏi xem phải chăng có
một bức tờng đang nằm ở hớng đó của căn phòng đó.
Cả ba đối tợng nói trên phải có một cách nào đó để gọi tên các phòng trong mê
cung. Chẳng hạn có thể đánh số các phòng bởi một cặp số nguyên (cột, hàng) chỉ ra số
hiệu cột và hàng của phòng.
Chúng ta thử quan sát giải pháp OOP này. Mê cung phải đợc chuẩn bị để nhận các
thông điệp nh Cho tớ biết, mê cung, có phải có một bức tờng hớng Đông ở căn phòng
(3, 2) ? Đơng nhiên, khi chúng ta viết thông điệp này trên Java, nó sẽ ngắn gọn hơn rất
nhiều tỷ nh checkWall (EAST, 3, 2. Mê cung có thể trả lời đúng hoặc sai.
Việc đặc tả cách ứng xử (behavior) của mê cung liên quan tới sự mô tả chi tiết những
kiểu thông điệp mà mê cung có thể đáp lại. Đặc tả này đợc gọi là một giao diện

(interface). Một giao diện mô tả tất cả mọi thứ về mê cung mà thế giới bên ngoài cần
phải biết để tơng tác với nó. Tuy nhiên, giao diện lại không đề cập gì đến cách mà đối t-
ợng thực sự đợc thực thi. Đó là che giấu thông tin (information hiding) một trong
những đặc tính của OOP. Một ví dụ về đối tợng mouse đợc cho trên hình 1.2.
Chú chuột phải đặc tả giao diện của nó. Trong chơng trình đơn giản của chúng ta,
chú chuột phải đáp lại một thông điệp hỏi: Cho tớ biết, chuột máy, di chuyển tiếp theo
của cậu là gi ?, hoặc ngắn gọn hơn, tellMove (). Chuột ta sẽ trả lời Bắc, Nam,
Tây, hoặc Đông. (Quan sát viên, kẻ gửi thông điệp này, có thể sẽ phải thực hiện
một kiểm tra kép để chắc chắn rằng con chuột ranh mãnh không cố gắng để đào tẩu qua
một bức tờng!). Chú ý rằng chuột máy phải chứa trong nó thuật toán thực sự mà chúng
ta đã khai thác ở phần trớc, song cả mê cung lẫn quan sát viên đều không thể nhìn
thấy thông tin đợc che giấu này. Tất cả những gì chuột ta cần dùng để khám phá ra con
đờng tẩu thoát đợc mã hóa bên trong đối tợng mouse.
Sự phá phách của lũ chuột Tính trừu tợng
Giả sử chúng ta muốn cho thông qua mê cung hai con chuột khác nhau một
con bắt đầu tại một cửa mở trong mê cung và con còn lại tại cửa mở đối diện. Chúng ta
Move one step
Move one step
Where are you ?
Where are you ?
Where I am: (3,2)
Where I am heading: North
Where I am: (3,2)
Where I am heading: North
Hình 1.2: Một thể hiện của lớp Mouse.
giả thiết rằng lũ chuột có thể trèo qua nhau kho chúng tìm đờng thoát khỏi mê cun. Mỗi
con chuột là một đối tợng riêng biệt và mỗi một trong chúng có thể ở tại những địa
điểm khác nhau trong những thời điểm khác nhau. Tuy nhiên, mỗi con chuột đều có
cách ứng xử trừu tợng (abstract behavior) giống nhau. Cách ứng xử chung này đợc đặc
tả trong Java bởi giao diện chung của lũ chuột. Khái niệm về một lớp (class) đơn giản là

một giao diện cùng với sừ thực thi chi tiết của giao diện đó. Mỗi đối tợng chuột đợc gọi
là một thể hiện (instance) của lớp. Tên của một thể hiện đợc dùng khi gửi thông điệp tới
đôí tợng đó. Chẳng hạn, nếu gọi tên của lũ chuột là speedy và greedy, quan sát viên có
thể hỏi về di chuyển tiếp theo của speedy bằng cách gửi thông điệp
speedy.tellMove(). Quan hệ giữa lớp Mouse và hai thể hiện của nó đợc minh hoạ
trên hình 1.3.
Bạn có thể tự hỏi liệu OOP có thể dung nạp nhiều hơn một loại chuột hay không.
Câu trả lời là có thể. Trong trờng hợp này, một số cách ứng xử của hai loại chuột có thể
tơng tự nhau, thậm chí chúng có thể có những giao diện giống nhau. Tuy nhiên, có
những sự thực thi khác nhau trong những phần của giao diện, và kết quả là những cách
ứng xử khác nhau. Trong OOP tính năng này gọi là sự chuyên biệt hoá (specialization),
và nó đợc hỗ trợ bởi những cơ chế OOP quan trọng của lớp con và tính kế thừa. Các chủ
đề này sẽ đợc xem xét đầy đủ ở chơng 12.
Cuối cùng, đôi khi các thông điệp đợc gửi tới không chỉ những thể hiện của lớp
mà là chính bản thân lớp đó. Chẳng hạn, chúng ta có thể yêu cầu lớp Mouse lu giữ thông
tin về số thể hiện đã đợc tạo ra, và chúng ta sẽ hỏi số lợng này bằng thông điệp
Mouse.tellHowMany(). Một cách tơng tự, lớp có thể lu giữ những thông tin về cấu tạo
bên trong của nó (vì vậy là cấu tạo của tất cả các thể hiện của nó.) Chẳng hạn, lớp
Mouse có thể chỉ ra rằng các thể hiện của nó đều có bốn chân, trong khi lớp
Chimpanzee (Tinh tinh) thì có hai chân. Với ý nghĩa này, lớp đóng vai trò nh là một
hoạ đồ của các thể hiện.
Tại sao phải lập trình hớng đối tợng ?
Nếu bạn đã từng lập trình trên BASIC, một ngôn ngữ rất phổ biến cho ngời mới
học, thì việc tán chuyện về những thứ nh lớp và đối tợng dờng nh là một công việc quá
vô bổ chỉ để hoàn thành một nhiệm vụ giản đơn. Tại sao lại có sự phiền phức này ?
Câu trả lời đã đợc chúng đề cập ở phần đầu của chơng này: Chúng ta cần viết
những chơng trình dễ đọc và dễ thay đổi. Lập trình hớng đỗi tợng là một cách cấu trúc
hoá chơng trình để đáp ứng những tiêu chuẩn này. Đặc biệt, các lớp, đôí tợng, giao diện
và tính năng che giấu thông tin cho phép từng phần trong chong trình có thể đợc viết và
sửa đổi một cách độc lập, một u điểm vô giá khi viết những chơng trình lớn. Với những

chơng trình đồ sộ 100.000 dòng hoặc hơn điều này gần nh là bắt buộc.
Chơng II những thành
phần cơ bản của Java
Trong chơng này chúng ta sẽ bàn luận về những thành phần cơ bản của một chơng
trình Java. Một chơng trình có thể đợc đọc và hiểu sâu sắc thậm chí bởi những ngời cha
hề biết lập trình, nh là đọc và hiểu một câu truyện ngắn hay một bài thơ vậy. Thực ra, b-
ớc đầu tiên để học viết một chơng trình là học cách đọc chúng. Nếu chơng trình là đơn
giản và đợc tổ chức tốt, việc thởng thức nó quả thật rất thú vị.
Hai chơng trình đơn giản
Chúng ta bắt đầu bằng hai chơng trình hoàn thiện song rất đơn giản. Đây là những
chơng trình ứng dụng đúng hơn là những applet, nghĩa là chúng có thể chạy bên ngoài
một trình duyệt Web. Cũng nh tất cả các ứng dụng trong cuốn sách này, chúng đợc kích
hoạt bởi một dòng lệnh, input (từ) và output (ra) cửa sổ lệnh (command windows). Chú
ý rằng nếu bạn đang sử dụng một môi trờng phát triển tích hợp (IDE), nh mô tả ở chơng
I, các phơng thức kích hoạt chơng trình của bạn sẽ theo một cách khác.
1. class Hello
2.
3. {
4. // Display Hello Message
5.
6. public static void main(String[] args)
7. {
8. System.output.println("Hello");
9. }
10. }
Bạn phải gõ chơng trình này vào trong một file có tên Hello.java (các chữ thờng
và chữ hoa là rất quan trọng). Sau đó bạn biên dịch chơng trình bằng dòng lệnh:
javac Hello.java
Mỗi lớp yêu cầu một file độc lập. Java hạn chế rằng tên mà
bạn dùng theo sau từ khoá class phải đợc dùng nh là tên cơ

sở của file chứa chơng trình đó. Phần mở rộng của file là
.java. Nên nhớ việc tên của lớp và của file chơng trình phải
hoàn toàn giống nhau, kể cả cách viết hoa và thờng.
Bạn chạy chơng trình bằng dòng lệnh:
java Hello
Sau khi biên dịch và chạy, chơng trình sẽ hiển thị thông điệp:
Hello!
trên màn hình cuối.
Chúng ta hãy xem xét từng phần của chơng trình này một cách độc lập với nhau.
Trớc tiên, các chữ số thứ tự dòng không thuộc nội dung của chơng trình (vì thế bạn
không gõ chúng vào chơng trình trên đĩa để chạy); chúng chỉ đợc sử dụng để tiện cho
việc tham chiếu của chúng ta. Các dòng trắng (2 và 5) có thể bỏ qua. Dòng 4 là dòng
chú thích (comment). Các dòng chú thích bắt đầu bởi hai dấu slash, //, đợc dùng để giải
thích cho những ngời đọc mã chơng trình, máy tính sẽ bỏ qua chúng.
Nh vậy, khu vực thực thi của chơng trình bao gồm các dòng 1, 3, 6, 7, 8, 9, 10.
Dòng 1 gọi là tiêu đề lớp (class heading) cần phải có ở đầu tất cả các chơng trình: nó
bao gồm từ khoá class và tên của lớp (phải giống với tên của phần đầu file chơng
trình.) Dòng 6 gọi là method heading giới thiệu phơng thức (hoặc hàm) duy nhất của
chơng trình tên là main. Một phơng thức tên main đại diện cho những thao tác chính
của ứng dụng là những gì đợc thực thi khi chơng trình chạy. Phần heading method
này sẽ luôn luôn xuất hiện chính xác nh trên trong tất cả các ứng dụng của bạn.
Dòng mã:
System.out.println("Hello!");
gửi các ký tự H, e, l, l, o, ! liên tiếp nhau để hiển thị trên màn hình cuối, tạo ra
thông điệp chào mừng mong đợi. Phơng thức này sau đó phát sinh một ký tự newline có
tác dụng nh một dấu xuống dòng. Ký tự này không thực sự hiển thị trên màn hình máy
tính, song nó định vị output cursor (con trỏ) tại vị trí đầu tiên của dòng tiếp theo.
Dòng 9 và 10 tuy rằng rất đơn giản song không có chúng trình biên dịch sẽ phát
sinh lỗi. Chú ý rằng dòng 3 và 7 chứa các dấu ngoặc mở (opening brace {). Dòng 9
và 10 chứa các dấu ngoặc đóng (closing brace - }) tơng ứng. Chính xác hơn, các dấu

ngoặc ở các dòng 3 và 10 tơng ứng với nhau, thể hiện rằng các dòng mã đợc bao giữa
chúng (từ dòng 4 đến dòng 9) là thành phần của lớp Hello. Cũng vậy, các dấu ngoặc ở
các dòng 7 và 9 tơng ứng với nhau, thể hiện rằng các dòng mã đợc bao giữa chúng(dòng
8) là thành phần của phơng thức main. Chú ý cách mà các dấu ngoặc đợc đặt lồng nhau:
toàn bộ phơng thức main đợc chứa trong lớp Hello. Chúng ta sẽ đợc xem cách sắp xếp
lồng nhau này để một phần của chơng trình chứa các thành phần khác sử dụng các
dấu ngoặc bao.
Bây giờ, hãy xem xét một chơng trình nhận thông tin vào từ ngời sử dụng. Nó sẽ
hỏi ngời sử dụng một nhiệt độ ở thang đo Fahrenheit và chuyển đổi thành nhiệt độ
Centigrade. Chúng tôi muốn có một hội thoại tơng tự nh sau:
Please type the temperature (deg F): 68
68 deg F is 20.0 deg C
Câu trả lời của ngời sử dụng đợc hiển thị tiếp sau lời mời vào dữ liệu.
1 class Temperature
2 {
3 // chuyển đổi nhiệt độ từ thang đo F sang C
4
5 public static void main (String[] args)
6 {
7 int temperature;
8 System.out.print("Please type the temperature (deg F):");
9 temperature = Keyboard.readInt();
10 System.out.print(temperature);
11 System.out.print(" deg F is ");
12 System.out.print((5.0 * (temperature 32.0)) / 9.0);
13 System.out.println(" deg C");
14 }
15 }
Bây giờ, chơng trình đợc chứa trong file Temperature.java, là tên của lớp mà
chúng ta định nghĩa. Phần đầu của chơng trình và các lời chú thích tơng tự nh chơng

trình Hello. Tuy nhiên sự phức tạp nằm ở phần thân chính của chơng trình từ dòng 7
đến dòng 13.
Phần làm việc của chơng trình là từ dòng 7 đến dòng 13. Dòng 7 là một mô tả
(declararion) chỉ ra rằng chơng trình sẽ sử dụng một biến tên là temperature; biến này,
nh chúng ta sẽ thấy, dùng để chứa dữ liệu vào của ngời sử dụng. Phần làm việc chính
của chơng trình đợc thực hiện bởi sáu điều lệnh khả thi (executable statement) ở các
dòng từ 8 đến 13. Chơng trình sau khi biên dịch sẽ thực thi các điều lệnh này chỉ
đơn giản là làm theo những gì chúng chỉ dẫn lần lợt từng lệnh một. Nói chung tất cả
các chơng trình Java đều đòi hỏi các mô tả và các điều lệnh khả thi để thực hiện trong
thời gian chay.
Trong chơng trình này, sáu điều lệnh chỉ dẫn làm hai kiểu công việc: gửi các ký
tự ra màn hình cuối (các dòng 8, 10, 11, 12, 13) và nhận dữ liệu vào từ ngời sử dụng
(dòng 9). Dòng 8 đợc thực hiện trớc tiên, in ra một lời mời yêu cầu ngời sử dụng nhập
dữ liệu. Sau đó dòng 9 đợc thực hiện, khiến máy tính tạm thời chờ ngời sử dụng gõ vào
một số (và phím Enter). Số này đợc lu trong biến temperature.
Trong ngôn ngữ Java, chúng ta nói rằng giá trị này đợc gán nh là một giá trị của
biến temperature, hay đơn giản là đợc gán cho biến temperature. Định danh tợng tr-
ng temperature đợc mô tả bởi điều lệnh ở dòng 7.
Các dòng10 và 11 đợc thực hiện tiếp theo. Dòng 10 in ra gía trị đã đựơc gán cho
biến temperature.
Tiếp theo là dòng 12. Nó lấy giá trị gọi là temperature và thực hiện một vài
thao tác số học để tính ra giá trị nhiệt độ C tơng ứng. Chú ý rằng phơng thức print làm
việc giống với phơng thức println, ngoại trừ việc nó không tự động xuống dòng.
Vào ra đơn giản
Cách xử lý hiển thị dữ liệu, đa ra máy in hoặc trên màn hình máy tính, đợc gọi là
output. Trong Java phơng thức System.out.print() và System.out.println() là
những cách đơn giản nhất để sản sinh output: Chúng hiển thị các ký tự trên màn hình,
thờng đợc tham chiếu nh là một stdout, dòng ra chuẩn (standard output stream) hay
console. Trong chơng trình ở trên, dòng mã:
System.out.print("deg F is");

chỉ thị cho máy tính in ra văn bản nằm giữa hai dấu nháy, kể cả khoảng trống, đó
là:
deg F is
Chúng ta muốn rằng dữ liệu ra đợc hiển thị kế tiếp nhau trong cùng một dòng, vì
thế chúng ta sử dụng phơng thức print chứ không phải println.
Cũng trong chơng trình trên, dòng mã:
System.out.print(temperature);
chỉ thị cho máy tính in ra giá trị của biến Temperature.
Có thể kết hợp hai dòng mã trên trong cùng một dòng:
System.out.print(temperature + "deg F is");
Dấu + trong lệnh trên có tác dụng nh một tác tử nối kết (concatenation
operator), sẽ đặt giá trị của biến temperature và chuỗi deg F is kề nhau.
Tuy rằng xuất dữ liệu trong Java đợc thực hiện một cách dễ dàng, việc vào dữ liệu
(input) không hẳn cũng đơn giản nh thế. Java không cung cấp một phơng thức đơn giản
nào để nhận dữ liệu khi nó đợc gõ vào bởi một ngời ngồi trớc bàn phím máy tính. (Thực
ra, có những cách nhận dữ liệu input đơn giản từ ngời sử dụng trong các Applet mà bạn
sẽ đợc thấy ở chơng III.) Để đơn giản hóa vấn đề, chúng ta đã viết những phơng thức để
nhận dữ liệu từ bàn phím. Chúng ta sẽ sử dụng phơng thức Keyboard.readInt() để
nhận một số nguyên là giá trị đợc gõ vào từ bàn phím; sử dụng phơng thức
Keyboard.readDouble() để nhận một số thập phân. Bạn sẽ không thể hiểu đợc mã của
các phơng thức này cho tới khi bạn biết thêm nhiều điều về Java; mã đầy đủ của chúng
đợc cho ở phụ lục D.7.
Dòng mã:
temperature = Keyboard.readInt();
sẽ khiến chơng trình dừng lại và đợi ngời sử dụng gõ một số từ bàn phím rồi sau
đó gán số đọc đợc cho biến temperature. Đơng nhiên, trớc khi nhận dữ liệu, chúng ta
có một lời mời (prompting) tới ngời sử dụng:
System.out.print("Please type the temperature (deg F): ");
Biến và các điều lệnh gán
Chúng ta tiếp tục với chơng trình nhiệt độ ở trên.

Dòng mã:
int temperature;
sẽ mô tả rằng temperature là một biến (variable). Các biến có tầm quan trọng
mang tính quyết định trong lập trình máy tính, vì thế chúng tôi sẽ dành chút thời gian
để giải thích về bản chất của chúng và cách mà chúng đợc sử dụng.
Abstract boolean break byte case cast
Catch char class const continue default
Do double else extends false final
Finally float for future generic goto
If implements import inner instanceof int
Interface long native new null operator
Outer package private protected public rest
Return short static sure switch synchronized
This throw throws transient true try
Var void volatile while
Bảng 2.1: Các từ khoá trong Java.
Một biến nh temperature có thể đợc xem nh một thùng chứa (container) chứa
một giá trị nào đó. Sự mô tả (declaration) tạo ra thùng chứa này; vì vậy, tất cả các biến
đều phải đợc mô tả (trớc khi chúng có thể đợc sử dụng.) Ban đầu - chỉ sau khi đợc mô tả
- biến là thùng chứa rỗng, và việc in giá trị của nó là phạm một sai lầm (Tất nhiên, về
kỹ thuật, nó chứa một cái gì đấy, song bạn sẽ không tin tởng vào việc sử dụng giá trị
này.) Chẳng bao lâu nó sẽ đợc chứa một giá trị bằng một điều lệnh gán (assigment
statement), là dòng mã chứa tên biến, một dấu bằng (=) và một biểu thức. Chẳng hạn,
sau điều lệnh gán:
temperature = 32
Biến temperature sẽ chứa gía trị 32.
Các biến có thể thay đổi gía trị của chúng qua những điều lệnh gán, song chúng
luôn luôn chứa đúng một giá trị đích xác nào đó. Bởi vì các điều lệnh trong chơng trình
đợc thực thi liên tiếp nhau (one - by - one), nên nội dung của các biến vẫn đợc giữ
nguyên trừ khi chúng bị thay đổi bởi một điều lệnh gán. Vì lý do này, nội dung của biến

là giá trị đợc gán bởi điều lệnh gán gần nhất thay đổi giá trị của nó.
Chúng ta có thể mô tả hai biến trên cùng một dòng:
int fahrTemp, centTemp;
Từ khoá int trong mô tả chỉ ra rằng các biến chỉ chứa thành phần số nguyên
(không có phần thập phân). Đó là một tên kiểu (type name). Các biến đợc mô tả bằng
một tên kiểu theo sau là tên biến.
Không phải tất cả các tên biến đều hợp lệ. Chẳng hạn, có một lỗi trong mô tả sau:
int 4.5;
bởi vì 4.5 không phải là một tên biến đúng quy tắc. Tơng tự:
int !% ;
cũng là mô tả không hợp lệ.
Kiểu dữ liệu và biểu thức dữ liệu
Lớp, phơng thức, đối tợng
Một kiểu quan trọng của các giá trị dữ liệu, phân biệt với các giá trị đơn giản nh
integer, double, và character, đợc gọi là các đối tợng (object). Các đối tợng có mối
quan hệ chặt chẽ với các lớp (class). Những khái niệm phức tạp về lĩnh vực này sẽ đợc
bàn luận chi tiết ở chơng V. Tuy nhiên, cấu trúc của Java không cho phép bạn bỏ qua
tính năng này dù chỉ trong những chơng trình hết sức đơn giản. Vì vậy một giới thiệu
tóm tắt về đối tợng và những vấn đề liên quan thiết nghĩ là cần thiết. Mục đích của
chúng ta ở đây là củng cố hơn nữa các khái niệm về lập trình hớng đối tợng đã đợc đề
cập ở chơng I và nắm đợc một vài ký hiệu của Java. Đừng lo lắng nếu bạn không thể
hiểu hết mọi phơng diện.
Chúng ta đã biết đến khái niệm lớp . Mỗi chơng trình mà chúng ta đã viết là một
lớp. Các chơng trình này, đơng nhiên là đang còn rất đơn giản, đều chứa một lớp (nhắc
lại rằng dòng cuối cùng của chơng trình chứa một dấu ngoặc đóng (}) để kết thúc lớp).
Nói chung, một chơng trình Java (ứng dụng hay Applet) bao gồm nhiều lớp. Trong tr-
ờng hợp các ứng dụng, một (và chỉ một) lớp phải chứa phần định nghĩa phơng thức
main.
Chúng ta sẽ viết các chơng trình đa lớp (multi-class) trong chơng V. tuy nhiên,
nắm đợc các khái niệm lúc này là rất cần thiết, bởi vì Java cung cấp cho chúng ta một

tập các lớp vô cùng hữu dụng; để sử dụng chúng, chúng ta cần hiểu đợc một vài khía
cạnh của lớp.
Mỗi lớp C định nghĩa một tập các giá trị đợc gọi là các đối tợng kiểu C, hoặc đơn
giản hơn, các đối tợng C. Bạn mô tả các biến chứa các đối tợng C cũng giống nh khi bạn
mô tả các biến của các kiểu dữ liệu quen thuộc khác. Chẳng hạn:
C u, v, w;
mô tả u, v, w là các biến kiểu C.
Nếu C và D là hai lớp khác nhau, các đối tợng của chúng có kiểu khác nhau, và
Java, nh thờng lệ, luôn kiếm chuyện với những kiểu gán ghép không đúng luật. Chẳng
hạn, nếu bạn mô tả một biến kiểu D:
D t;
Khi đó câu lệnh gán sau là không hợp lệ:
u = t;
t = u;
Các đối tợng (của bất kỳ một lớp nào) đợc phân biệt với các kiểu dữ liệu đơn giản,
vì thế câu lệnh gán u = 10 cũng gây ra một lỗi.
Khi một biến kiểu C đợc mô tả, nh lệ thờng một thùng chứa rỗng đợc tạo ra. Bạn
có thể tạo một đối tợng C thực sự bằng cách sử dụng toán tử new:
u = new C(các tham số);
Sau new là tên lớp và các tham số (số tham số và kiểu tơng ứng là phụ thuộc vào
lớp). Câu lệnh này tạo một đối tợng mới và kích hoạt một phơng thức gọi là phơng thức
kiến tạo (constructor) của lớp để khởi đầu cho đối tợng. Đó là cách duy nhất để khởi tạo
các đôí tợng.
Nếu u là một đối tợng kiểu C, bạn sẽ thờng thấy các phơng thức đợc áp dụng cho
u sử dụng một dấu chấm phân cách: u.method( ). Không giống nh đa số các lời gọi
phơng thức, ở đây tất cả các tham số đợc đặt trong dấu ngoặc đơn, với một dấu chấm
phân cách giữa tên lớp và tên phơng thức. Điều này làm gợi nhớ lại cách truy vấn lũ
chuột của chúng ta, speedy.tellMove. Các phơng thức nh vậy đợc gọi là các phơng
thức thể hiện (instance method).
Tuy nhiên không phải lúc nào việc áp dụng phơng thức cho các đối tợng cũng sử

dụng dấu chấm phân cách bạn cũng sẽ gặp những lời gọi với cú pháp thông thờng.
Khi mô tả một phơng thức mới, đồng thời chúng ta cũng chỉ ra cách mà nó đợc gọi có
sử dụng dấu chấm phân cách hay không. Xem chơng 4 để biết thêm chi tiết.
Chẳng hạn, bạn sẽ thấy trong chơng III, một Applet tạo ra một đối tợng có kiểu
TextField. TextField là một lớp đợc cung cấp cùng với trình biên dịch Java; các đối
tợng của nó nh là những khu vực hiển thị trên màn hình để gõ văn bản vào. Khi kiến tạo
một đối tợng kiểu này, tham số là chiều rộng của trờng văn bản (theo số ký tự):
TextField name = new TextField(20);
Một trong những phơng thức của TextField sử dụng dấu chấm phân cách là
setText, đợc dùng để điền văn bản vào đối tợng. Chẳng hạn, nếu bạn muốn thiết lập
đối tợng name một giá trị đặc biệt nào đó, có lẽ là một gía trị mặc định để ngời sử dụng
chấp nhận hoặc thay đổi, bạn có thể viết:
name.setText("Trinh Dang Giang");
Một cách khác, nhng không thông dụng bằng là dùng dấu chấm phân cách để
nhận về một giá trị nh là một thành phần của đối tợng. Chẳng hạn, Java cung cấp một
lớp gọi là Dimension, mà các đối tợng của nó tợng trng cho kích cỡ (size) của các hình
thù (shape) hai chiều. Một kích cỡ nh vậy bao gồm chiều rộng và chiều cao. Mỗi đối t-
ợng Dimension chứa các giá trị width và height (kiểu int) mà chúng ta có thể nhận
đợc sử dụng một dấu chấm phân cách. Về mặt kỹ thuật, các giá trị này đợc gọi là các
biến thể hiện (instance variable) của Dimension, do mối đối tợng kiểu Dimension đều
có chúng; chúng tôi sẽ giải thích về các biến thể hiện trong chơng V.
Lớp String
Một lớp quan trọng, đặc biệt hữu dụng và là thành phần của hệ thống Java, đó là
lớp String. Thứ nhất, không nh tất cả những lớp khác, ở đó các đối tợng chỉ có thể đợc
tạo ra bằng cách sử dụng new, các đối tợng String đợc tạo theo cách viết String nh
thông thờng một chuỗi các ký tự đợc bao bởi hai dâú nháy kép nh chúng ta đã
từng vài lần sử dụng. Thứ hai, có một toán tử có thể đợc dùng trên các đối tợng String,
đó là toán tử +. Nếu t1 và t2 là những xâu (string), thì t1 + t2 là xâu viết liên tiếp
t1 rồi đến t2:
String t1 = "To be",

t2 = "or not to be.";
System.out.print(t1 + t2); // To be or not to be.
Thực ra chúng ta đã từng sử dụng toán tử ghép chuỗi (concatenation) này trong
một vài các điều lệnh print trớc đây. Nếu n là một biến int, t1+n sẽ chuyển đổi n
thành một chuỗi rồi ghép nối hai chuỗi với nhau (đây là một trờng hợp khác mà ở đó
Java không kén cá chọn canh giữa những kiểu dữ liệu khác nhau nh thờng lệ).
Các xâu cũng có những phơng thức khác, chẳng hạn nh length, có sử dụng dấu
chấm phân cách, trả về một số nguyên là số lợng các ký tự trong xâu (kể cả dấu cách).
Chúng tôi đã nhấn mạnh về
Phơng thức lớp và biến lớp
Nhắc lại rằng lớp Mouse trong chơng I cho phép có những phơng thức lớp, nh
Mouse.howManyLeg(). Đó là những phơng thức không liên kết với một đối tợng cụ thể
nào, mà là với tất cả các đối tợng Mouse nói chung. Tơng tự nh vậy, nhiều lớp định
nghĩa sẵn của Java cung cấp những phơng thức lớp. Một ví dụ là phơng thức parseInt;
đó là một phơng thức lớp của lớp Integer (Bạn không đợc nhầm lẫn với kiểu nguyên
thuỷ int, mặc dù cả hai đều liên quan tới các số nguyên mà chúng ta đã biết.) Chú ý
dạng mà chúng ta kích hoạt phơng thức này, Integer.parseInt(). Cách sử dụng dấu
chấm phân cách ở đây hoàn toàn khác với khi sử dụng để kích hoạt các phơng thức lớp:
Integer là một lớp chứ không phải là một đối tợng.
Cũng giống nh việc các đối tợng có các liên kết với các gía trị gọi là biến thể hiện
(nh width và height trong các đối tợng Dimension), các lớp có các liên kết với các
giá trị gọi là biến lớp. Các phơng thức lớp và các biến lớp không quan trọng bằng các
phơng thức thể hiện và các biến thể hiện, vì vậy chúng tôi sẽ giải thích đầy đủ về chúng
trong chơng VIII.
Về ký hiệu .
Tóm lại, mỗi lớp có một tập các đối tợng liên quan. Các đối tợng mới đợc tạo ra
bằng cách sử dụng toán tử new.
Mỗi đối tợng o có một tập các phơng thức xác định (các phơng thức thể hiện) và
một tập các biến xác định (các biến thể hiện). Gọi phơng thức meth bằng cách viết
o.meth(các tham số); nhận một gía trị của biến ivar bằng cách viết o.ivar.

Hoàn toàn tơng tự, các lớp cũng có các phơng thức riêng (các phơng thức lớp) và
các biến riêng (các biến lớp) của mình. Gọi phơng thức cmeth bằng cách viết
C.cmeth(các tham số); nhận giá trị của biến cvar bằng cách viết C.cvar. Chú ý rằng
trong các lời gọi này, C thực sự là một lớp, chứ không phải là một đối tợng, vì vậy một
phơng thức lớp có thể đợc gọi hay một biến lớp có thể đợc sử dụng ngay cả khi không
có một đối tợng nào của lớp đợc tạo ra.
Các kiểu mẫu (prototypes)
Khi trình diện các phơng thức mới, thật là có ích khi bạn định danh kiểu của các
tham số và giá trị trả về, cũng nh chỉ ra rằng đó là phơng thức thể hiện hay phơng thức
lớp. Với kiểu mẫu cho các phơng thức lớp, chúng ta sử dụng một dấu chấm phân cách
giữa tên lớp và tên phơng thức, nh khi dùng để kích hoạt chúng. Chẳng hạn:
int Integer.parseInt(String s)
là kiểu mẫu cho phơng thức parseInt. Nó cho chúng ta biết rằng parseInt là
một phơng thức lớp của lớp Integer, có một tham số kiểu String, và trả về một giá trị
int (gọi là kiểu trả về của phơng thức).
Các điều lệnh (Statements)
Chúng ta biết rằng các chơng trình chứa các mô tả biến và các điều lệnh thực thi.
Chúng ta cũng đã biết các điều lệnh thực thi gán những giá trị mới cho các biến (các
điều lệnh gán), cũng nh các điều lệnh xuất dữ liệu.
Các chơng trinh Java luôn luôn bao gồm các điều lệnh đợc thực thi liên tiếp nhau
(one after another). Có rất nhiều điều lệnh hơn là những điều lệnh mà chúng ta đã biết.
Chẳng hạn,
Tổ chức chơng trình
Gỡ rối
Cuộc hành trình tới lâu đài thông thái
Thật đơn sơ và giản dị quá chừng:
Bao khó khăn làm ta vấp ngã
Mỗi bậc thềm bỏ lại ở sau lng.
Piet Hein
Grooks

Bây giờ chúng ta phát triển một chơng trình từ điểm xuất phát.
Chơng III Applet
Hầu hết những độc giả của cuốn sách này đều quen thuộc với World Wide Web.
Bạn dùng nó mỗi khi sử dụng một trình duyệt Web, nh NCSA Mosaic, Netscape
Communicator,IE,Các trình duyệt đa bạn tới thăm những trang home page (còn gọi là
Web page) đựơc cài đặt bởi những ngời sử dụng khác trên những máy tính khác trên
Web. Những trang này chứa các văn bản và hình ảnh, và đôi khi, cả âm thanh và hình
ảnh sinh động. Máy tính cung cấp những home page gọi là máy chủ (server), hoặc http
server, cho hypetext transport protocol server. Máy tính của bạn là máy khách (client),
mặc dù, có thể nó đồng thời là máy chủ của những máy khách khác. Mỗi home page có
một địa chỉ, chỉ ra server mà nó đợc định vị và nơi đợc định vị trên server. Địa chỉ này
gọi là URL (uniform resource locator).
Các home page đợc viết bằng một ngôn ngữ gọi là ngôn ngữ đánh dấu liên văn
bản (HTML), là ngôn ngữ không giống Java một chút nào. Các trang HTML đợc viết
trong một file giống nh các chơng trình Java. Chúng không đợc biên dịch, song khi một
máy tính trên Web yêu cầu một tài liệu HTML, nó nhận đợc văn bản trên file và dùng
nó để tạo ra hình ảnh trên bộ hiển thị của trình duyệt. Trong phần sau, chúng tôi cung
cấp cho bạn một tour nhanh về ngôn ngữ này, đủ để bạn có thể tạo một home page đơn
giản với văn bản và hình ảnh.
HTML
Chúng tôi sẽ hớng dẫn bạn cách viết những tài liệu HTML đơn giản với văn bản
và hình ảnh. Nếu cảm thấy thích thú với ngôn ngữ này, bạn có thể tìm đọc một cuốn
sách chuyên về lập trình HTML, hoặc xem nguồn của các trang Web mà bạn lớt qua.
Tất cả các trình duyệt đều cung cấp một cách để làm việc này.
Trang Web đơn giản nhất chỉ chứa văn bản. Sau đây là một ví dụ:
1. <HTML>
2. <HEAD>
3. <TITLE> My first home page </TITLE>
4. </HEAD>
5. <BODY>

6.
7. My name is Napoleon I, Emperor of France.
8. Im just learning HTML, so please be patient.
9.
10. </BODY>
11. </HTML>
hinh 3.1
Hình 3.1 mô tả việc hiển thị tài liệu HTML của trình duyệt Internet Explorer.
Applet và thẻ APPLET
Giả dụ nh bạn muốn cung cấp một trò chơi video đơn giản trên Internet. Bạn tự
nguyện làm mọi việc và cung cấp một trò chơi thú vị dành cho tất cả mọi ngời. Trên
thực tế, bạn chỉ có thể hỗ trợ trò chơi của mình cho những ngời có khả năng truy cập
trang Web của bạn. Nhng làm thế nào ? Bạn có thể cung cấp nó nh là một file khả chạy
(executable); sau đó những ngời sử dụng phải tải file này xuống lu trong đĩa của họ và
thoát khỏi trình duyệt để chạy chơng trình. Hơn nữa, nhiều ngời sẽ không cảm thấy
hứng thú lắm với những kho virut đầy rẫy trên Internet. Giải pháp hay ho nhất là bạn
hãy cung cấp trò chơi nh là một phần trang Web của bạn, song lại không có cách nào để
viết trò chơi bằng HTML.
Đó là chỗ của Java. Java có thể đợc sử dụng để viết các applet, là những chơng
trình máy tính chạy trên cửa sổ của một trang Web.
Hello!
Chơng trình Java cho một Applet luôn có một dạng đặc biệt. Bạn sẽ nhận thấy
rằng các chơng trình ứng dụng và các Applet không thực sự khác nhau nhiều lắm. Tuy
nhiên, chúng đòi hỏi một số sự thay đổi và vì vậy, trong những Applet nhỏ bạn có thể
thấy chúng hơi lạ mắt một chút.
Cũng giống nh các ứng dụng, một Applet có tên trùng với tên của file chơng trìng
chứa nó (ngoại trừ phần mở rộng .java). File này chứa một lớp với tên đã đợc chỉ ra.
Tuy nhiên, lớp này không có một phơng thức main, thay vào đó là một phơng thức init
và những phơng thức khác.
Ví dụ đầu tiên của chúng ta là HelloApplet, có nhiệm vụ viết dòng chữ Hello! ở

giữa cửa sổ Applet.
1 import java.awt.*;
2 import java.applet.*;
3 import java.awt.event.*;
4 public class HelloApplet extends Applet
5 {
6 public void init()
7 {
8 add(new Label("Hello!"));
9 }
10 }
Rõ ràng có một số khác biệt so với chơng trình Hello trớc đây:
Các dòng 1, 2 và 3 là hoàn toàn mới. Sau này bạn sẽ thấy chúng sẽ luôn đ-
ợc bao hàm vào theo cách nh vậy.
Dòng 4 có các từ mới là extends Applet. Hai từ này luôn phải đợc bổ
sung vào sau tên của Applet. Xem chơng 12.
Không có phơng thức main mà chỉ có phơng thức init. Luôn luôn phải
nh vậy (Mặc dù chúng ta thờng thấy có cả những phơng thức khác nữa).
Thay cho lời gọi phơng thức System.out.println là dòng lệnh add(new
Label("Hello!")). Lable là một lớp đợc cung cấp cùng với trình biên
dịch Java. Dòng lệnh này tạo một đối tợng mới kiểu Label và bổ sung nó
vào Applet, vì vậy sẽ đợc hiển thị trên cửa sổ Applet.
Java API
Trong chơng II, chúng ta đã biết rằng Java đến cùng với những phơng thức đã đợc
định nghĩa sẵn nh println(String s) và Math.sqrt(double d). Chúng ta lại vừa
mới thấy thêm hai ví dụ nh vậy nữa: lớp Label và phơng thức add. Các lớp và phơng
thức đợc cung cấp cùng với trình biên dịch Java (hay bất kỳ trình biên dịch của bất kỳ
ngôn ngữ nào) đợc gọi là giao diện lập trình ứng dụng (API Application
Programming Interface). Trong mọi trờng hợp, chúng đợc cung cấp để hỗ trợ cho việc
lập trình các chơng trình ứng dụng và các Applet.

Java API gồm có một tập hợp rất lớn các lớp (vài trăm), mỗi lớp với nhiều phơng
thức, một số các giao diện (interface) và ngoại lệ (exception). Tất cả chúng đợc tổ chức
trong các gói (package). Hiện nay (1998 ngời dịch) Java API bao gồm khoảng hơn
20 gói. Chúng bao gồm các lớp và phơng thức để làm mọi chuyện từ việc sinh số ngẫu
nhiên tới việc tải các file âm thanh và truy cập các site trên Internet. Tuy nhiên, chúng
ta chỉ sử dụng một số nhỏ các gói này (Mà trên thực tế chỉ là bốn gói java.applet,
java.awt, java.awt.event và java.lang.) Ba trong bốn gói này đã xuất hiện trong
điều lệnh import trong chơng trình của chúng ta. Các điều lệnh import này đợc mô tả
để chỉ ra rằng tất cả các lớp trong các gói này là sẵn có cho chơng trình của chúng ta.
Ba gói này chứa mọi thứ cần thiết cho tất cả các Applet trong cuốn sách này, vì thế chỉ
cần ba điều lệnh import nh trên là đủ cho mọi Applet.
Có một nguyên nhân giải thích tại sao chúng ta không cần sử dụng điều lệnh
import cho gói java.lang. Đây là gói duy nhất đợc nhập tự động vào tất cả các chơng
trình Java; việc viết điều lệnh import java.lang.* là không cần thiết. Gói này chứa
những lớp nh Math và String, là những lớp cơ bản mà mọi ngời thờng xuyên sử dụng,
bất kể khi viết một chơng trình ứng dụng hay một Applet.
Bản thân gói java.applet chứa lớp Applet , là lớp đợc tham chiếu tới trong
cụm từ extends Applet. Cụm từ này biểu thị rằng lớp đợc định nghĩa cho Applet (nh
HelloApplet) là một lớp con (subclass) của lớp Applet. Điều này sẽ đợc giải thích ở ch-
ơng 12. Tất cả vấn đề bây giờ là nó cho phép chúng ta sử dụng một phơng thức Applet:
add.
Gói java.awt lại là chuyện khác. Nó chứa nhiều lớp rất hữu dụng cho những
Applet của chúng ta. Awt là viết tắt của abstract windowing toolkit (Bộ công cụ cửa sổ
trừu tợng). ở đây chúng ta cần làm quen với một thuật ngữ mới là giao diện đồ hoạ ngời
sử dụng (GUI graphical user interface). Các GUI nh button, menu, text,mà mỗi
trong chúng có một lớp liên quan. Chẳng hạn, lớp Button; một button đợc định vị trên
một Applet bằng cách tạo một đối tợng Button và bổ sung vào Applet. Ví dụ, bạn sẽ bổ
sung các button Yes và No vào một Applet bằng các dòng mã sau trong phơng thức
init:
Button yesButton = new Button("Yes");

Button noButton = new Button("no");
Add(yesButton);
Add(noButton);
Bảng 3.1 liệt kê một vài lớp trong gói java.awt. Mỗi lớp đại diện cho một
kiểu thành phần của một GUI. Hầu hết các thành phần này đều làm đợc nhiều thứ hơn
là việc chỉ xuất hiện vô bổ trên cửa sổ Applet của bạn. Click vào một button hay gõ dữ
liệu vào một trờng văn bản (text field) sẽ làm nảy sinh một số công việc (sự kiện). Và
đó là chỗ cho gói java.awt.event. Các lớp trong gói này định nghĩa nhiều loại sự kiện
khác nhau, nh là sự kiện khi ngời sử dụng click trên một button. Ví dụ tiếp sau của
chúng ta sẽ sử dụng các button và trờng văn bản.
Lớp Ví dụ ý nghĩa
TextField new Textfield(10)
Tạo một trờng văn bản khả
soạn thảo với độ rộng 10
ký tự.
Button new Button("push me")
Tạo một button với nhãn
push me.
Label new Label("intro") Tạo một nhãn intro
Bảng 3.1: Một số lớp trong gói java.awt.
Trình appletviewer
Trớc khi bắt đầu với Applet tiếp theo, chúng tôi cần ghi chú một chút về cách mà
chúng ta sẽ dùng để thực thi các Applet. Kể từ bây giờ trở đi, chúng ta sẽ không chạy
các Applet trong những trang Web mà sử dụng một chơng trình gọi là appletviewer.
Đó là một trình duyệt chuyên dụng chỉ hiểu một số nhỏ các tài liệu HTML văn bản
và các thẻ APPLET. Tài liệu HTML đơn giản này (TempApplet.html) dùng để hiển thị
Applet TempApplet (Xem mã của Applet này ở phần sau.)
<HTML>
<HEAD>
<TITLE>Temperature conversion!</TITLE>

</HEAD>
<BODY>
<APPLET CODE = "Temperature.class" WIDTH = 300 HEIGHT =
100></APPLET>
</BODY>
</HTML>
Nếu bạn đang sử dụng một môi trờng phát triển tích hợp (IDE), nh Javas
WorkShop, bạn không cần phải lo việc soạn thảo ra các file HTML này, IDE sẽ tự động
làm giúp bạn. Bạn chạy applet của mình bằng dòng lệnh sau:
appletviewer TempApplet.html
Add(yesButton);
Việc dùng trình appletviewer sẽ làm giảm thời gian và bộ nhớ hơn so với sử
dụng một trình duyệt. Kể từ bây giờ chúng ta sẽ luôn hiển thị các Applet bằng tiện ích
này. Chúng tôi không cần chỉ ra các tài liệu HTML tơng ứng với các Applet mà chỉ
cung cấp các thuộc tính HEIGHT, WIDTH trong các thẻ APPLET mà chúng tôi sử dụng,
để bạn có thể chắc chắn rằng các Applet của bạn trông giống nh những hình minh hoạ
trong cuốn sách này.
Về sơ lợc, các thủ tục để viết và chạy một Applet có thể tóm tắt nh sau (giả sử tên
của Applet là GreatFun)
1 Viết Applet. Trong một file có tên GreatFun.java, viết các điều lệnh
import và sau đó định nghĩa lớp GreatFun. Lớp này phải có một phơng
thức init.
public void init () ( )
và các phơng thức khác nếu cần thiết.
2 Biên dịch Applet bằng câu lệnh:
javac GreatFun.java
Một file gọi là GreatFun.class đợc tạo ra (nếu bạn đang sử dụng một
IDE, thủ tục này có khác một chút).
3 Để file GreatFun.class trong cùng th mục với home page của bạn.
4 Bổ sung cặp thẻ sau vào home page của bạn:

<APPLET CODE = "GreatFun.class" WIDTH = integer HEIGHT =
integer>
</APPLET>
Bây giờ, Applet của bạn sẽ đợc chạy mỗi khi có khách hàng thăm home page
Việc sử dụng trình appletviewer để chạy các Applet của bạn có u điểm là bạn
có thể tái tải (reload) các Applet. Nếu Applet bị hỏng, bạn có thể thay đổi nó và biên
dịch lại, sau đó chọn Reload trên menu Applet trong cửa sổ appletviewer.
Temperature Applet
Chơng trình nguồn TempApplet.java.
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class TempApplet extends Applet implements ActionListener
{
TextField tFahr;
Label lCent;
public void init()
{
tFahr = new TextField(10);
lCent = new Label("Ill tell you what that is in C");
// Tổ chức ba thành phần
add(new Label("Please type the temperature (deg F):"));
add(tFahr);
add(lCent);
tFahr.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
double fahr = 0.0,
cent = 0.0;

fahr = Integer.parseInt(tFahr.getText());
cent = 0.5 * (fahr -32) / 9.0;
lCent.setText(fahr + " deg F is " + cent + " deg C.");
}
}
Sö dông ®å häa trong Applet
C¸c thµnh phÇn (Components)
KÝch thíc
Mµu
Chơng IV tạo quyết định
Điều lệnh if
Các chơng trình thờng phải quyết định thi hành giữa một số các hành động khác
nhau. Chẳng hạn, việc tính thuế bảo hiểm xã hội đợc tính theo 12,4 phần trăm thu nhập,
nếu thu nhập không vợt quá $57.600, theo công thức sau:
Công thức này có thể biểu diễn bằng cú pháp Java nh sau:
If (wages <= 57600)
tax = 0,124 * wages;
else
tax = 0,124 * 57600;
Khi chơng trình thực thi, gía trị của wages đợc đem so sánh với 57600. Nếu giá
trị của wages bé hơn hoặc bằng gía trị 57600, điều lệnh tax = 0, 124 * wages đợc
thực hiện. Nếu giá trị của wages lớn hơn giá trị 57600, điều lệnh tax = 0,124 *
57600 đợc thực hiện. Chú ý rằng chỉ có một lệnh gán đợc thực thi mà thôi.
Công thức nói trên đợc chèn vào ứng dụng hoàn thành dới đây:
1 class SocialSecurity
2 {
3 static final double
4 MAXIMUM_WAGE = 57600,
5 TAX_RATE = 0,124;
6 public static void main(String[] args)

7 {
8 double wages,
9 tax;
Thuế =
0,124 x l ơng, nếu l ơng $57600.
0,124 x $57600, ng ợc lại.
10 System.out.print ("Đơn vị tính thuế: $");
11 wages = Keyboard.readInt();
12 if (wages <= MAXIMUN_WAGE)
13 tax = TAX_RATE * wages;
14 else
15 tax = TAX_RATE * MAXIMUM_WAGES;
16 System.out.print ("Bảo hiểm xã hội của bạn là: $" + tax);
17 }
18 }
Một điều lệnh if chọn một trong hai phơng án thi hành dựa trên một điều kiện
đúng/sai nào đó. Điều lệnh if là một điều lệnh Java đơn đợc chia thành hai phần khác
nhau từ khoá if tiếp theo là một điều kiện đợc đặt trong dấu ngoặc đơn và điều lệnh
sẽ đợc thực thi nếu điều kiện là đúng; từ khoá else đợc đặt tiếp theo cùng với điều lệnh
sẽ đợc thực thi nếu điều kiện là sai:
if (diều kiện)
điều lệnh (cho phơng án thì)
else
điều lệnh (cho phơng án ngợc lại)
Mỗi phơng án có thể là một điều lệnh đơn hoặc một điều lệnh phức hợp đợc bao
trong cặp dấu ngoặc { }. Chỉ có một phơng án chọn lựa đợc thực thi; phơng án còn
lại sẽ đợc bỏ qua. Nếu không có điều gì cần làm trong phơng án else, từ khóa else
có thể vắng mặt.
if (điều kiện)
điều lệnh (cho phơng án thì)

Ví dụ, kết quả của điều lệnh:
If (age >= 18)
System.out.println("You are aligible to vote.");
là dòng thông báo:
You are aligible to vote.
sẽ đợc in ra nếu age lớn hơn hoặc bằng 18, còn nếu không (age <18), không có
gì đợc thực thi.
Mối phơng án trong điều lệnh if ở ví dụ tính bảo hiểm xã hội là cực kỳ đơn giản.
Sau đây là một ví dụ về việc dùng các điều lệnh phức hợp trong các phơng án chọn lựa.
Có hai số nguyên dơng, firstNumber và secondNumber, chúng ta sẽ tính thơng và số
d trong phép chia số lớn cho số bé:
if (firstNumber <= secondNumber)
{
quotient = secondNumber / firstNumber;
remainder = secondNumber % firstNumber;
}
else
{
quotient = firstNumber / secondNumber;
remainder = firstNumber % secondNumber;
}
Xây dựng và phân tích các biểu thức
Boolean
Các điều kiện (condition) đợc gọi là các biểu thức Boolean (Boolean
expression). Các biểu thức Boolean đợc thiết lập trong Java bằng cách so sánh các giá
trị bởi các toán tử quan hệ (relational operator Xem bảng 4.1), và kết hợp các giá trị
Boolean bởi các toán tử logic (logical (Boolean) operator Xem bảng 4.2). Chẳng hạn,
chúng ta có thể xây dựng một điều kiện phức tạp nh:
(MINIMUM_WAGE <= wages) && (wages <= MAXIMUM_WAGE)
có nghĩa là

MINIMUM_WAGE wages MAXIMUM_WAGE
Các toán tử quan hệ có ý nghĩa toán học của chúng, còn các toán tử logic cần một
vài giải thích. Toán tử ! đặt trớc một biểu thức Boolean thực hiện phần bù cho gía trị của
biểu thức đó. Toán tử && kết hợp hai biểu thức Boolean và chỉ đúng (true) trong trờng
hợp cả hai biểu thức đều đúng. Toán tử ||, một cách tơng tự, chỉ sai (false) trong trờng
hợp cả hai biểu thức đều sai.

×