II.1 Khỏi niệm tớnh đúng gúi
Tớnh đúng gúi thể hiện bởi việc thuộc tớnh mụ tả đối tượng và hành vi của đối tượng được gắn chặt với nhau. Thuộc tớnh thể hiện trạng thỏi đối tượng, hành vi làm thay đổi trạng thỏi đối tượng thụng qua việc thay đổi giỏ trị cỏc thuộc tớnh.
Thuộc tớnh được cài đặt thụng qua mó lệnh Java bằng cỏc biến thành phần trong lớp. Hành vi được cài đặt thụng qua mó lệnh Java bởi cỏc phương thức.
Thụng tin và hành vi đối tượng được bảo vệ bằng cỏc cấp độ truy cập: public, private. Cấp độ public cho phộp sự truy cập từ bờn ngoài lớp trong khi private chỉ cho phộp nội bộ lớp truy cập.
Đối tượng được sinh ra bởi class - một sự mụ hỡnh húa một lớp đối tượng trong thực tế. object = attributes (cỏc thuộc tớnh) + operations(cỏc hành vi) + name (tờn định danh) Như vậy tớnh đúng gúi thể hiện việc chuyển mụ hỡnh đối tượng thực tế thành cỏc lớp trong Java.
II.2 Mối quan hệ giữa cỏc class
Cỏc class trong chương trỡnh cú thể quan hệ với nhau theo 1 trong 3 dạng:
Phụ thuộc (Dependence): Class A cú quan hệ phụ thuộc với class B nếu phương thức của class A cú sử dụng đối tượng thuộc class B.
Bao gồm (Aggregation): Class A cú quan hệ bao gồm với class B nếu đối tượng của class A chứa đối tượng của class B.
Thừa kế (inheritance): Class B gọi là thừa kế class A nếu class B cú cỏc phương thức và thuộc tớnh của class A, ngoài ra class B cũn định nghĩa cỏc phương thức và thuộc tớnh khỏc của riờng nú.
Vớ dụ: Trong hệ thống bỏn hàng chỳng ta cú: class DanhMucMatHang class TaiKhoan class HoaDon class HoaDonThanhToanNhanh
Mỗi HoaDon bao gồm 1 DanhMucMatHang: Quan hệ aggregation.
Khi một HoaDon được tạo ra, nú cần truy cập đến class TaiKhoan để kiểm tra tỡnh trạng thẻ tớn dụng: Quan hệ dependence.
Mỗi HoaDonThanhToanNhanh thừa kế cỏc thuộc tớnh và phương thức của HoaDon và cú thờm cỏc thuộc tớnh, phương thức khỏc: Quan hệ inheritance.
II.3 Một số gợi ý khi thiết kế class
Khai bỏo dữ liệu private: Điều này trỏnh việc truy cập tựy ý từ bờn ngoài lớp
Khởi tạo cho dữ liệu: Cỏc thuộc tớnh nờn được khởi tạo bằng cỏc phương thức constructor khi một đối tượng mới được tạo ra.
Khụng sử dụng quỏ nhiều kiểu dữ liệu cơ bản trong 1 lớp
Khụng phải thuộc tớnh nào cũng cần mutator và accesor: Mỗi thuộc tớnh bao giờ cũng cú một phương thức thiết đặt giỏ trị cho nú gọi là mutator (tiền tố set) và một phương thức lấy ra giỏ trị của nú gọi là accesor (tiền tố get).
Đặt tờn phương thức và thuộc tớnh phản ỏnh theo tớnh chất và nghiệp vụ của nú.
IV. Sử dụng cỏc Class xõy dựng sẵn trong thư viện
Java hỗ trợ cho lập trỡnh viờn một thư viện phong phỳ cỏc lớp đối tượng đó được xõy dựng và thiết kế cẩn thận. Lập trỡnh viờn chỉ cần biết cỏch lấy chỳng ra và sử dụng chỳng theo kịch bản của ứng dụng.
Cỏc gúi thư viện quan trọng của Java 2 bao gồm:
(tham khảo chi tiết tại: http://java.sun.com/j2se/1.4.2/docs/api/overview-summary.html ) Cỏc gúi thường dựng trong Java 2 SE
java.applet Hỗ trợ cỏc class cần thiết cho việc tạo ra cỏc Applet và giao tiếp giữa Applet với mụi trường ngữ cảnh của nú.
java.awt Chứa cỏc lớp dựng để tạo ra cỏc giao diện người dựng và cho cỏc thao tỏc vẽ cỏc hỡnh đồ họa và ảnh.
java.awt.color Cung cấp cỏc lớp cho khụng gian màu.
java.awt.event Cung cấp cỏc giao diện và cỏc lớp cho việc giải quyết cỏc vấn đề về xử lý cỏc sự kiện trờn cỏc thành phần giao diện AWT.
java.awt.font Hỗ trợ cỏc giao diện và lớp liờn quan đến font chữ. java.awt.image Cung cấp cỏc lớp tạo và hiệu chỉnh hỡnh ảnh. java.awt.print Cung cấp cỏc lớp và giao diện cho mục đớch in ấn.
java.beans Chứa cỏc lớp liờn quan tới việc phỏt triển cỏc thành phần (beans) dựa trờn kiến trỳc của Java.
java.io Hỗ trợ cho cỏc thao tỏc vào / ra dữ liệu trờn hệ thống file. java.lang Cung cấp cỏc lớp nền tảng để thiết kế ngụn ngữ lập trỡnh Java.
java.math Hỗ trợ cỏc lớp để thao tỏc và thuật toỏn với cỏc số nguyờn lớn BigInteger và BigDecimal.
java.net Cung cấp cỏc lớp cho việc cài đặt cỏc ứng dụng mạng.
java.rmi Cung cấp cỏc gúi cho lập trỡnh RMI – Remote Method Invocation.
java.security Cung cấp cỏc lớp và giao diện cho việc xử lý cỏc vấn đề an ninh và bảo mật trong Java.
java.sql Cung cấp cỏc hàm API cho việc truy cập vào dữ liệu trong một nguồn dữ liệu – thường là cỏc CSDL quan hệ.
java.text Cung cấp cỏc lớp và giao diện cho việc quản lý text, dates, numbers và cỏc thụng điệp.
java.util Chứa đựng cỏc lớp tiện ớch thuộc nhiều loại khỏc nhau như sinh số ngẫu nhiờn, ngày thỏng,….
javax.crypto Hỗ trợ cỏc lớp và giao diện cho cỏc thao tỏc mó húa dữ liệu. javax.net Cung cấp cỏc lớp cho lập trỡnh mạng.
javax.sql Cung cấp cỏc hàm API cho việc truy cập dữ liệu phớa server.
javax.swing Cung cấp một tập cỏc thành phần được chấp nhận trờn hầu hết cỏc hệ thống mỏy tớnh.
javax.swing.event Hỗ trợ cho cỏc sự kiện kớch hoạt bởi cỏc thành phần của Swing. javax.swing.table Cung cấp cỏc lớp và giao diện làm việc với bảng.
javax.swing.tree Cung cấp cỏc lớp và giao diện làm việc với cõy javax.swing.JTree. javax.xml.parsers Hỗ trợ cỏc lớp cho việc xử lý cỏc tài liệu XML.
Sau đõy là hướng dẫn vớ dụ về sử dụng lớp Date cú sẵn trong thư viện của Java: Khai bỏo biến đối tượng với toỏn tử new
Date myDate = new Date();
Date() là phương thức contructor của class Date. Một đối tượng luụn được tạo ra từ một constructor của lớp đú.
Khai bỏo:
Date myDate;
Xỏc định cho ta một biến đối tượng Date nhưng khụng cho ta một đối tượng Date thực sự vỡ trong thực tế, myDate chưa được cấp phỏt vựng nhớ.
Cõu lệnh:
myDate = new Date();
Xỏc định rằng myDate là một đối tượng thực sự thuộc class Date, ta cú thể ỏp dụng cỏc phương thức và thuộc tớnh của class Date cho myDate.
System.out.println(myDate.getMonth()); // In ra thỏng hiện tại
V. Xõy dựng Class trong Java
Cài đặt cỏc class là cụng việc thường xuyờn của lập trỡnh viờn Java. Cỏc vấn đề của cụng việc thiết kế một lớp bằng ngụn ngữ Java sẽ được đề cập dưới đõy.
V.1 Cấu trỳc của class
[<Cỏch truy xuất>] class <tờn lớp> [extends <tờn lớp cha>] [implements <tờn giao diện>]{ <cỏc thành phần của lớp>; } Ta sẽ lần lượt xem xột từng thành phần: <Cỏch truy xuất>: public: Cú thể truy cập lớp từ cỏc lớp khỏc.
abstract: Lớp trừu tượng, khụng được khởi tạo đối tượng của lớp này. Cỏc lớp trừu tượng được thiết kế chỉ cho mục đớch kế thừa.
final: Khụng cho phộp kế thừa.
Nếu <cỏch truy xuất> khụng được xỏc định, mặc định là public.
<tờn lớp>: Tờn của lớp, nếu <cỏch truy xuất > là public thỡ tờn lớp phải trựng với tờn file
chứa lớp.
<tờn giao diện>: Tờn của giao diện được cài đặt tại lớp. Đõy cú thể là một danh sỏch cỏc
giao diện phõn tỏch bởi dấu “,”.
<cỏc thành phần của lớp>: đõy là phần thõn của lớp chứa cỏc định nghĩa cho cỏc thuộc
tớnh và cỏc phương thức thành phần. Ta sẽ lần lượt xem xột tới cỏc thành phần này.
V.2 Cỏc thuộc tớnh thành phần:
Khai bỏo thuộc tớnh chớnh là việc khai bỏo cỏc biến. Khi khai bỏo trong lớp chỳng thường được xỏc định phạm vi hoạt động là một trong cỏc dạng:
public: Biến cú thể truy cập ở bất cứ lớp nào. private: Chỉ được truy cập trong chớnh lớp đú.
protected: Chỉ được truy cập trong lớp đú và cỏc lớp kế thừa.
Mặc định thỡ phạm vi truy cập của biến là public, cỏc biến thụng thường cú phạm vi private.
Vớ dụ:
public int Tuoi;
private String HoVaTen;
Cỏch truy cập biến rất đơn giản, phụ thuộc vào biến thuộc dạng nào trong 2 dạng sau: 1. Biến cú phạm vi đối tượng: Đõy là biến tồn tại cựng với sự tồn tại của đối tượng. Muốn truy cập vào biến, trước hết phải khởi tạo một đối tượng thuộc lớp.
SinhVien sv = new SinhVien(20,”Nguyen Van A”);
Truy cập vào biến Tuoi như sau: sv.Tuoi, vớ dụ gỏn Tuoi của sinh viờn này bằng 21: Sv.Tuoi=21;
2. Biến cú phạm vi lớp (biến tĩnh): Đõy là biến cú phạm vi tồn tại trong mọi đối tượng của lớp được tạo ra trong chương trỡnh đang chạy. Giỏ trị của biến được dựng chung giữa cỏc đối tượng.
Khi khai bỏo một biến cú phạm vi lớp, ta cần thờm từ khúa static như vớ dụ sau: public static int MaSo;
Khi truy cập, ta cú thể khụng cần khởi tạo đối tượng mà trực tiếp thụng qua tờn lớp: SinhVien.MaSo = 10;
Cỏc biến cú phạm vi lớp rất ớt khi được sử dụng, trong khi cỏc hằng static lại rất hay được dựng. Lý do là trong thực tế, cỏc lớp đối tượng thường cú cỏc thuộc tớnh chung, cố định cú ở mọi đối tượng. Hơn nữa, khi chỳng đó khụng phụ thuộc vào một đối tượng cụ thể nào thỡ ta cũng khụng cần khởi tạo một đối tượng để truy cập. Do đú, ta sẽ cài đặt chỳng như là cỏc hằng static.
Vớ dụ:
public static final String MauDa = “Vang”; // Mọi sinh viờn đều cú màu da là “Vang” hoặc khỏi bỏo hằng số PI:
public static final double PI = 3.14159265358979323846; Là hằng số của lớp Math. Khi truy cập ta chỉ cần gọi: Math.PI
Chỳ ý: Cỏc biến rất ớt khi được khai bỏo là public vỡ cú thể thay đổi giỏ trị của nú bờn ngoài lớp nờn khú quản lý. Trong khi đú cỏc hằng thường luụn được khai bỏo là public vỡ chỳng được dựng chung và khụng thể bị thay đổi do từ khúa final (hằng).
Biến this
Biến this là biến đối tượng của lớp tồn tại ngầm trong mỗi lớp.
Thường dựng biến this để truy cập đến cỏc thuộc tớnh của lớp bị khai bỏo trựng trong phạm vi cỏc phương thức của lớp.
public class TestThis {
private int number = 10; public void PrintNumber()
{ int number =20; // khai bỏo trựng với biến của lớp System.out.println(number); //in bien number = 20
System.out.println(this.number);//in bien number =10 }
}
V.3 Cỏc phương thức thành phần
Phương thức thành phần là sự cài đặt cỏc hành vi của đối tượng. Cỳ phỏp khai bỏo một phương thức trong lớp như sau:
[<Cỏch truy xuất> <cỏch cập nhật>] <Kiểu giỏ trị trả về> <Tờn phương thức>([<danh sỏch biến hỡnh thức>]) [<mệnh đề throws>]
{
<Nội dung của phương thức>; }
<Cỏch truy xuất>:
private: phương thức này chỉ được truy xuất bờn trong lớp chứa nú. public: cú thể truy xuất từ bất kỳ lớp bờn ngoài nào.
protected: chỉ cỏc lớp là dẫn xuất của lớp chứa phương này mới truy xuất được nú. Nếu khụng khai rừ cỏch truy xuất, cỏc phương thức sẽ cú cỏch truy xuất mặc định
là public.
Cỏc phương thức khai bỏo chồng ở lớp dẫn xuất phải cú mức độ truy cập mạnh hơn hoặc giống với mức độ truy cập ở lớp cha.
< Cỏch cập nhật>
static: phương thức tỏc động khụng phụ thuộc vào cỏc đối tượng cụ thể, nú cú thể được gọi mà khụng cần khởi tạo đối tượng của lớp.
abstract: phương thức đơn giản nhất, khụng cài đặt gỡ ở trong lớp khai bỏo nú, tức là nú khụng cú phần thõn. Phương thức này sẽ được phỏt triển trong cỏc lớp là dẫn xuất của lớp chứa nú. Lớp cú chứa phương thức abstract cũng phải được khai bỏo abstract.
final: phương thức này được bảo vệ khụng cho cỏc lớp dẫn xuất khai bỏo và cài đặt lại.
native: là phương thức được viết bằng ngụn ngữ khỏc java.
synchronyzed: đảm bảo dữ liệu khụng bị sai lạc khi cựng một lỳc 2 phương thức truy cập cựng một dữ liệu.
<Kiểu giỏ trị trả về>:
integer, String, char, float, ...: là cỏc kiểu dữ liệu mà phương thức trả về. void: phương thức khụng trả về giỏ trị.
Khi xỏc định kiểu giỏ trị trả về, khi kết thỳc cỏc luồng xử lý trong phương thức nhất thiết phải cú cõu lệnh return để trả về một giỏ trị thuộc kiểu đú.
public static int max(int num1, int num2) {
return num1; else
return num2; }
Về <mệnh đề throws> chỳng ta sẽ xem xột kỹ trong phần xử lý ngoại lệ.
V.4 Gọi và truyền tham số cho phương thức
Cỏc tham số kiểu cơ bản được truyền theo kiểu tham trị.
Cỏc tham số cú kiểu đối tượng được truyền theo kiểu tham chiếu. Cỏc chỳ ý khi truyền tham số cho phương thức:
Cỏc phương thức khụng thể làm thay đổi giỏ trị của cỏc tham số cú kiểu nguyờn thủy
Phương thức cú thể làm thay đổi trạng thỏi của tham số kiểu đối tượng
Phương thức khụng thể làm cho tham số đối tượng tham chiếu tới một đối tượng mới.
Gọi một phương thức:
Cú 2 cỏch gọi phương thức:
Nếu phương thức trả về giỏ trị, việc gọi phương thức thường được xử lý như một giỏ trị. Vớ dụ: int larger = max(3, 5);
hoặc ta cú thể in giỏ trị trả về của cuộc gọi phương thức: System.out.println(max(3, 5)); Nếu phương thức trả về void, việc gọi phương thức là cõu lệnh.
Vớ dụ phương thức println() trả về void: System.out.println("Hello!");
V.6 Cỏc hàm và phương thức đặc biệt
Phương thức khởi tạo:
Phương thức khởi tạo (constructor) dựng để khởi tạo một đối tượng của lớp và đặt trạng thỏi ban đầu cho đối tượng bằng cỏch xỏc định giỏ trị cho cỏc thuộc tớnh của lớp.
Mỗi lớp cú thể cú 1 hoặc nhiều phương thức khởi tạo.
Phương thức khởi tạo cú cựng tờn với tờn lớp và khụng cú kiểu dữ liệu trả về.
Khi khụng khai bỏo phương thức khởi tạo, đối tượng được tạo ra bằng phương thức khởi tạo mặc định với cỏc giỏ trị mặc định của cỏc thuộc tớnh.
Constructor khụng được kế thừa, nú chỉ được định nghĩa cho chớnh lớp cha. Vấn đề sử dụng phương thức khởi tạo của lớp cha trong cỏc lớp dẫn xuất sẽ bàn trong phần “Tớnh thừa kế”
Phương thức hủy:
Trỏi với phương thức khởi tạo, phương thức hủy được gọi khi đối tượng được giải phúng. Tuy nhiờn, trong Java cụng việc này được làm tự động, lập trỡnh viờn khụng cần quan tõm. Trong trường hợp cần thiết ta cú thể khai bỏo phương thức hủy theo cỳ phỏp:
protected void finalize() { // Body of Method }
Hàm main()
Đõy là một hàm đặc biệt được cài đặt trong lớp được gọi thực thi đầu tiờn trong chương trỡnh. Vỡ nú được gọi khi chưa cú đối tượng nào được tạo ra nờn nú luụn được khai bỏo là static. Hơn nữa, việc gọi hàm main() đương nhiờn là diễn ra bờn ngoài lớp nờn nú cũng cần cú mức độ truy cập là public.
Hàm main() cú một tham số là một mảng cỏc chuỗi chứa nội dung cỏc tham số dũng lệnh.
V.7 Khai bỏo chồng cỏc phương thức
Cỏc phương thức trong cựng một lớp cú thể cú cựng tờn nhưng nhất định số lượng cỏc tham số hoặc kiểu của chỳng phải khỏc nhau. Điều này gọi là khai bỏo chồng phương thức.
Từ phiờn bản Java 1.5, kiểu giỏ trị trả về cũng được xem như một yếu tố để phõn biệt cỏc phương thức.
Sau đõy là chương trỡnh vớ dụ về xõy dựng cỏc class trong Java: abstract class People // Lớp trừu tượng
{
protected int Tuoi;
protected String HoVaTen;
public static final String MauDa=”Vang”; //hằng số // Phương thức khởi tạo
public People(int t,String ht) {
Tuoi=t; HoVaTen=ht; }
// Phương thức hiển thị tờn và tuổi của một người public String toString(){
return HoVaTen + "," + String.valueOf(Tuoi); };}
Sau đú, ta cú một lớp SinhVien kế thừa từ lớp People trờn: public class SinhVien extends People
{
private String Lop;
private double DiemTongKet; public static int MaSo; // biến lớp // Phương thức khởi tạo
public SinhVien(int t,String ht,String l,double dtk) {
super(t,ht); // Gọi phương thức khởi tạo của lớp cha cho cỏc thuộc tớnh kế thừa // Cỏc thuộc tớnh khụng kế thừa được gỏn tường minh
Lop = l;
DiemTongKet=dtk; }
// Hàm main
public static void main(String[] argvs) {
// Truy cập vào biến lớp khụng cần khởi tạo đối tượng SinhVien.MaSo=10;