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ừ khoá String cho phép khai báo biến có kiểu là đối tượng String.. Các khái niệm cơ sở của LT
Trang 2Chươ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
Trang 3Phươ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
Trang 44.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
Trang 55.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
Trang 65 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
Trang 7Chươ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
- 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
Trang 8Tên class chính = tên tệp (.java) = tên tệp byte-code( class)
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
thước byte
Trang 9Cơ 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
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 :
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
Trang 10String 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 (")
Trang 11Nố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
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
>= Greater than or equal a >= b
<= Less than or equal a <= b
Trang 12& AND a & b
Decrement and assign a
-= Subtract and assign a -= b
%= Take modulus and assign a %= b
&= AND and assign a &= b
<<= Left-shift and assign a <<= b
>>= Right-shift and assign a >>= b
>>>= Zero-filled left-shift and assign a >>>= 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
Trang 13Chươ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);
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
Trang 14For (int number = 0; number <1000; number ++) {
If (number % 10 == 0) System.out.println("#: "+ number);
Trang 15public 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> ;
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
Trang 16Khi 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
Trang 17public 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ự
Trang 185.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);
Trang 19
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
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 11 CTC 12 CTC 22 CTC 31 CTC 32
Trang 20Hì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 _
Trang 21Cá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
- 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ị
Trang 22public 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
Trang 232.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();
} }
//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());
Trang 24}
}
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
- 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
public static void main (String[] arguments) {
Employee e1 = new Employee("Pham Ngoc H",1980,"Tai vu",500.00f);
class Employee extends Man {
Trang 25}
//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);
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
Trang 26- Bảo vệ, che giấu thông tin nên tránh lỗi, xây dựng chương trình an toàn hơn
- Cách tiếp cận hướng đối tượng đặt trọng tâm vào dữ liệu, do đó dễ triển khai, cài đặt hơn
- Các mối quan hệ, các giao diện với bên ngoài phản ánh rõ ràng qua cơ chế truyền thông báo
3 Xây dựng lớp trong java
Khai báo một lớp như sau
Môtả class tên_lớp extends tên_lớp_mẹ thân_lớp
Các mô tả : abstract, public, final
Lớp abstract nghĩa là không thể tạo ra đối tượng cụ thể của lớp Nó là khung cơ sở
nhất để dẫn xuất ra các lớp con cháu
Lớp public nghĩa là cho phép sử dụng ngoài gói chứa nó Nếu không khai báo là
public, nó chỉ có thể được tham chiếu trong gói
Lớp final nghĩa là không thể sản sinh dẫn xuất ra các lớp con
Dĩ nhiên một lớp không thể đồnh thời vừa final và abstract
Sau extends là tên của lớp mẹ trực tiếp Phần này có thể không có
Phần thân gồm khai báo các thành phần của lớp, được viết trong cặp dấu ngoặc nhọn { }
Một khung đơn giản nhất khai báo lớp là
Class tên_lớp {
// các khai báo biến
//các khai báo methods
}
Các vấn đề cần xem xét khi tạo và sử dụng đối tượng
- Tạo ra các biến của một đối tượng
- Tạo ra các biến của lớp
- Sử dung các phương thức với đối tượng và lớp
- Gọi một phương thức trong một câu lệnh
Trang 27- xây dựng constructor
- Cách truyền tham số cho một phương thức
- Con trỏ this
- tạo đối tượng mới
- đặt đối tượng bên trong một đối tượng khác
3.2 Các biến thành phần
Biến có thể là một kiểu nguyên thuỷ hoặc một đối tượng Có thể khai báo các
biến kiểu nguyên thuỷ, mảng, string hay các đối tượng khác
Cần khai báo các biến đầu tiên, ngay sau khai báo class
Khai báo biến
Môtả kiểu tên_biến phần_khởi_trị;
Phần mô tả và phần khởi trị có thẻ vắng mặt
Kiểu có thể là kiểu dữ liệu nguyên thuỷ, kiểu lớp, kiểu interface
Phần tên biến có thể kèm một hoặc vài cặp ngoặc vuông ([]) nếu là biến mảng
Phần khởi trị gồm dấu bằng (=) sau đó là biểu thức (cùng kiểu) Nếu là biến mảng thì phần khởi trị cho mảng sẽ là danh sách các gía trị, biểu thức trong cặp dấu ngoặc nhọn
Phần mô tả có thể là một trong 7 lựa chọn : public, protected, private, static,
final, transient, volatile
Các mô tả : public, protected, private xác định quyền thâm nhập
Private : của riêng đối tượng, chỉ bên trong đối tượng
Protected : cho phép con cháu truy cập đựoc theo kế thừa
Public : mọi người đều có thể truy cập
static : nghĩa là gắn với lớp và có thể chia sẻ chung cho các đối tượng của lớp này
final : là một hằng, không thể thay đổi, và phải khởi trị trước khi dùng
Trang 28//Cac ham thanh phan
3.3 Biến lớp và mô tả static
Biến lớp - class variables
Khi một đối tượng được khởi tạo, các biến sẽ nhận các gía trị cụ thể riêng cho đôi tượng đó
Ví dụ : Sau các lệnh khởi tạo
Man ng1 = new Man("Nguyen Van A",1970);
Man ng2 = new Man("Pham Ngoc H",1980);
Thì đối tượng ng1 có tên là Nguyễn Văn A, năm sinh là 1970
đối tượng ng2 có tên là Phạm ngọc H, năm sinh là 1980
Các biến trường là thuộc tính của riêng từng đối tượng
Khi thay đổi lại ví dụ e1.setsalary(650.00f) thì không ảnh hưởng gì đến các đối tượng khác cùng lớp
Tuy nhiên, ta muốn có những biến chung cho cả lớp = class variables Vi dụ, hệ số
lương chung cho mọi Employee đều là 120.000 Việc thay đổi hệ số lương do Bộ tài chính quyết định sẽ áp dụng cho mọi đối tượng Employee
Khai báo : thêm mô tả static vào phía trước phần khai báo thông thường
Thâm nhập : thâm nhập các biến lớp cũng tương tự như các biến đối tượng : tên
lớp, dấu chấm, tên biến
Không thể dùng tên lớp để thâm nhập đến biến đối tượng
Tương tự ta cũng có khái niệm phương thức chung của lớp
Mô tả static
Mô tả static dùng với biến và cho các phương thức như sẽ thấy ở phần dưới đây Tóm lại, mô tả static nghĩa là :
- Chung cho cả lớp, cho mọi đối tượng của lớp
- không gắn với một đối tượng cụ thể
- truy cập bằng tên lớp, dấu chấm, tên biến hoặc phương thức
3.4 Phương thức – method
Là các hàm, thủ tục thực hiện các phép toán xử lí các biến thành phần - các dữ
liệu Nếu là thủ tục thì không có kết quả trả về - kiểu trả về là void
Trang 29Giống như các biến, có các phương thức của đối tượng và của lớp (static)
Khai báo phương thức
Môtả kiểu_kết_quả tên_phương_thức(danh_sách_tham_số) phần_thân
Phần mô tả có thể là : public, protected, private hoặc final, static, abstract, native,
synchronized
final nghĩa là không thể phát triển tiếp bằng cách viết chồng - overridden
static nghĩa là chỉ thuộc lớp đang xét Nó chỉ được phép xử lí các biến static
Method static cũng là final
abstract không có phần thân Nó để dành cho viết đè lên về sau
native nghĩa là viết bằng một ngôn ngữ khác Java Nó cũng không có thân
synchronized nghĩa là phải đợi một lock trên một đối tượng hay lớp khác mới có
thể được thực hiện
Nếu phương thức không có kết quả trả về thì phần kiểu kết quả trả về là void
Danh sách tham số có thể gồm nhiều tham số cách nhau dấu phảy Mỗi tham số trong danh sách gồm có kiểu, tên (kèm các cặp dấu ngoặc vuông ([]) nếu là kiểu mảng)
Phần thân là các câu lệnh xử lí nằm trong cặp dấu ngoặc nhọn
Trong phần thân có thể có các khai báo biến cục bộ của riêng phương thức đó
Tầm nhìn thấy, tầm tác dụng - scope - của biến là phạm vi bên trong cặp dấu
ngoặc nhọn mà biến được khai báo
Câu lệnh để trả kết quả cho chương trình gọi phương thức là
- Phải dùng tên lớp nếu là phương thức static
- Phải có cặp dấu ngoặc đơn ( ), mặc dù phương thức không có tham số
- Phân biệt sử dụng hàm, có kết qủa trả về, và thủ tục trả về void : thủ tục có thể dùng độc lập như một câu lệnh, hàm phải dùng như một thành phần trong câu lệnh, biểu thức hoạc câu lệnh gán
Trang 303.5 Constructor
Là phương thức đặc biệt, dùng để khởi tạo ra đối tượng thuộc lớp
Khai báo Constructor
Môtả tên(danh_sách_tham_số) phần_thân
Mô tả có thể là : public, protected, private Nó chỉ ra phạm vi truy cập, ý nghĩa như đã biết
Không có phần kiểu trả về
Tên của constructor phải trùng với tên lớp
Phần thân của constructor là các lệnh khỏi tạo đối tượng nằm trong cặp dấu ngặc nhọn Có thể rỗng, chỉ gồm cặp dấu ngoặc nhọn
Thân của constructor thường bắt đầu bằng các lời gọi - constructor call - để gọi
một constructor khác của chính lớp đang xét hoặc constructor của lớp mẹ :
this(danh_sách_tham_s ố); //gọi Constructor khác của lớp này
super(danh_sách_tham_s ố); //gọi Constructor của lớp mẹ
Nếu không có lệnh gọi constructor nào thì mặc định coi như là gọi super()
Tạo một đối tượng
Các biến kiểu nguyên thuỷ tồn tại và có thẻ sử dụng ngay sau khi khai báo
Khác với các biến kiểu nguyên thuỷ, một đối tượng mới cần phải được khởi tạo
một cách tường minh bằng new
Các câu lệnh Man ng1;
Man ng2;
Chưa tạo ra đối tượng Nếu sử dụng ngay, ví dụ gọi thực hiện phương thức ng1.hienthi()
thì sẽ mắc lỗi NULL exception
Phải có lệnh khởi tạo tường minh
Man ng1 = new Man("Nguyen Van A",1970);
Man ng2 = new Man("Pham Ngoc H",1980);
Lệnh new sẽ cấp phát một vùng nhớ đủ để chứa đối tượng và sau đó gọi constructor
của lớp để khởi trị các biến của đối tượng - một thể hiện cụ thể, một instance của lớp Đó
là lí do vì sao constructor phải cùng tên với tên lớp
3.6 Lớp là thành phần của một lớp khác
Một chương trình java thường gồm nhiều lớp một lớp chính và nhiều lớp phụ
Trang 31Các lớp phụ này có thể được khai báo bên ngoài lớp chính, độc lập
Cũng có trường hợp, lớp phụ là một thành phần trong lớp chính - inner class Khi biên dịch, tên của các lớp thành phần sẽ được tạo theo quy tắc
<tên lớp mẹ>$<tên lớp thành phần> class
3.7 Tổ chức lớp và tệp chương trình
Các gói - Packages
Chương trình Java được tổ chức thành các gói - packages Đó là các tệp mã nguồn
xây dựng các lớp và các interfaces (sẽ nói sau) Tệp mã nguồn trong một gói phải bắt đầu
bằng câu lệnh package
package <tên package> ;
Nếu không có lệnh package mở đầu thì mọi lớp và interfaces khai báo trong tệp
được coi là thuộc gói không tên - no name package
Có thể dùng các lớp và interface trong một gói khác với điều kiện nó là public và
phải chỉ rõ tên gói Biến môi trường CLASSPATH để chỉ đường dẫn đến nơi đặt các gói lớp
Trong một tệp mã nguồn, chỉ có một lớp đựoc khai báo là public
Tên của tệp mã nguồn phải trùng với tên của lớp hay interface được khai báo là
Nếu một chương trình không lớn, chỉ gồm một vài lớp thì các lớp đều nằm trong
một gói, mã nguồn sẽ nằm trong một tệp, tên tệp phải trùng tên lớp public Các lớp còn lại không được là public