Lớp Đối tượng Phạm vi truy xuất thành phần lớp Đối tượng this Phương thức khởi tạo Phương thức huỷ Thành phần tĩnh Thành phần hằng Truyền tham số Tổ chức các lớp Biến CLASSPATH Một số lớ[r]
(1)Chương Lớp và Đối tượng (2) Nội dung 10 11 12 Lớp Đối tượng Phạm vi truy xuất thành phần lớp Đối tượng this Phương thức khởi tạo Phương thức huỷ Thành phần tĩnh Thành phần Truyền tham số Tổ chức các lớp Biến CLASSPATH Một số lớp thông dụng (3) Lớp • Lớp là gì? • Lớp (Class) là tập các đối tượng có cùng đặc trưng • Ví dụ: lớp Sinh viên, lớp Động vật,… • Mỗi lớp gồm các thuộc tính và hành động đặc trưng lớp (4) Lớp (tiếp) • Khai báo lớp đơn giản: class <TênLớp> { Khai báo các thuộc tính Khai báo các phương thức } • Khai báo thuộc tính: Kiểu tênThuộcTính; (5) Lớp (tiếp) • Khai báo phương thức: Kiểu tênPhươngThức(ds Tham số) { Các lệnh phương thức; return kếtQuả; } (6) Lớp (tiếp) • Ví dụ: khai báo lớp phân số đơn giản class PS { int tu, mau; void hienThi() {System.out.println(tu+“/”+mau);} double giaTri() {return (double)tu/mau;} } (7) Tính bao gói (Encapsulation) Một lớp bao gồm thuộc tính và các phương thức Tính bao gói giúp cho việc quản lý các lớp dễ dàng lập trình (8) Đối tượng • Đối tượng (Object) là thực thể thuộc lớp nào đó • Đối tượng tạo từ lớp theo cú pháp: new TênLớp(); Ví dụ: new PS(); • Sẽ cấp phát vùng nhớ lưu đối tượng • Trong Java vùng nhớ cấp phát cho đối tượng là Heap (9) Đối tượng (tiếp) • Tham chiếu (reference): • Để thao tác với đối tượng cần có tên, gọi là tham chiếu • Khai báo tham chiếu: TênLớp tênThamChiếu; Ví dụ: PS p; • Tham chiếu đến đối tượng: tênThamChiếu = new TênLớp(); Ví dụ: p = new PS(); (10) Phân biệt biến và đối tượng Primitive type int i = i Object type PS p p reference p: PS tu=1 mau=2 (11) Đối tượng (tiếp) • Phép gán tham chiếu: tênThamChiếu1 = tênThamChiếu2; • Hai tên cùng tham chiếu đến đối tượng • Phân biệt phép gán biến và tham chiếu: int x = 5, y; PS p, q; y = x; p = new PS(); q = p; (12) Phép gán biến và tham chiếu Phép gán tham chiếu Phép gán biến i=j Before: After: p1 = p2 Before: After: i i p1 p1 j j p2 p2 p1: PS tu=1 mau=2 p2: PS tu=5 mau=7 (13) Đối tượng (tiếp) • Thao tác với đối tượng qua tham chiếu: • Thao tác với thuộc tính: tênThamChiếu.tênThuộcTính • Ví dụ: p.tu=1; p.mau=2; • Thao tác với phương thức: tênThamChiếu.tênPhươngThức([ds đối số]); • Ví dụ: p.hienThi(); • double x = p.giaTri(); (14) Phạm vi truy xuất các thành phần lớp • Khai báo các thành phần với phạm vi truy xuất: <Phạm vi> <Khai báo thành phần> • <Phạm vi> gồm: • public: dùng chung vị trí • private: truy xuất phạm vi lớp (15) Phạm vi truy xuất …(tiếp) • Ví dụ: class PS { private int tu, mau; public void hienThi() { … } } (16) Phạm vi truy xuất … (tiếp) • Thông thường các thuộc tính quy định phạm vi truy xuất là private • Để truy xuất các thuộc tính từ bên ngoài lớp, ta cung cấp các phương thức lấy giá trị và gán giá trị cho thuộc tính (17) Phạm vi truy xuất … (tiếp) • Ví dụ: lớp PS với các phương thức truy xuất class PS { private int tu,mau; public int layTu(){ return tu;} public int layMau(){ return mau;} public void ganTu(int t){ tu = t;} public void ganMau(int m) { if (m>0) mau=m;} } (18) Phạm vi truy xuất … (tiếp) • Xét các thao tác sau: PS p = new PS(); p.tu = 1; p.mau=2; //sai vì tu, mau có phạm vi truy xuất là private (19) Phạm vi truy xuất … (tiếp) • Thay cho thao tác trên thao tác: p.ganTu(1); p.ganMau(2); • Để in phân số p lên màn hình phải thực hiện: System.out.println(p.layTu()+”/”+p.layMau()); (20) Che giấu thông tin (Hiding information) • Thông tin lớp có thể che giấu bên ngoài lớp • Giúp cho việc bảo vệ thông tin tốt • Việc che giấu thông tin đảm bảo có thể thao tác với đối tượng cần (21) Đối tượng this • Là đối tượng ngầm định viết mã lệnh các phương thức lớp • Ví dụ: lớp PS class PS { private int tu, mau; public void ganTu(int tu) { this.tu = tu; } } (22) Đối tượng this (tiếp) • Khi thực hiện: PS p = new PS(); p.ganTu(5); thì this chính là phân số p (23) Nạp chồng phương thức (Overloading) • Một lớp có thể chứa nhiều phương thức cùng tên với chức khác • Các phương thức nạp chồng phải khác tham số • Ví dụ: lớp PS có thể có hai phương thức cong: PS cong(int) PS cong(PS) • Khi sử dụng tự động chọn phương thức phù hợp (24) Phương thức khởi tạo • PTKT (constructor) là phương thức đặc biệt dùng để khởi tạo giá trị các thuộc tính đối tượng tạo • Phương thức khởi tạo ngầm định: không khai báo phương thức khởi tạo Chẳng hạn: PS p = new PS(); Khi đó p=? (25) Phương thức khởi tạo (tiếp) • Khai báo PTKT: tên PTKT trùng tên lớp public TênLớp(ds tham số) {…} • Ví dụ: khai báo số phương thức khởi tạo cho lớp PS (26) Phương thức khởi tạo (tiếp) class PS { private int tu, mau; public PS() {tu = 0; mau = 1;} public PS(int n) { tu=n; mau=1;} public PS(int t, int m) { tu = t; mau = m;} public PS(PS p) { tu = p.tu; mau=p.mau;} } (27) Phương thức khởi tạo (tiếp) • Sử dụng phương thức khởi tạo: PS p1 = new PS(); // p1 = 0/1 PS p2 = new PS(5);// p2 = 5/1 PS p3 = new PS(5,7);// p3 = 5/7 PS p4 = new PS(p2);// p4 = 5/1 (28) Phương thức hủy • Chức phương thức hủy: thực thu hồi ô nhớ đối tượng • Khai báo phương thức hủy: protected void finalize() • Bộ thu gom rác (Garbage Collection - GC) • Java tự động thu hồi và giải phóng ô nhớ cho các đối tượng không còn dùng (29) Phương thức hủy (tiếp) • Ví dụ minh họa: class Finalizer { int count; public Finalizer(int i) { count=i; System.out.println("Tao doi tuong thu "+count); } protected void finalize() { System.out.println("Huy tuong thu "+count); super.finalize(); } } (30) Phương thức hủy {3} public class TestFinalize { public static void main(String args[]) { double a[]; for (int i=0;i<100;i++) {new Finalizer(i); a = new double[10000];} } } (31) Kết thực chương trình (32) Luyện tập - lớp PS PS - int - int tu mau + PS() + PS(int n) + PS(int t, int m) + PS(PS p) + void ganTu(int t) + int layTu() + void ganMau(int m) + int layMau() - void rutGon() + void tang(int n) + void gap(int n) + PS cong(int n) + PS cong(PS p) + PS tru(int n) + PS tru(PS p) + PS nhan(int n) + PS nhan(PS p) + PS chia(int n) + PS chia(PS p) + String toString() + void hienThi() + int soSanh(PS p) (33) Luyện tập – Lớp PS • Khai báo lớp sử dụng lớp PS đã định nghĩa thực hiện: • Tạo phân số p=1/2, q=5/7 • Thực r = p+q; Hiển thị r • Thực t = 2*p - p/q; Hiển thị t • So sánh phân số p, q cho biết kết • Tạo mảng phân số chứa phân số: 1/2, 13/2, 5/7, 6/9, 30/23 Sắp xếp theo thứ tự tăng in kết lên màn hình (34) Thành phần tĩnh • Là thành phần dùng chung cho đối tượng tạo từ lớp • Khai báo thuộc tính tĩnh <phạm vi> static <kiểu liệu> <tên thuộc tính> • Khai báo phương thức tĩnh <phạm vi> static <kiểu liệu> <tên phương thức>(<danh sách tham số>) (35) Thành phần tĩnh (tiếp) • Ví dụ: class A{ int x; static int y; } A o1 = new A(), o2= new A() ; o1.x=5; o1.y=7; o2.x=10; o2.y=9; System.out.println(o1.y);?? (36) Thành phần tĩnh (tiếp) • Thành phần tĩnh có thể thao tác qua tên lớp Chẳng hạn với ví dụ trên có thể thực hiện: A.y = 5; • Trong phương thức tĩnh ta phép dùng các phương thức tĩnh liệu tĩnh (37) Thành phần tĩnh (tiếp) • Ví dụ: class A{ int x; static int y; static void pt1() { y=1;}//x = 1? void pt2() { x=1;y=1;} } (38) Thành phần tĩnh (tiếp) • Ví dụ: class StaticClass { static int count=0; private int data;StaticClass(int d){ data = d; count++;} public public void display(){ System.out.println("So doi tuong: "+ count + " du lieu= "+data);} } (39) Thành phần tĩnh (tiếp) class StaticTest { public static void main(String args[]){ StaticClass a= new StaticClass(1); a.Display(); StaticClass b= new StaticClass(2); a.Display();b.Display(); } } (40) Thành phần • Thành phần là thuộc tính có giá trị cố định đối tượng • Khai báo thành phần hằng: final <kiểu liệu> tênThuộcTính=<giá trị>; • Ví dụ: khai báo PI = 3.14 public final float PI = 3.14; (41) Bài tập Bài 1: Cài đặt lớp NTN (ngày/tháng/năm) • Viết chương trình sử dụng lớp vừa định nghĩa: • Tạo đối tượng n1=1/1/2006, n2=10/9/2007 • Tính khoảng cách hai ngày • So sánh hai ngày (42) Sơ đồ lớp NTN NTN - int - int thang - int nam + NTN() + NTN(int nam) + NTN(int ng, int th, int na) + NTN(NTN ntn) + void datNgay(int ngay) + int layNgay() + void datThang(int thang) + int layThang() + void datNam(int nam) + int layNam() -int songay(int th, int na) - NTN cong1ngay() - NTN tru1ngay() + NTN cong(int n) + NTN tru(int n) + int tru(NTN ng) + String toString() + void HienThi() + int SoSanh(NTN ntn) (43) Bài tập • Bài 2: Khai báo lớp ma trận số nguyên cho có thể khởi tạo, gán giá trị, truy xuất đến phần tử, cộng, trừ, nhân các ma trận • Dùng lớp này để minh họa các thao tác: + Tạo ma trận m1(3,3), m2(3,3) + Tìm vị trí phần tử lớn ma trận m1 + Cộng hai ma trận m3 = m1 + m2 + Trừ hai ma trận m4 = m1 - m2 + Nhân hai ma trận m5 = m1 × m2 (44) MATRAN Sơ đồ lớp MATRAN - int[][] mt - int soDong - int soCot + MATRAN(int d, int c) +MATRAN(int[][]mang, int m, int n) + MATRAN(MATRAN mt) + int laySoDong() + int laySoCot() + int layGiaTri(int d, int c) + void ganGiaTri(int d, int c, int gt) + MATRAN cong(MATRAN m) + MATRAN tru(MATRAN m) + MATRAN nhan(MATRAN m) + void hienThi() (45) Truyền tham số các phương thức Việc truyền tham số các phương thức Java quy định sau: • Nếu tham số là các liệu nguyên thủy như: int, boolean, char, float, … thì tham số truyền theo trị • Ví dụ: xét hàm đổi giá trị hai biến nguyên sau không thực chức mong muốn (46) Ví dụ class ThamTri{ public static void doigiatri(int x, int y) { int tg = x; x=y; y=tg; } public static void main(String args[]) { int i=5, j=7; doigiatri(i, j); System.out.println(“i=”+ i +” j=“+j); } } (47) Truyền tham số … (tiếp) • Nếu tham số là các đối tượng thì truyền theo tham chiếu • Việc truyền các đối tượng thực chất là tham chiếu đến các đối tượng • Ví dụ: khai báo lớp myInt để thao tác với số nguyên (dùng cho truyền tham chiếu) (48) Ví dụ class myInt { private int i; public myInt() { i = 0;} public myInt(int x) { i = x;} public void setValue(int x) { i = x;} public int getValue() { return i;} } (49) Ví dụ • Phương thức doigiatri() viết cho các tham số thuộc lớp myInt sau: public void doigiatri(myInt x, myInt y) { int tmp = x.getValue(); x.setValue(y.getValue()); y.setValue(tmp); } • Khi đó việc truyền tham số cho phương thức thực truyền theo biến: myInt m= new myInt(5), n = new myInt(7); doigiatri(m,n); (50) Truyền tham số… (tiếp) • Tham số là các mảng thì truyền theo biến • Ví dụ: phương thức xếp mảng số public static void sapXep(int a[], int n) { … } • Khi sử dụng: int b[]={5,7,8,2,3}; sapXep(b,5); // b = {2, 3, 5, 7, 8} (51) 10 Tổ chức các lớp chương trình • Trong chương trình Java có thể khai báo nhiều lớp • Ta có thể khai báo các lớp dùng chung file chương trình java: // thuvien.java class Lop1 { …} class Lop2 { …} … (52) 10 Tổ chức các lớp … (tiếp) • Khi biên dịch: javac thuvien.java • Sẽ tạo các file: Lop1.class, Lop2.class, … • Tuy nhiên ta không thực các lớp này vì không có hàm main (53) 11 Biến CLASSPATH • Biến ClassPath chứa các đường dẫn đến các lớp mà biên dịch tìm kiếm • Quy định biến ClassPath: • Trong Windows: tạo biến môi trường • Trong DOS: set ClassPath = … • Ví dụ: set ClassPath = ;c:\ThuVien • Trong đó: Là thư mục hành (54) Bài thực hành số • Bài Viết thư viện lớp SoHoc chứa các phương thức: • soChan(int) • max(int,int) • max(double, double) • max(int, int, int) • max(int[],int) • sapXep(int[], int) • inMang(int[], int) (55) • Sử dụng lớp SoHoc thực hiện: • Kiểm tra số là số chẵn hay lẻ • Tìm số lớn số nguyên, số thực, số nguyên • Tìm số lớn mảng • Sắp xếp mảng • Bài Cài đặt lớp NTN • Bài Lớp ma trận các phân số (56) Bài Hãy tự tổ chức các lớp để quản lý các tài khoản ATM ngân hàng cho các tài khoản có thể nạp tiền, rút tiền, chuyển tiền đến tài khoản khác, tính tổng số tiền các khách hàng có hệ thống Viết chương trình thực • Tạo danh sách tài khoản, tài khoản có sẵn số tiền tối thiểu là 100 • Tài khoản 1111111 nạp tiền vào tài khoản 1000 • Tài khoản 1111111 chuyển cho tài khoản 2222222 số tiền 500 • Tài khoản 2222222 rút số tiền 200 • In số tiền có các tài khoản • In tổng số tiền các tài khoản (57) 12 Một số lớp Java 62 (58) 12.1 Lớp Math • Lớp Math: chứa các hằng, các phương thức là các hàm toán học • Các hằng: E, PI • Hàm trả trị tuyệt đối abs(…) static int abs(int) static long abs(long) static float abs(float) static double abs(double) (59) 12.1 Lớp Math • Hàm trả phần nguyên trên: ceil(…) static double ceil(double d) • Hàm trả phần nguyên dưới: floor(…) static double floor(double d) • Hàm làm tròn đến phần nguyên: round(…) static int round(float d) static long round(double d) • Hàm trả số lớn số: static int max(int a, int b) static long max(long a, long b) (60) Lớp Math (tiếp) • Hàm lũy thừa: static double pow (double d1, double d2) • Hàm e mũ: static double exp(double d) • Hàm logarit số 10: static double log(double d) • Hàm bậc hai: static double sqrt(double d) (61) • Các hàm lượng giác: static double sin(double d) static double cos(double d) static double tan(double d) • Phương thức quy đổi: static double toRadians(double) static double toDegrees(double) • Hàm sinh số ngẫu nhiên khoảng từ 0.0 đến 1.0: static double random() (62) 12.2 Các lớp bao bọc • Lớp Integer: dùng bao bọc kiểu số nguyên • Phương thức khởi tạo: Integer(int x) • Các hằng: static final int MAX_ VALUE=2147483647; static final int MIN_ VALUE= -2147483648 (63) • Một số phương thức: static int parseInt(String) static Integer valueOf(String) static String toString(int) int intValue() byte byteValue() int compareTo(Integer) String toString() (64) Các lớp bao bọc (tiếp) • Các lớp tương tự (tự đọc) • Lớp Byte • Lớp Long • Lớp Float • Lớp Double • Lớp Boolean • Lớp Character (65) Luyện tập • Viết chương trình nhập mảng các đối tượng Integer Tính tổng các đối tượng, xếp các đối tượng theo thứ tự tăng và in lên màn hình (66) 12.3 Lớp Date • Thao tác với ngày, • Khởi tạo: Date(): ngày hành Date(String) Ví dụ: new Date(“10/02/2007”); Date(int year, int month, int day) Ví dụ: new Date(2007,10,2); Date(int year, int month, int day, int hour, int minute, int second) (67) Lớp Date (tiếp) • Một số phương thức: • int getDate(): ngày • int getMonth(): tháng 11 • int getYear(): năm tính từ 1900 • int getDay(): thứ tuần, - CN • int getHours(): 23 • int getMinutes(): phút 59 • int getSeconds(): giây 59 (68) Lớp Date (tiếp) void setDate(int) void setMonth(int) void setYear(int) void setDay(int) void setHours(int) void setMinutes(int) void setSeconds(int) int compareTo(Date) boolean equals(Date) (69) Ví dụ • Chương trình cho biết Anh (chị) sinh vào thứ mấy? (70) Đọc thêm • Các lớp liên quan đến thời gian: • DateFormat • Calendar • GregorianCalendar • Locate (71) 12.4 Lớp String • Khởi tạo: String str = “xâu ký tự”; String str = new String(“xâu ký tự”); • Một số phương thức: • int length(): trả chiều dài xâu ký tự • char charAt(int index): trả ký tự vị trí index (72) Lớp String (tiếp) • boolean equals(String str): so sánh hai xâu ký tự có giống không • boolean equalsIgnoreCase(String str): so sánh hai xâu ký tự không phân biệt chữ hoa và chữ thường • boolean startWith(String str): kiểm tra xâu có bắt đầu xâu str không • boolean endWith(String str): kiểm tra xâu có kết thúc xâu str không (73) Lớp String (tiếp) • int compareTo(String str): so sánh xâu ký tự với xâu str, kết trả số dương xâu ký tự lớn xâu str, hai xâu nhau, số âm xâu ký tự nhỏ xâu str • String toUpperCase(): chữ thường -> chữ hoa • String toLowerCase(): chữ hoa->thường • String trim(): cắt bỏ khoảng trống đầu và cuối (74) Lớp String (tiếp) • String substring(int startIndex) • String substring(int startIndex, int endIndex) • static String valueOf(boolean b) • static String valueOf(int i) • static String valueOf(long l) • static String valueOf(float f) • static String valueOf(double d) (75) Lớp String (tiếp) • int indexOf(int ch) • int indexOf(int ch, int fromIndex) • int indexOf(String str) • int indexOf(String str, int fromIndex) • int lastindexOf(int ch) • int lastindexOf(int ch, int fromIndex) • int lastindexOf(String str) • int lastindexOf(String str, int fromIndex) (76) Lớp String (tiếp) • String replace(char, char) • String replaceAll(String s1, String s2) • String replaceFirst(String s1, String s2) • String[] split(String st) (77) Ví dụ: tạo lớp TVString chứa các hàm xâu ký tự TVString + int dem(String s, char c) + int dem(String s1, String s2) + int demTu(String s) + String ten(String ht) + String ho(String ht) (78) Cài đặt TVString class TVString { public static int dem(String s, char c) { int d=0; for(int i=0; i<s.length(); i++) if(s.charAt(i)==c) d++; return d; } (79) Cài đặt TVString (tiếp) public static int dem(String s1, String s2) { int n,d=0; n=s1.indexOf(s2); while (n>=0) { d++; n=s1.indexOf(s2,n+s2.length()); } return d; } (80) Cài đặt TVString (tiếp) public static int demTu(String s) { int n,d=0; if (s.length()>0) d=1; n=s.indexOf(' '); while (n>=0) { d+ +; n=s.indexOf(' ',n+1); } return d; } (81) Cài đặt TVString (tiếp) public static String ten(String ht) { int n; String kq; ht=ht.trim(); n = ht.lastIndexOf(" "); kq = ht.substring(n+1); return kq; } (82) Cài đặt TVString (tiếp) public static String ho(String ht) { int n; String kq; ht=ht.trim(); n = ht.indexOf(" "); kq = ht.substring(0,n); return kq; } (83) class VDString { public static void main(String args[]) { String s="Nguyen Van Anh"; System.out.println("So ky tu a xau la " + TVString.dem(s,'a')); System.out.println("So xau \"an\" xau la " + TVString.dem(s,"an")); System.out.println("So tu xau la " + TVString.demtu(s)); System.out.println("Ten la " + TVString.ten(s)); System.out.println("Ho la " + TVString.ho(s)); } } (84) 12.5 Lớp StringBuffer • Lớp StringBuffer: dùng cho các xâu ký tự có thể thay đổi • Khởi tạo: • StringBuffer(String) • StringBuffer(int) (85) Lớp StringBuffer (tiếp) • Một số phương thức: • int length() • char charAt() • void setCharAt(int index, char ch) • StringBuffer append(String str) • StringBuffer insert(int offset, String str) • StringBuffer delete(int index) • StringBuffer delete(int start, int end) (86) Lớp StringBuffer (tiếp) • int indexOf(int ch) • int indexOf(int ch, int fromIndex) • int indexOf(String str) • int indexOf(String str, int fromIndex) • int lastindexOf(int ch) • int lastindexOf(int ch, int fromIndex) • int lastindexOf(String str) • int lastindexOf(String str, int fromIndex) (87) Lớp StringBuffer (tiếp) • StringBuffer reverse(): đảo ngược xâu • int capacity(): khả chứa • void ensureCapacity(int minCap): đặt khả chứa • void setLength(int newLen): đặt chiều dài • String toString(): chuyển thành xâu (88) Luyện tập • Cài đặt các phương thức mã hóa và giải mã nguyên âm xâu ký tự sử dụng lớp StringBuffer • Cài đặt phương thức chuẩn hóa xâu họ tên (89) Bài thực hành số • Bài Viết các phương thức trên xâu ký tự: • Tạo xâu gồm n ký tự ch • Tạo xâu gồm n xâu str • Xóa ký tự ch • Xóa xâu ký tự str • Mã hóa xâu theo source, destination • Chuẩn hóa các câu xâu • Tách xâu thành mảng các từ (90) Bài thực hành số (tiếp) • Bài Khai báo lớp SV với sơ đồ: SV -hoTen -ngaySinh -dtb + SV(String, Date, float) + layHoten() +… + layHo() + layTen() + layDem() + layTuoi() + layXepLoai() 96 (91) DSSV -SV[] -soSV + DSSV(int) + them(SV) + laySV(int) + hienThi() + sapHoten() + sapTuoi() + sapDTB() + timTen(String) + lietKeXepLoai(String) + xoa(String) (92) • Chương trình: • Tạo danh sách gồm sinh viên • Sắp xếp danh sách theo họ tên • Liệt kê sinh viên giỏi • Tìm sinh viên tên Nam • Xóa sinh viên đầu tiên tên Hòa • Tính tuổi trung bình • Tăng DTB lên 0.5 cho SV sinh trước năm 1980 (93)