• Object = các thuộc tính mô tả thành phần dữ liệu+ các hành vi thành phần hàm • class: ADT cho một tập các đối tượng tương tự nhau cùng data, cùng functions.. • Đóng gói encapsulation
Trang 1Chương 03
LỚP – KIỂU DỮ LIỆU TRỪU TƯỢNG
CLASS – ABSTRACT DATA TYPE
Trang 2Ôn tập
• ADT : Khaí quát hóa một tập đối tượng thành một kiểu dữ liệu.
• ADT có thể là một cấu trúc hoặc một class.
• Object = các thuộc tính mô tả (thành phần dữ liệu)+ các hành vi
(thành phần hàm)
• class: ADT cho một tập các đối tượng tương tự nhau (cùng data, cùng functions).
• Instance: Một mô tả của đối tượng trong bộ nhớ của chương trình.
• Ba khái niệm cơ bản trong OOP: Đóng gói, Thừa kế, đa hình.
• Đóng gói (encapsulation) : Gói dữ liệu + hành vi (code), bên ngoài chỉ có thể truy cập một số thuộc tính hoặc hành vi của đối tượng
của một lớp thông qua các công cụ giao tiếp.
• Thừa kế: Một lớp có thể thừa hưởng dữ liệu và hành vi của lớp cha Một ngôn ngữ OOP có thể hỗ trợ đơn thừa kế hoặc đa thừa kế.
• Đa hình: Khả năng cho phép viết lại code của một hành vi được
thừa kế để tạo ra những khác biệt trong ứng xử giữa lớp cha và lớp con cho cùng một hành vi.
• Gửi thông điệp là yêu cầu một đối tượng thực thi một hành vi mà đối tượng này có.
Trang 3Mục tiêu
• Nắm vững cấu trúc của một lớp
• Nắm vững các chỉ thị truy cập
• Giải thích được constructor và destructor
• Giải thích được khái niệm đối tượng hiện hành
• Truy cập thành phần thừa kế từ lớp cha
• Hiện thực được lớp bằng Java
Trang 43.10- Phương pháp giải bài toán với Java
3.11- Chạy chương trình có tham số với JCreator
3.12- Một số lớp cơ bản của Java
Trang 53.1- Cấu trúc 1 lớp và access modifiers
• Lớp: Hiện thực chung cho một tập các đối tượng có
cùng đặc điểm và hành vi.
• Một lớp có thể là lớp con của một lớp đã có.
• Hiện thực lớp:
– Khai báo mức cho phép sử dụng.
– Khai báo lớp cha
– Khai báo các thành phần thuộc tính.
– Hiện thực code các hành vi.
• Lớp và mỗi thành phần cần phải chỉ định mức độ cho
phép truy cập (tính bảo mật) access modifier
• Mỗi ngôn ngữ OOP quy định cú pháp riêng cho việc hiện thực lớp.
Trang 6Cấu trúc một lớp
Field_1 Field_2
Method_1() Method_2()
class B
Các giới hạn truy cập
1 Cho phép truy cập tự do (public)
2 Chỉ cho phép trong cùng một gói
Trang 7Cú pháp khai báo class trong Java
[Modifier] class CLASSNAME
extends FATHERCLASSNAME
{
[Modifier] DataType1 Property1 [=Value];
[Modifier] DataType2 Property2 [=Value];
[Modifier] DataType MethodName ( DataType Arg,…)
{ <code>
}
}
Không có modifier : Mặc định là friendly, cho phép các đối tượng
thuộc các class cùng package ( cùng thư mục)truy cập
Trang 8Đặc tính truy xuất
Modifier private friendly protected public
Trang 9ClassName obj ; obj= new ClassName();
Trang 10Thí dụ 1
Lớp public thì tên file.java phải trùng với tên lớp
Vì khi bên ngoài truy cập, nhìn tên file là biết tên lớp
Trang 11Thí dụ 2
từ khóa this để chỉ thị đối
tượng đang thao tác Nhờ
đó phân biệt được tham số
x và thành
phần x
Trang 12Thí dụ 3
access modifier là private mà trong main vẫn truy cập được
vì main nằm trong khai báo lớp
Trang 13Thí dụ 4
Sửa lại lớp VONGTRON:
không có main
Xây dựng lớp SDVT sử dụng lớp VONGTRON để trong cùng thư mục Biên dịch có lỗi vì trong lớp SDVT không thể truy cập private method
của lớp VONGTRON
Trang 14Thí dụ 5
Lớp SDVT truy cập trực tiếp được thuộc tính x của
vong tròn v vì khai báo thuộc tính này là “friendly” – không chỉ định modifier
Hai file này cùng thư mục nên SDVT truy cập được thuộc tính này.
Trang 15Thí dụ 6
Trong lớp
VONGTRON, x,y,r có thuộc tính protected Nhưng, lớp SDVT cùng thư mục với lớp VONGTRON nên có thể truy cập thuộc
tính này.
Trang 163.3- Chỉ thị this
• Khi hiện thực hành vi của 1 lớp Truy xuất một thành phần bằng chính tên của thành phần này
hoặc this.tênThànhPhần.
• Khi tham số trùng với tên thuộc tính thì nhờ từ
khóa this chúng ta phân biệt rõ thuộc tính với
tham số.
• Các môi trường lập trình Java hiện nay hầu hết đều có trợ giúp ngữ cảnh Do vậy, qua từ khóa this, người lập trình dễ truy cập 1 thành phần
của lớp.
Trang 17Thí dụ
Trang 18Thí dụ
Truy cập thành phần qua
từ khóa this
Truy cập thành phần không qua từ khóa this
Trang 193.4- Overloading một hành vi
• Overloading: Kỹ thuật cho phép xây dựng các hành vi trùng tên nhưng khác chữ ký (signature) trong cùng một lớp
– Số lượng tham số.
– Thứ tự các kiểu của các tham số.
Trang 20Thí dụ
3 hành vi cùng
có tên là setData
Trang 213.5- Hành vi khởi tạo (constructor)
• Hành vi được thực thi ngay vào lúc khởi tạo đối tượng
Trang 22- Khi một lớp đã có constructor thì constructor
mặc định của ngôn ngữ không còn được áp
dụng nữa.
- Tập các constructor hình thành các cách định nghĩa đối tượng.
- Định nghĩa một đối tượng không theo một mẫu constructor sẽ gây lỗi.
Trang 23Thí dụ: constructor của ngôn ngữ (gõ 3 phím)
b
x y
z
1000
b
0 0
0
1000
Nếu là constructor tự tạo thì việc
khởi tạo trị ban đầu được ấn định
bởi code trong constructor.
Trang 24Thí dụ: constructor là mẫu khởi tạo đối tượng
Nếu một lớp có constructor thì constructor mặc định của ngôn ngữ
không được sử dụng nữa.
Trang 25Thí dụ: lớp có nhiều constructor
Viết lại default constructor
constructor tự tạo
Copy constructor
Trang 26Thí dụ: gọi hành vi trong constructor
Trang 27Gợi ý khi xây dựng constructor
• Việc thường làm là gán trị cho các thành phần dữ liệu của đối tượng
• Số constructor có trong một lớp thường là những dạng dữ liệu của đối tượng mà ta muốn có ngay lúc ban đầu
Trang 29Trong Java, nếu dùng super thì super phải là
dòng code đầu tiên trong constructor của lớp con
Ý định:
Xây dựng hành vi outData trong lớp con bằng cách gọi hành vi outData của lớp cha
rồi xuất cost.
Error
Trang 30Viết lại hành vi outData trong lớp con
Trang 313.7- Hành vi hủy (destructor)
• Đối tượng sống kể từ khi ta khởi tạo đối tượng (bằng toán tử
new) cho đến hết khối chứa nó.
• Khi ra khỏi khối chứa đối tượng, ta nói đối tượng đã chết.
Tầm vực (scope) của đối tượng
Một số ngôn ngữ OOP ( C++, C#) cho phép ta viết code sẽ được thực thi vào lúc đối tượng chết nhằm trả tài nguyên đã cấp phát động.
Java chỉ dùng cách cấp phát đối tượng động, có trình gom rác riêng
và không hỗ trợ hành vi hủy.
Trang 323.8- Thành phần static
• Đôi khi ta muốn một dữ liệu, một đoạn code, một hành vi
là toàn cục để trongmột lớp Dùng chỉ thị static.
• Dữ liệu static là DỮ LIỆU TOÀN CỤC.
• Hành vi static là hành vi toàn cục
• Code static là CODE TOÀN CỤC và chỉ thao tác lên
dữ liệu static.
Truy xuất dữ liệu và code này thông qua tên lớp hoặc
một đối tượng thuộc lớp có thành phần static.
(1) ClassName.StaticMember
(2) ClassName obj= new ClassName();
obj StaticMember
Trang 33Dữ liệu static- Thí dụ
Truy xuất static data bằng tên lớp
Truy xuất static data bằng tên đối tượng thuộc lớp
Trang 34Hành vi static- Thí dụ
Nhận xét
Hành vi static được bên ngoài sử
dụng mà không cần khai báo biến
đối tượng thuộc lớp Do vậy, hành
vi static thường có tham số không
liên quan đến đối tượng thuộc lớp.
Trang 35Code static- Thí dụ
Cú pháp đưa một đoạn code static:
static { <code>
}
Code static được thực thi ngay khi lớp có code này được tham khảo tới.
Trang 36Code static- Thí dụ
Code static chỉ tham khảo
dữ liệu static
Trang 37Code static – thí dụ
Nếu có nhiều đoạn code static,
các đoạn code này được thực thi tuần tự
Trang 38Code static với constructor
Constructor chuẩn không đụng đến thành phần stattic
Trang 39Code static với constructor
tham khảo khi chưa có đối tượng tham khảo khi đã có đối tượng
Vì khi có đối tượng, constructor
có code làm thay đổi trị của n
nên kết qủa đã khác đi.
Trang 41final Data là hằng cấm sửa
Trang 42final class là lớp không con
Trang 43final method là hành vi không cho phép lớp
con viết lại (override)
Trang 443.10- Phương pháp giải bài toán với Java
Bài toán đơn giản Bài toán phức tạp
Trang 453.10.1- Bài toán đơn giản
Mô tả
của
bài toán
Danh từ đơn giản
Động từ
class BaiToan { public static void main(String args[]) {
< biến>
<code xử lý>
} }
Trang 46Bài toán đơn giản -Thí dụ
for (int i=1; i<=100; i++)
{ if (i>2) { t3= t1+t2;
t1=t2;
t2=t3;
} System.out.println(t3 + “, ”);
}
} }
Trang 47{ }
public static void main (String args[]) { BaiToan obj= new BaiToan( );
obj.HànhVi_1();
obj.HànhVi_2();
.
} Thứ tự của
các động từ
Trang 48NhânViên( String t, long l) { Tên=t; Lương=l;}
void Xuất() { System.out.println( Tên + “, “ + Lương);
}
{ NhânViên nv1= new NhânViên(“Hoa”, 100); NhânViên nv2= new NhânViên(“Linh”, 120); NhânViên nv3= new NhânViên(“Lan”, 150);
nv1.Xuất();
nv2.Xuất();
nv3.Xuất();
} }
Trang 49từ mô tả)
Động từ
tác động
Bài toán phức tạp Xem các
thí dụ ở các chương sau class KháiNiệm1
obj.HànhViChung1();
obj.HànhViChung2();
} }
Thứ tự của các động
từ mức cả bài toán
class KháiNiệm2 { <data>
<method>
}
Trang 50Tóm tắt
• class = Members
• Member = Datum/method
• access modifier: public, private, protected
• Không có access modifier được hiểu là
Trang 51• Ta có thể truy xuất đoạn code static mà
không là hành vi của 1 lớp không?
Trang 52Tóm tắt
• Tập các constructor của 1 lớp tạo
ra
• Java có hỗ trợ destructor?
• Dữ liệu final là
• Hành vi final là hành vi
• Lớp final là lớp
Trang 53(các thông tin về người khác sinh viên tự ấn định)
Dữ liệu của các bài toán được đưa vào bài toán
thông qua constructor
Trang 54Bài tập
• Bài tập 2:Tương tự bài 1 nhưng thay vì
mô tả lương bằng 1 con số, mô tả lương thông qua hệ số lương nhân với lương cơ bản là một dữ liệu static (xem lại thí dụ)
Trang 55Chạy chương trình có tham số với
Trang 56Tạo Project
hoặc
Trang 57Đặt tên cho project
Trang 58Kết qủa: Project trống (chọn File view)
Trang 59Thêm 1 file
Trang 60Viết chương trình
Trang 61Chỉ định tham số cho chương trình
Trang 62Đặt tham số nhanh:
Trang 63Bài tập
(1) Viết chương trình tính tổng các số từ
chuỗi tham số nhập của chương trình
(2) Viết chương trình xuất các tham số của chương trình theo thứ tự tăng dần
Trang 643.12- Một số lớp cơ bản của Java.
• Lớp Object
• Lớp String
• Các lớp gói (wrapper)
• Lớp Math
Trang 65Định nghĩa các trạng thái cơ bản và các
phương thức cơ bản của mọi lớp phải có như: So sánh nó với 1 đối tượng khác
(equals), chuyển đổi mô tả thành chuỗi
(toString), đợi (wait) điều kiện, nhận biết
(notify) các đối tượng khác khi biến điều
kiện có thay đổi, lấy Class (getClass)
Hành vi hashCode() cho biết địa chỉ của
dữ liệu của đối tượng.
Trang 66Lớp Object (tt)
Trang 67Thí dụ
Student2@18d107f Kết qủa của method toString() :
Tên lớp + @ + Địa chỉ hệ 16 của thực thể
(Lưu ý: Địa chỉ của thực thể chứ không
phải là địa chỉ của biến đối tượng )
Trang 68Nhét obj vào lớp để khi lấy hashcode của lớp bao thì sẽ biết địa chỉ của biến obj này.
Lớp có thành phần là lớp
và địa chỉ biến đối tượng
Trang 69Giải thích
A a1 String s
4565111 20392474 69609650
11352996 19313225
Trang 70biến value s2=s1;
100 100
Hello
100 100 Hello
s2=“Hi”;
Hi
Trang 71• String pool ( hồ/ bảng chứa chuỗi)
Khi nhiều biến String cùng mang 1 nội dung,
chúng cùng chỉ đến 1 phần tử trong String pool
Thí dụ:
String Str1 = “Hello”;
String Str5= “Hello”;
I love you Hello
Forget me not Str1
Str5
Trang 72Lớp String (tt)- Methods
Trang 73Lớp String (tt)- Methods
Trang 74Lớp String (tt)- Methods
Trang 75Thí dụ về lớp String
Các hành vi của lớp String trả về chuỗi
kết qủa thì sẽ trả về chuỗi mới còn chuỗi
gốc không đổi.
Nếu muốn làm thay đổi chuỗi gốc thì
dùng lớp StringBuffer cũng thuộc gói
java.lang Các hành vi cũng tương tự
như lớp String.
Trang 763.12.3-Các lớp gói (wrappers)
• Dữ liệu thuộc kiểu cơ bản như
int, long, char, chỉ là dữ liệu
không có hành vi kết hợp.
• Wrapper , trong gói java.lang,
là lớp bao lấy các kiểu dữ liệu
cơ bản nhằm tạo ra tính OOP
cho các kiểu cơ bản.
• Các hành vi của lớp Wrapper
đa số là các hành vi static
hiện thực các thao tác lên
dữ liệu thuộc kiểu tương
ứng.
• Biến thuộc lớp Wrapper
chứa địa chỉ của dữ liệu.
Integer obj1 int x
1000 5
15 1000
int x=5;
Integer obj1= new Integer(15); Integer obj2= new Integer(“32”);
32 1100
Integer obj2 1100
Trang 77để biết về các hành vi của các wrapper class
Trang 78Wrapper-Thí dụ
Trang 793.12.4- Lớp Math
• Trong gói java.lang
• Chứa các hàm xử lý toán học
• Là lớp final
Trang 80Thí dụ:
Hàm random
trả trị [ 0.0, 1.0 [