VietNamNet ICom JSC
30/09/2009
Giáo trình JAVA
SMS System for Thong Tan Xa Viet Nam
Contents
Chương 1 7
Các khái niệm cơ sở 7
1. Một chương trình Java đơn giản 7
1.1 Văn bản mã nguồn JAVA của chương trình 7
1.2 Dịch và chạy chương trình 7
1.3 Ví dụ 8
2. Các kiểu dữ liệu nguyên thuỷ và giá trị 8
2.1 Các kiểu số nguyên 8
2.2 Các kiểu số thực 9
2.3 Kiểu kí tự 9
2.4 Kiểu lôgic 10
2.5 String 10
2.6 Các phép toán 11
3. Các lệnh điều khiển 12
3.1 Các câu lệnh rẽ nhánh 12
3.2 Xây dựng vòng lặp 13
4. Mảng 15
4.1 Khai báo và khởi tạo 15
4.2 Sử dụng mảng 16
4.3 Mảng nhiều chiều 16
4.4 Sắp xếp một mảng 16
5. Chuyển đổi kiểu 17
5.1 Ép kiểu – Casting 17
5.2 Chuyển đổi một biến kiểu nguyên thuỷ thành đối tượng và ngược lại 18
Chương 2 19
Phương pháp hướng đối tượng và java 19
1. Các phương pháp xây dựng chương trình 19
1.1 Lập trình hướng thủ tục 19
1.2 Lập trình hướng đối tượng 20
2. Các khái niệm cơ sở của LTHĐT 21
2.1 Lớp – Class 21
2.2 Đối tượng – Object 22
2.3 Trừu tượng hoá dữ liệu và bao gói thông tin 22
2.4 Truyền thông báo - message exchange 23
2.5 Kế thừa – Heritage 24
2.6 Tương ứng bội – polymorphism 25
2.7 Liên kết động - Dynamic binding 25
2.8 Các ưu điểm 25
3. Xây dựng lớp trong java 26
3.1 Các thành phần của lớp 26
3.2 Các biến thành phần 27
3.3 Biến lớp và mô tả static 28
3.4 Phương thức – method 28
3.5 Constructor 30
3.6 Lớp là thành phần của một lớp khác 30
3.7 Tổ chức lớp và tệp chương trình 31
4. Kế thừa và sử dụng lại 32
4.1 Kế thừa trong Java 32
4.2 Xây dựng lớp con 32
4.3 Quan hệ trong kế thừa 33
4.4 Sử dụng lại 33
5. Interface 34
5.1 Khái niệm Interface 34
5.2 Cách xây dựng 34
5.3 Cài Interface vào lớp 34
Chương 3 35
Lập trình ứng dụng Java 35
1. Các loại chương trình JAVA 35
1.1 Lập trình Applet - Applet Programming 35
1.2 Xây dựng ứng dụng độc lập - Application Programming 35
1.3 Xây dựng các JavaBeans 36
1.4 Lập trình phía Server - Servlet Programming 36
2. Xây dựng ứng dụng 36
2.1 Sự khác nhau giữa ứng dụng Dos và ứng dụng Window 36
2.2 Nhập từ bàn phím và xuất ra màn hình 37
2.3 Nhập và xuất qua tệp. 38
3. Xử lí ngoại lệ - Exception 39
3.1 Ngoại lệ và lỗi. 39
3.2 Câu lệnh Try – Catch. 39
4. Tìm hiểu thêm một số lớp. 40
4.1 Lớp Math 40
4.2 Lớp String 40
4.3 Lớp Random. 43
5. Sử dụng gói Utility 43
5.1 Gói java.util 43
5.2 Lớp Vector 43
5.3 Lớp Stack. 44
5.4 Ngày tháng và Lịch. 45
6. Bao gói các kiểu nguyên thuỷ - Wrapped 47
6.1 Các lớp bao gói 47
6.2 Ví dụ minh hoạ 47
Chương 4 49
Truy cập CSDL 49
1. Mở đầu về CSDL 49
1.1 CSDL là gì ? 49
1.2 CSDL quan hệ 49
2. SQL 51
2.1 SQL dùng làm Data Definition Language 51
2.2 SQL dùng làm Data Maintenance Language 52
2.3 SQL dùng làm Data Query Language 54
3. Truy nhập CSDL 54
3.1 ODBC và JDBC Drivers 54
3.2 Tại sao cần JDBC 55
3.3 Các kiểu JDBC driver 55
4. Thiết lập Driver 56
4.1 Tìm hiểu Driver 56
4.2 Lớp DriverManager 56
4.3 Driver Interface 57
4.4 Chương trình DriverApp 57
4.5 Thiết lập kết nối đến CSDL 59
5. Sử dụng JDBC 60
5.1 Thiết lập ODBC Drivers để làm việc với CSDL Microsoft Access 60
5.2. Chương trình AccessApp 60
5.2 Sử dung chương trình AccessApp. 62
5.4 Hoạt động của AccessApp 63
Chương 1
Các khái niệm cơ sở
1. Một chương trình Java đơn giản
1.1 Văn bản mã nguồn JAVA của chương trình
Là tệp văn bản Text, có thể soạn thảo bằng bất cứ bộ soạn thảo văn bản nào.
Quy ước đuôi là .java
Phân biệt chữ IN HOA, chữ thường - Case sensitive.
Có thể xen lẫn các chú thích bằng các cách sau :
- Phần chú thích chỉ ở trên một dòng, bắt đầu từ hai dấu gạch xiên cho đến hết
dòng:
// phần chú thích
- Phần chú thích trên nhiều dòng, giới hạn bằng cặp dấu gạch xiên và dấu sao :
/* các dòng
chú thích */
- Phần tư liệu Javadoc
/** các dòng
tư liệu javadoc */
Quy ước đặt tên
Tên là một dãy kí tự hoặc kí số, phải bắt đầu bằng chữ (letter) hoặc dấu nối dưới
(_), hoặc dấu dollar ($). Tên không được trùng với từ khoá.
Trình biên dịch Javac tự động tạo ra các tên có kí tự dollar ($), do đó nên tránh
dùng kí tự này.
1.2 Dịch và chạy chương trình
Gọi chương trình dịch : javac <tên tệp. java> <tên tệp đích. class>
Dịch từ tệp văn bản TEXT sang tệp mã Byte-code.
Quy ước các tệp mã byte-code (tệp đã dịch) có đuôi .class
Mã byte-code không phải là mã máy. Nó là khái quát hoá, nhằm làm cho chương
trình Java chạy được trên nhiều nền máy khác nhau (portability).
Khi chạy chương trình, JVM - Java Virtual Machine sẽ thông dịch
Cho chạy: java <tên tệp mã byte-code>
Không cần gõ đuôi class
Tên class chính = tên tệp (.java) = tên tệp byte-code( .class)
1.3 Ví dụ
Dưới dây là một chương trình Java đơn giản, chạy trên nền DOS, in ra màn hình
dòng chữ "Hello World !".
class Hello {
public static void main (String[] arguments) {
System.out.println("hello World !");
}
}
Soan thảo tệp văn bản có nội dung trên.
Ghi lại thành tệp Hello.java. Lưu ý phải đúng y như tên lớp Hello, với chữ H in
hoa.
Biên dịch : javac Hello.java
Sẽ tạo thành tệp byte-code Hello.class
Cho chạy : java Hello
2. Các kiểu dữ liệu nguyên thuỷ và giá trị
Java có 8 kiểu dữ liệu nguyên thuỷ. Đó là :
byte, short, int, long, float, double, char, boolean.
2.1 Các kiểu số nguyên
Kiểu byte, short, int, long là các số nguyên 8-, 16-, 32-, 64-bit.
Kiểu Kích
thước
byte
Miền giá trị
Byte
Short
Int
Long
1
2
4
8
-128 127
-32768 32767
-2147483648 2147483647
-
9223372036854775808 92233720368547758
07
Cách viết các giá trị :
Cơ số 10 – decimal – viết thông thường . Long decimal phải kết thúc bằng
l hoặc L .
Cơ số 16 - hexadecimal - phải bắt đầu bằng 0x hoặc 0X,
Cơ số 8 - octal – phải bắt đầu bằng 0.
2.2 Các kiểu số thực
Kiểu Kích
thước
byte
Miền giá trị Chữ số có nghĩa
Float
Double
4
8
+/- 3.4E+38 +/- 1.4 E -45
+/- 1.79 E +308 +/- 4.94 E-
324
6-7
14-15
Kiểu float là số thực 32, phải kết thúc bằng f hoặc F.
Kiểu double là số thực 64-bit, phải kết thúc bằng d hoặc D.
Nếu không có hậu tố f, F thì cũng hiểu mặc định là double.
Một giá trị số thực có thể viết dưới một trong 4 dạng sau :
Ví dụ Quy tắc
12.34E-2 f
.34 E -10 d
123 E +4 f
NaN
<Phần nguyên>. <phần lẻ> < phần mũ> <suffix>
. <phần lẻ> < phần mũ> <suffix>
<Phần nguyên> < phần mũ> <suffix>
Giải thích :
suffix là f, F, d, D như đã nêu trên, có thể vắng mặt.
Phần mũ là chữ cái e hoặc E , dấu + hoặc - và một số nguyên. Có thể có hoặc
không. Bắt buộc phải có nếu dùng dạng thứ 3.
Ví Dụ 1000000.0 = 1.0E6
Giá trị đặc biệt NaN = "not a number," xảy ra khi kết quả của phép toán không
xác định, ví dụ chia cho 0.
2.3 Kiểu kí tự
Kiểu char là kí tự 16-bit Unicode. Unicode 16-bit là tập hợp bao trùm, chứa bộ
mã kí tự ASCII, có thêm nhiều kí tự của các thứ tiếng khác nhau.
Một giá trị kí tự được viết trong dấu nháy đơn (') ví dụ 'A'.
Để thể hiện các kí tự đặc biệt như nháy đơn ('), nháy kép ("), gạch xiên (\) phải
đặt đứng trước một mã thoát là kí tự gạch xiên:
Bảng mã thoát của các kí tự đặc biệt
Mã thoát
Kí tự đặc biệt
\b Backspace
\t Tab
\n Linefeed
\f Form feed
\r Carriage return
\" Double quote
\' Single quote
\\ Backslash
Sau kí tự gạch xiên có thể dùng trực tiếp mã 8-bit hoặc mã hexadecimal 4 kí số
với kí tự u hay U (Unicode) đứng trước.
2.4 Kiểu lôgic
Kiểu boolean gồm hai giá trị logical : true, false.
2.5 String
String không phải là một kiểu nguyên thuỷ trong Java.
String là một lớp đã được triển khai sẵn trong gói java.lang
Khai báo và gán trị
String <tên biến>;
Từ khoá String cho phép khai báo biến có kiểu là đối tượng String.
Một giá trị string là một xâu kí tự nằm trong cặp dấu nháy kép (").
Ví dụ
String HoTen = "Nguyen Van A";
String xaurong = "";
Để thể hiện một số kí tự đặc biệt như nháy đơn, nháy kép, xuống dòng trong
một xâu cần dùng mã thoát (dấu gạch xiên \ ).
Bảng mã thoát vói các kí tự đặc biệt tham khảo phần kiểu kí tự ở trên.
Ví dụ : "Tác phẩm \" Thằng ngốc \" của " = Tác phẩm "Thằng ngốc" của
" Các môn học : \n1 - Toán \n2 - Tin " = Các môn học :
1 - Toán
2 - Tin
Có thể in ra màn hình ở chế độ TEXT một hằng String hoặc đối tượng String
System.out.println(" Ho va ten :" );
System.out.println(HoTen);
Nối xâu : +
System.out.println(" Ho va ten :"+ HoTen);
sẽ in ra dòng chữ : Ho va ten : Nguyen Van A
Độ dài xâu :
Lớp String có phương thức length( ) cho biết độ dài là số kí tự của đối tượng xâu.
Ví dụ
String HoTen = "Nguyen Van A";
Int dodaiten = HoTen.length() ; //= 12
Lớp String có nhiều phương thức xử lí khác nữa ta sẽ tìm hiểu sau.
2.6 Các phép toán
số học - arithmetic
so sánh - relational,
lô gíc - logical,
thao tác bit-manipulation,
chuyển đổi kiểu - caste,
chọn theo điều kiện if - selection,
Toán tử gán - assignment operators.
Bảng các toán tử của Java.
Operator Type
Operator
Description
Example
Arithmetic + Addition a + b
- Subtraction a - b
* Multiplication a * b
/ Division a / b
% Modulus a % b
Relational > Greater than a > b
< Less than a < b
>= Greater than or equal a >= b
<= Less than or equal a <= b
!=
Not equal
a != b
== Equal a == b
Logical !
Not
!a
&& AND a && b
|| OR a || b
Bit-
manipulation
~ Complement ~a
& AND a & b
| OR a | b
^ Exclusive or a ^ b
<< Left-shift a << b
>> Right-shift a >> B
>>> Zero-filled right-shift a >>> b
Assignment = Assignment a = b
++ Increment and assign a++
Decrement and assign a
+= Add and assign a += b
-= Subtract and assign a -= b
*= Multiply and assign a *= b
/= Divide and assign a /= b
%= Take modulus and assign a %= b
|= OR and assign a |= b
&= AND and assign a &= b
^= XOR and assign a ^= b
<<= Left-shift and assign a <<= b
>>= Right-shift and assign a >>= b
>>>= Zero-filled left-shift and assign a >>>= b
Caste (type) Convert to type (char) b
Instance instanceof Is instance of class? a instanceof b
Allocation new Create a new object of a class new A()
Selection ? : If Then selection a ? b : c
3. Các lệnh điều khiển
3.1 Các câu lệnh rẽ nhánh
Các lệnh rẽ nhánh IF, IF ELSE , SWITCH CASE .
Y nghĩa như đã quen biết.
Dưới đây là một ví dụ minh hoạ. Chương trình in ra lời chào buổi sáng hay buổi
tối, hiển thị thời gian ngày tháng tuỳ theo thời điểm lúc chạy.
Java có sẵn đối tượng Calendar trong gói java.util để xử lí thời gian và ngaỳ
tháng.
Chương trình sau sẽ minh hoạ cach dùng Calendar cũng như các lệnh rẽ nhánh
trên.
import java.util.*;
class NgayThangApp {
public static void main(String[] arguments) {
//get current time, date
Calendar now = Calendar.getInstance();
int hour = now.get(Calendar.HOUR_OF_DAY);
int minute = now.get(Calendar.MINUTE);
int day = now.get(Calendar.DAY_OF_MONTH);
int month = now.get(Calendar.MONTH) + 1;
int year = now.get(Calendar.YEAR);
if (hour < 12)
System.out.println(" Good morning ! \n");
else if (hour < 17)
System.out.println(" Good afternoon ! \n");
else
System.out.println(" Good evening ! \n");
// show time
System.out.print(" It is ");
if (minute != 0)
System.out.print(" "+ minute + " minutes past ");
System.out.print(hour + " o'clock \n");
//show month
switch (month) {
case 1 : System.out.print("January"); break;
case 2 : System.out.print("February"); break;
case 3 : System.out.print("March"); break;
case 4 : System.out.print("Avril"); break;
case 5 : System.out.print("May"); break;
case 6 : System.out.print("June"); break;
case 7 : System.out.print("July"); break;
case 8 : System.out.print("August"); break;
case 9 : System.out.print("September"); break;
case 10 : System.out.print("October"); break;
case 11 : System.out.print("November"); break;
case 12 : System.out.print("December"); break;
}
System.out.println(" "+ day + " , " + year );
}
}
3.2 Xây dựng vòng lặp
Vòng lặp FOR
For (int number = 0; number <1000; number ++) {
If (number % 10 == 0) System.out.println("#: "+ number);
}
Lưu ý ba phần trong câu lệnh FOR : khởi tạo, kiểm tra điều kiện, tăng/giảm biến đếm.
Các phần này phải cách nhau dấu chấm phẩy (;).
Có thể xây dựng vòng lặp kép
for (i=0, j=0 ; i* j <1000 ; i++ , j += 2 ) {
System.out.println (i + " * " + j + " = " + i*j);
}
Vòng lặp WHILE
While ( index <= 1000) {
Index += 10 ;
System.out.println(" index = " + index);
}
Vòng lặp DO WHILE
Do {
Index += 10 ;
System.out.println(" index = " + index);
} while ( index < 1000);
Kết thúc sớm vòng lặp - lệnh BREAK.
While ( index <= 1000) {
index += 10 ;
if (index == 500) break;
System.out.println(" index = " + index);
}
Đặt nhãn cho vòng lặp.
Đặt nhãn và dấu hai chấm ngay trước lệnh bắt đầu vòng lặp.
Mục đích : để kết thúc sớm vòng lặp ở vòng ngoài.
Lưu ý là lệnh Break sẽ kết thúc vòng lặp trong cùng chứa nó (vòng lặp sát
nhất).
Ví dụ
class Vonglap {
public static void main( String argument[]) {
int count;
int total = 0;
externalloop :
while ( total < 1000 ) {
for (count = 0; count < 10; count ++) {
total = total + count;
if (total > 100) break externalloop;
System.out.println(" total = " + total);
}
}
}
}
Nếu không đặt nhãn cho vòng lặp và dùng break externalloop; mà chỉ
có lệnh break; thì sẽ kết thúc vòng lặp bên trong là vòng FOR
Tương tự, nhãn cũng có thể dùng với lệnh Continue.
4. Mảng
4.1 Khai báo và khởi tạo
<kiểu phần tử> [] <tên biến mảng> ;
hoặc
<kiểu phần tử > <tên biến mảng> [] ;
Ví dụ :
String Ten [];
Int maso[] ;
Boolean ketqua[];
Hoặc
String[] hoten;
Int [] maso;
Boolean [] ketqua;
Khai báo kèm khởi trị = danh sách các giá trị nằm trong cặp ngoặc nhọn { }.
Số phần tử mảng = kích thước mảng sẽ được cố định bằng số giá trị có trong danh
sách khởi tạo.
Ví dụ :
String Ten[] = {"Hung ", "Dung","Cuong", "Thang"};
Sau lệnh trên mảng Ten sẽ gồm 4 phần tử, mỗi phân tử là một đối tượng String.
Không thể thay đổi kích thước mảng về sau.
Khi mảng lớn thì thường phải cấp phát vùng nhớ đủ cho kích thước mảng trước
khi gán trị. Dùng lệnh new chỉ rõ kiểu phần tử mảng và kích thước mảng theo mãu
sau.
= new <kiểu phần tử> [ kích thước mảng ] ;
Ví dụ :
Int maso = new int[100]; //xin cap mot mang 100 so nguyen.
Mọi phần tử mảng sẽ được khởi trị mặc định như sau :
- nếu kiểu số thì bằng giá trị 0;
- nếu kiểu kí tự char thì bằng giá trị kí tự không ' \0'
- nếu kiểu boolean thì bằng giá tri false
- String và các đối tượng khác thì bằng null.
4.2 Sử dụng mảng
Thâm nhập đến từng phần tử bằng chỉ số.
Lưu ý đánh số từ 0. Mảng maso như trên sẽ có các phần tử maso[0] đến maso[99].
Ví dụ :
Maso[10] = 1234;
System.out.println( Ten[3]); // in ra :Thang
4.3 Mảng nhiều chiều
Tương tự như mảng một chiều.
Ví dụ.
Boolean[][] selectedPoint = new boolean[50][50];
SelectedPoint [4][10] = true;
SelectedPoint [7][5] = true;
4.4 Sắp xếp một mảng
Version JAVA 2.0
Lớp Array trong gói java.util có sẵn phương thức để sắp mảng. Để sắp xếp mảng
cần :
- import java.util ;
- Tạo mảng.
- Dùng phương thức sort() của lớp Array để sắp xếp ( thứ tự mặc định là tăng dần).
Ví dụ. Chương trình Name.java
import java.util.*;
class Name {
public static void main( String argument[]) {
String names [] = {"Hung","Dung","Anh","Cuong","Tien"};
System.out.println(" thu tu ban dau :");
for (int i=0; i<names.length; i++)
System.out.println( i + ": " + names[i]);
Arrays.sort(names);
System.out.println(" thu tu sau khi sap xep la : ");
for (int i=0; i<names.length; i++)
System.out.println( i + ": " + names[i]);
}
}
5. Chuyển đổi kiểu
Bao gồm cả các kiểu nguyên thuỷ và các lớp.
Chuyển đổi kiểu có hai loại, chuyển đổi tự nhiên và ép kiểu = chuyển đổi kiểu của
một biến một cách cưõng bức, phải nêu tường minh.
Còn có thể :
- Chuyển đổi một đối tượng thành một đối tượng khác (phải có quan hệ kế thừa).
- Dùng đối tượng để tạo ra biến kiểu nguyên thuỷ tương ứng
- Từ biến kiểu nguyên thuỷ tạo ra đối tượng.
5.1 Ép kiểu – Casting
Nếu xếp các kiểu số theo thứ bậc thì ta có
Byte < short < int < long < float < double
- Chuyển đổi kiểu tự nhiên : trong các biểu thức số học hỗn hợp nhiều biến có kiểu
khác nhau thì kết quả sẽ có kiểu cao nhất. Khi tính giá tri biểu thức, các biến kiểu thấp
hơn sẽ được tự động chuyển thành kiểu cao hơn. Việc này không làm mất thông tin.
Ngoài ra, có thể chuyển Char -> int
- Ép kiểu
Là chuyển đổi không tự nhiên, từ kiểu cao hơn thành kiểu thấp hơn. Thông tin sẽ
bị mất mát đi một phần. Phải ấn định kiểu mới một cách hiển : viết tên kiểu mới trong
dấu ngoặc đơn và đặt trước tên biến.
Ví dụ :
Float source = 7.06F ;
Int destination = (int) source ;
Với các đối tượng có quan hệ kế thừa cũng có vấn đề tương tự.
5.2 Chuyển đổi một biến kiểu nguyên thuỷ thành đối tượng và ngược lại
Một biến kiểu nguyên thuỷ và một đối tượng là hai thứ rất khác nhau. Không thể
Casting đơn giản như nói trên.
Gói java.lang cung cấp các lớp bao gói - Wrapper class : Boolean, Byte, Char,
Double, Float, Integer, Long, Short để tạo các đối tượng ứng với các kiểu nguyên thuỷ
trên. Lưu ý chữ cái đầu tiên là chữ in HOA.
Các lớp bao gói cho phép chuyển đổi kiểu nguyên thuỷ thành đối tượng và ngược
lại. Ví dụ
- Tạo các đối tượng wrapper.
Integer intObj = new Integer (1234);
- Chuyển đối tượng wrapper thành biến kiểu nguyên thuỷ
Int ival = intObj.intValue() ;
lúc này biến nguyên ival sẽ có giá trị là 1234.
Một trường hợp điển hình là chuyển đổi một xâu kí số thành giá trị số.
String count = "25";
Int valcnt = Integer.parseInt(count);
Chương 2
Phương pháp hướng đối tượng và java
1. Các phương pháp xây dựng chương trình
1.1 Lập trình hướng thủ tục
Các ngôn ngữ : COBOL, FORTRAN, PASCAL, C là các ngôn ngữ hướng thủ
tục – procedural langguage.
Đơn vị cơ sở để làm nên chưong trình là các hàm (thủ tục) thực hiện một chức
năng xử lí nào đó. Phân tích thiết kế hướng chức năng.
Cách tiếp cận là chia để trị ,Top-down.
Chương trình được phân rã thành nhiều chương trình con
Hình : Sơ đồ cấu trúc - structure chart - của chương trình
Chương trình là danh sách các câu lệnh, chia thành nhóm - các hàm, thủ tục
Dữ liệu : Toàn cục - global : dùng chung
Cục bộ (theo từng mức) - local : của riêng từng hàm, thủ tục
CTC 3
Chương trình chính
CTC 1 CTC 2
CTC 11 CTC 12 CTC 22 CTC 31 CTC 32
Hình : Sơ đồ dữ liệu - thủ tục xử lí
Nhược điểm :
- Khó kiểm soát qúa trình xử lí các dữ liệu toàn cục vì nhiều hàm có thể truy cập
và thay đổi. Khi thay đổi cấu trúc dữ liệu thì cũng phải thay đổi các hàm xử lí
- Chưa sát với hệ thống thực : chỉ tập trung vào hoạt động, vào chức năng.
Các đặc điểm chính.
- Hướng công việc (thuật toán)
- Topdown - Chia để trị
- Dữ liệu chuyển tuần tự qua các hàm để xử lí
- Nhiều hàm tham gia xử lí dữ liệu chung.
1.2 Lập trình hướng đối tượng
Khái quát hoá các thực thể vật lí hoặc trừu tượng
Gắn bó chặt chẽ dữ liệu + hàm chức năng -> "đối tượng"
Bảo vệ dữ liệu nội tại, che giấu đối với bên ngoài.
Giao tiếp, trao đổi với nhau qua cơ chế truyền thông báo.
Sơ đồ các đối tượng và truyền thông báo.
Dữ liệu
Dữ liệu
Hàm
Dữ liệu
Hàm
Dữ liệu chung - Global Data
CTC 1
___________d
ữ
li
ệ
u c
ụ
c b
ộ
CTC 2
___________
CTC 3
___________
Các đăc điểm
- Hướng dữ liệu thay cho hướng vào công việc xử lí dữ liệu (chức năng).
- Cấu trúc dữ liệu + hàm chưc năng xử lí dữ liệu thành một thể thống nhất.
- Bảo vệ dữ liệu, che giấu đối với bên ngoài
- Trao đổi nhau qua truyền thông báo.
- Tiếp cận từ dưới lên - bottom up.
2. Các khái niệm cơ sở của LTHĐT
Lớp - Class
Đối tượng - Object
Trừu tượng hoá dữ liệu và bao gói thông tin - Data Abstraction and Encapsulation
Kế thừa : - Heritage
Tương ứng bội - polymorphism
Liên kết động - Dynamic binding
Truyền thông báo - message exchange
2.1 Lớp – Class
Lớp - class : là khuôn mẫu của một lớp đối tượng. Từ lớp sẽ đúc ra nhiều thể hiện
(instance) là các đối tương cụ thể khác nhau.
Lớp gồm :
- Cấu trúc dữ liệu thành phần : có thể là
Các biến
Các lớp khác
- Hàm chức năng : có nhiều tên gọi khác nhau
Hàm thành phần - member function,
Phương thức - method.
- Constructor - cấu tử - hàm khởi tạo một đối tượng thuộc lớp, tạo ra một
thể hiện cụ thể (instance) của lớp.
Tên của Constructor phải trùng tên lớp.
Public <tên lớp> ( ) {
// thân hàm - các lệnh thực hiện
}
Ví dụ. Lớp Man là khuôn mẫu để tạo ra các đối tượng “người”. Phân dữ liệu gồm
có họ tên, năm sinh. Phần hàm chức năng gồm có tính tuổi, hiển thị.
class Man {
//Phan du lieu
protected
String ten;
int namsinh;
//Constructor
public Man( String name, int birthyear){
ten = name;
namsinh = birthyear;
}
//Cac ham thanh phan
public int tuoi(){
Calendar now = Calendar.getInstance();
return (now.get(Calendar.YEAR) - namsinh);
}
public void hienthi(){
System.out.println("Ho va ten :"+ten);
System.out.println("Tuoi :"+ tuoi());
}
}
2.2 Đối tượng – Object
Đối tượng - Object : một thể hiện (instance) của Class.
Man ng1 = new Man("Nguyen Van A",1970);
Man ng2 = new Man("Pham Ngoc H",1980);
2.3 Trừu tượng hoá dữ liệu và bao gói thông tin
Trừu tượng hoá dữ liệu - Data Abstraction
- dữ liệu = các thông tin về đối tượng cần xem xét nghiên cứu, được tổ chức thành
một tổng thể thống nhất, phản ánh những nét đặc trưng nhất của đối tượng.
- Không những thế, các hàm thành phần gắn với đối tượng mỗi khi goị đến sẽ xử lí
dữ liệu một cách tự động : từ các số liệu cơ sở biến thành thông tin cần thiết cho NSD.
Ví dụ : hàm tính tuổi, từ năm sinh suy ra tuổi.
public int tuoi(){
Calendar now = Calendar.getInstance();
return (now.get(Calendar.YEAR) - namsinh);
}
Bao gói thông tin - Encapsulation
Public : mọi người đều có thể dùng :
Protected : các hàm thành phần của đối tượng và của các lớp con, cháu dẫn xuát từ
lớp này
Private : chỉ các hàm thành phần mới được phép thâm nhập, không cho phép ngay
cả các hàm của các lớp con cháu thâm nhập.
Các dữ liệu : thường là Protected.
Các hàm thành phần = giao diện với bên ngoài : thường là Public
2.4 Truyền thông báo - message exchange
Truyền thông báo : là cơ chế giao tiếp, phối hợp giữa các đôi tượng để thực hiện các
chức năng của chương trình.
Các dữ liệu đã được baỏ vệ, bao gói kín, do đó để thực hiện các phép xử lí dữ liệu
phải thông qua đối tượng, gửi đến đối tượng một yêu cầu làm việc gì đó. Đối tượng sẽ tự
xử lí dữ liệu thuộc về nó theo như yêu cầu.
Ví dụ đối tượng chính của chương trình ManApp :
- tạo ra đối tượng ng1
- yêu cầu ng1 hiển thị các thông tin về mình.
class ManApp{
public static void main (String[] arguments) {
Man ng1 = new Man("Pham Ngoc H",1980);
ng1.hienthi();
}
}
Kết hợp với khai báo lớp Man đã thực hiện ta có chương trình java đơn giản sau.
import java.lang.System;
import java.util.*;
class ManApp{
public static void main (String[] arguments) {
Man ng1 = new Man("Pham Ngoc H",1980);
ng1.hienthi();
}
}
class Man {
//Phan du lieu
protected
String ten;
int namsinh;
//Constructor, Destructor
public Man( String name, int birthyear){
ten = name;
namsinh = birthyear;
}
//Cac ham thanh phan
public int tuoi(){
Calendar now = Calendar.getInstance();
return (now.get(Calendar.YEAR) - namsinh);
}
public void hienthi(){
System.out.println("Ho va ten :"+ten);
System.out.println("Tuoi :"+ tuoi());
}
}
Phần sau ta phát triển lớp Man thành lớp Employee có nhiều dữ liệu hơn và cũng
nhiều hàm chức năng hơn. Chương trình EmployeeApp sẽ có câu lệnh thực hiện việc
tăng lương cho một nhân viên. Việc này được thực hiện bằng cách gưỉ một thông báo
đến đối tượng nhân viên là e1, nội dung thông báo là định lại mức lương và dữ liệu kèm
theo là mức lương mới 650.00.
e1.setsalary(650.00f);
đối tượng thông báo dữ liệu
2.5 Kế thừa – Heritage
Kế thừa : Là cơ chế tự động cho phép các lớp con, cháu có được cấu trúc dữ liệu,
các hàm thành phần giống như lớp cha mẹ.
- Ngoài ra, lớp con cháu có thể bổ xung thêm dữ liệu, hàm thành phần
- có thể thay đổi, cải tiến hành vi chức năng cũ nếu thấy cần thiết.
Vi dụ : Lớp Employee dẫn xuất từ lớp Man
Các dữ liệu được bổ xung thêm là : phòng ban, lương.
Hai phương thức được bổ xung thêm là setsalary(), getsalary()
Hàm chức năng hiển thi() được cải tiến để hiển thị đầy đủ thông tin về đơn vị làm
việc và lương .
import java.lang.System;
import java.util.*;
import Man;
class EmployeeApp{
public static void main (String[] arguments) {
Employee e1 = new Employee("Pham Ngoc H",1980,"Tai vu",500.00f);
e1.hienthi();
e1.setsalary(650.00f);
System.out.println(" Sau khi tang luong :");
e1.hienthi();
}
}
class Employee extends Man {
//Phan du lieu
protected
String departement;
float salary;
//Constructor, Destructor
public Employee( String name, int birthyear, String dept, float sal){
super(name,birthyear);
departement = dept;
salary = sal;
}
//Cac ham thanh phan
public void setsalary ( float sal) {
salary = sal;
}
public float getsalary () {
return salary;
}
public void hienthi(){
System.out.println("Ho va ten :"+ten);
System.out.println("Tuoi :"+ tuoi());
System.out.println("Phong ban :"+ departement);
System.out.println("Luong :"+ salary);
}
}
2.6 Tương ứng bội – polymorphism
Là cơ chế cho phép cùng một tên hàm, một toán tử có thể mang các nội dung
khác nhau tuỳ theo tham đối, các đối tượng tham gia phép toán.
Ví dụ :
- Dấu cộng có thể là cộng hai số, nối hai String.
- Phương thức hiển thị() như trong ví dụ trên sẽ thực hiện công viẹc
khác nhau tuỳ theo đối tượng thực hiện. Đối tượng thuộc lớp Man thì chỉ hiển
thị tên, tuổi; đối tượng thuộc lớp Employee thì còn hiển thị thêm đơn vị công
tác và lương.
- Trường hợp điển hình là một lớp thường có nhiều Constructor khác
nhau về số tham đối, thực hiện khởi trị cho các dữ liệu thành phần của đối
tượng tuỳ theo lượng tin được cung cấp.
2.7 Liên kết động - Dynamic binding
Cơ chế liên kết động gắn liền với tương ứng bội. Cùng một tên hàm, phương thức, có
thể tương ứng với nhiều nội dung khác nhau. Cần có cơ chế cho phép nối lời gọi hàm,
phương thức đến nội dung tương ứng một cách phù hợp với đối tượng thực hiện, vói
danh sách tham số thực sự nhận được trong thời gian thực hiện chương trình. Chỉ đến
lúc chương trình đang chạy việc liên kết này mới được thực hiện.
2.8 Các ưu điểm
- Phản ánh sát thế giới thực tại, tương ứng 1-1 đối tượng của bài toán với đối
tượng trong phần mềm
- Chương trình được xây dựng từ các đơn thể = đối tượng, từ đơn giản đến phức
tạp, có thể xây dựng thành quy trình công nghệ.
- Các đối tượng dễ dàng sử dụng lại, phát triển thêm thông qua kế thừa.