Xây dựng lớp
Các thành phần của lớp. Lớp = mô hình khái quát một họ thực thể vật lí hoặc trừu tượng Là khuôn mẫu để sản sinh ra nhiều đối tương cùng họ. Đối tượng có hai bộ phận : thuộc tính và hành vi ...
Các thành phần của lớp.
Lớp = mô hình khái quát một họ thực thể vật lí hoặc trừu tượng
Là khuôn mẫu để sản sinh ra nhiều đối tương cùng họ.
Đối tượng có hai bộ phận : thuộc tính và hành vi
Thuộc tính là các dữ liệu :
các biến trường
các đối tượng thành phần khác - inner objects.
Hành vi = phương thức = method : thực hiện những công việc cụ thể, xử lí các dữ liệu liên quan đến đối tượng.
Khai báo.
Môtả class tên_lớp extends tên_lớp_mẹ thân_lớp
Các mô tả : abstract, public, final.
abstract = trừu tượng = không thể tạo ra đối tượng cụ thể.
Là khung co sở nhất để dẫn xuất ra các lớp con cháu.
public = công cộng = sử dụng được ở ngoài.
final = cuối cùng = không thể sản sinh dẫn xuát ra các lớp con.
extends < tên của lớp mẹ > : kế thừa.
Thân : trong cặp dấu ngoặc nhọn {, }.
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
- xây dựng constructor
- Các 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
Các biến thành phần.
Biến : kiểu nguyên thuỷ
Kiểu lớp đối tượng.
Cần khai báo đầ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.
tên biến
kèm [] nếu là biến mảng.
Khởi trị : = biểu thức (cùng kiểu).
Biến mảng thì khởi trị = { danh sách các gía trị }.
mô tả : một trong 7 lựa chọn.
public, protected, private, static, final, transient, volatile
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 : gắn với lớp, chung cho mọi đối tượng của lớp này.
final : = hằng, không thể thay đổi (phải khởi trị trước khi dùng)
Ví dụ :
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());
}
}
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.
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. Thay đổi sẽ áp dụng cho mọi đối tượng Employee.
Khai báo : thêm static.
Thâm nhập : 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óm lại
static
- 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.
Phương thức - method.
Là các hàm, thủ tục (kiểu trả về là void).
có các phương thức 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
public, protected, private hoặc final, static, abstract, native, synchronized.
final = không thể viết đè - overridden.
static --> final.
abstract không có phần thân. để viết đè lên về sau.
native = viết bằng một ngôn ngữ khác Java, cũng không có thân.
kiểu kết quả hoặc void.
Danh sách tham số như thông thường
kiểu, tên (kèm [] nếu là kiểu mảng)
Phần thân : có thể có các 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 - phạm vi bên trong cặp dấu ngoặc nhọn mà biến được khai báo.
Trả kết quả
Return biểu thức;
Để thoát có thể dùng
Return;
Các câu lệnh return có thể không phải là câu lệnh cuối cùng. Ví dụ khi có rẽ nhánh, kết thúc sớm vòng lặp...
Sử dụng phương thức.
Lời gọi : tên đối tượng (tên lớp), dấu chấm, tên phương thức, danh sách các tham số thực sự.
Ví dụ : e1.hienthi();
e1.setsalary(650.00f);
Lưu ý :
- 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ố
Constructor
Là phương thức đặc biệt.
Để 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
public, protected, private.
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ó thể rỗng, chỉ gồm cặp dấu ngoặc nhọn.
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ố );
super( danh_sách_tham_số );
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.
Một đối tượng mới cần phải được khởi tạo tường minh bằng new.
Khai báo Man ng1;
Man ng2;
Chưa tạo ra đối tượng.
Nếu sử dụng ngay : ng1.hienthi() -> lỗi NULL exception.
Man ng1 = new Man("Nguyen Van A",1970);
Man ng2 = new Man("Pham Ngoc H",1980);
- cấp phát một vùng nhớ đủ để chứa đối tượng
- gọi constructor của lớp để khởi trị các biến của một đối tượng - một thể hiện cụ thể, một instance của lớp.
Tổ chức lớp và tệp chương trình.
Chương trình chỉ gồm một lớp = mã nguồn trong một tệp -> tên tệp phải trùng tên lớp.
Chương trình gồm nhiều lớp
thì có hai cách:
- đặt mọi lớp vào một tệp duy nhất.
- đặt mỗi lớp vào một tệp khác nhau, tạo thành một Project.
1- Trường hợp 1 : nhiều lớp trong một tệp.
Chỉ có lớp đâu tiên được mô tả là public.
Tên phaỉ trùng tên tệp.
Các lớp còn lại không được là public.
2 - Trường hợp 2.
Mỗi tệp một lớp.
Phải có mô tả public
Tên lớp phải trùng tên tệp.
Một chương trình trong một thư mục.
Trình biên dịch sẽ tạo ra các tẹp mã byte-code cho mỗi lớp với đuôi .class.
Trong tệp chính sẽ phải có lệnh import các lớp phụ trợ khác.
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
nhiều lớp phụ
Các lớp phụ :
Có thể được khai báo bên ngoài lớp chính, độc lập.
Có thể 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
This
= đối tượng đang xét.
Trường hợp trùng tên biến : có biến trường và bên trong một phương thức cũng có biến cùng tên. Đẻ truy cập đến biến trường cần chỉ rõ this. <tên biến>.
Trương hợp một phương thức mà tham số của nó chính là đối tượng đang xét. Lời gọi thực hiện phương thức sẽ là <tên phương thức> (this).
Kế thừa trong Java.
Kế thừa -> sử dụng lại + cải tiến các lớp đối tượng đã xây dựng.
Kim tự tháp các lớp làm sẵn, đỉnh là Object.
con
Class <tên lớp con> extends <tên lớp mẹ> {
... }
- bổ xung các biến trường mới.
- bổ xung các phương thức mới.
- Viết đè - overriding - phương thức cũ, tên cũ, nội dung mới -
overriding < > overloading -
Nhiều phương thức cùng tên
khác nhau về danh sách tham số
công việc khác nhau.
Lựa chọn các mô tả
Private, Protected, Public
Nguyên tắc Encapsulation -> biến trường = dữ liệu : Protected, private .
Protected -> con cháu kế thừa được.
Phương thức = giao diện của đối tượng với bên ngoài -> public.
Quan hệ trong kế thừa
This và super
This = đối tượng đang xét.
Super = mẹ trực tiếp (tổ tiên thế hệ 1).
Điển hình là trong các constructor.
ép kiểu lớp đối tượng
Phải có quan hệ kế thừa.
- Chuyển đổi tự nhiên thành đôí tượng của lớp tổ tiên ở mức trên.
Ví dụ : Employee là một Man
- Casting : đối tượng lớp tổ tiên như một đối tượng của lớp con cháu ở mức dưới.
Ví dụ :
Man m1 = new Man("Nguyen Van A",1970);
(Employee)m1 ;
Sử dụng lại
Ưu điểm của phương pháp hướng đối tượng.
Cần có chuẩn chung để sử dụng lại kho đối tượng sẵn có.
- đỡ phải chú giải
- tương thích nhau
- cái mới phù hợp hệ thống cũ.
Interface là một tập hợp các phương thức trừu tượng
Để sau này sẽ viết đè lên khi cài đặt vào một lớp cụ thể.
Interface cung cấp một khuôn mẫu giao diện cho các đối tượng.
Các Interface cũng được tổ chức thành cây phân cấp theo quan hệ kế thừa.
Cú pháp về Interface cũng gần giống như lớp.
Mô_tả Interface tên_interface extends tên_interface_mẹ phần_thân
Phần thân Interface nằm trong cặp dấu ngoặc nhọn {},
Có thể gồm các khai báo hằng, biến và các phương thức trừu tượng – abstract.
Interface thực sự chỉ cung cấp bộ khung.
Nội dung xử lí cần được triển khai tại các lớp cài đặt nó.