Bài giảng Lập trình hướng đối tượng với Java - Chương 3: Lớp, kiểu dữ liệu trừu tượng
Định nghĩa 1 String:
String Str1=“Hello”;
String Str2= new String(“Hi”);
Nối String
String Str3= Str1 + Str2; // Str3=“HelloHi”
String Str4 = Str3 + 1; // Str4= “HelloHi1”
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”;
80 trang |
Chia sẻ: dntpro1256 | Lượt xem: 734 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Bài giảng Lập trình hướng đối tượng với Java - Chương 3: Lớp, kiểu dữ liệu trừu tượng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Chương 03LỚP – KIỂU DỮ LIỆU TRỪU TƯỢNGCLASS – ABSTRACT DATA TYPE1Ôn tậpADT : 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ó.2Mục tiêuNắ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.3Nội dung3.1- Cấu trúc 1 lớp và access modifiers3.2- Sử dụng một lớp3.3- Chỉ thị this3.4- Overloading một hành vi3.5- Hành vi khởi tạo (constructor)3.6- Chỉ thị super3.7- Hành vi hủy (destructor)3.8- Thành phần static3.9- Chỉ thị final3.10- Phương pháp giải bài toán với Java3.11- Chạy chương trình có tham số với JCreator3.12- Một số lớp cơ bản của Java43.1- Cấu trúc 1 lớp và access modifiersLớ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 chaKhai 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 modifierMỗi ngôn ngữ OOP quy định cú pháp riêng cho việc hiện thực lớp.5Cấu trúc một lớpField_1Field_2.......Method_1()Method_2()..........class BCác giới hạn truy cậpCho phép truy cập tự do (public)Chỉ cho phép trong cùng một gói truy cậpKhông cho bên ngoài truy cập (private).Chỉ cho lớp con truy cập (protected).Không cho phép lớp con hiệu chỉnh (final).Access Modifiersclass Alà con6Cú 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,) { }}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ập7Đặc tính truy xuấtModifierprivatefriendlyprotectedpublicCùng classYESYESYESYESCùng gói, khác classNOYESYESYESlớp con trong cùng gói với lớp chaNOYESYESYESKhác gói, khác lớpNONONOYESLớp con khác gói với lớp chaNONOYESYES83.2- Sử dụng một lớpĐịnh nghĩa biến đối tượng.Biến đối tượng trong Java là tham khảo (địa chỉ) của vùng nhớ chứa dữ liệu của đối tượng.obj1000data1000ClassName obj ;obj= new ClassName();9Thí dụ 1Lớp public thì tên file.java phải trùng với tên lớpVì khi bên ngoài truy cập, nhìn tên file là biết tên lớpErrorNếu không là lớp public, tên lớp và tên file có thể khác nhauVì lớp này chỉ dùng trong một gói (package)10Thí dụ 2từ 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 x11Thí dụ 3access modifier là private mà trong main vẫn truy cập được vì main nằm trong khai báo lớp12Thí dụ 4Sửa lại lớp VONGTRON: không có mainXâ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 methodcủa lớp VONGTRON13Thí dụ 5Lớ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.14Thí dụ 6Trong lớp VONGTRON,x,y,r có thuộc tínhprotected. Nhưng,lớp SDVT cùng thưmục với lớpVONGTRON nên cóthể truy cập thuộctính này.153.3- Chỉ thị thisKhi 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.16Thí dụ17Thí dụTruy cập thành phần qua từ khóa thisTruy cập thành phần không qua từ khóa this183.4- Overloading một hành viOverloading: 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.Chữ ký bao gồm:Số lượng tham số.Thứ tự các kiểu của các tham số.19Thí dụ3 hành vi cùng có tên làsetData203.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.Một lớp có thể có 0/1/n contructor.Cú pháp constructor [Modifier] ClassName ( Parameters) { }Chú ý: Constructor không có kiểu trả trị. 21constructor....Constructor không tham số còn được gọi là constructor chuẩn.Ngôn ngữ có sẵn 1 constructor chuẩn làm công việc xóa trống vùng nhớ chứa dữ liệu của đối tượng Trị 0/null.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.22Thí dụ: constructor của ngôn ngữ (gõ 3 phím)bxyz1000b0001000Nếu là constructor tự tạo thì việckhởi tạo trị ban đầu được ấn địnhbởi code trong constructor.23Thí dụ: constructor là mẫu khởi tạo đối tượngNế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.24Thí dụ: lớp có nhiều constructorViết lại default constructorconstructor tự tạoCopy constructor25Thí dụ: gọi hành vi trong constructor26Gợi ý khi xây dựng constructorViệ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.273.6- Chỉ thị superDùng để truy xuất dữ liệu hoặc hành vi kế thừa từ lớp cha.Gọi constructor của lớp chaGọi method thừa kế từ lớp cha28super...Trong 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 conbằng cách gọi hành vioutData của lớp charồi xuất cost. Error29super...Viết lại hành vi outData trong lớp con303.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.{ ..... ....... ClassName obj = new ClassName(); ...... ..... .....} Góc nhìn thời gian: Thời gian sống của đối tượngGóc nhìn nội dung văn bản chương trình: Tầm vực (scope) của đối tượngMộ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êngvà không hỗ trợ hành vi hủy.313.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ụcCode 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. StaticMember32Dữ liệu static- Thí dụTruy xuất static data bằng tên lớpTruy xuất static data bằng tên đối tượng thuộc lớp33Hành vi static- Thí dụNhận xétHà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ànhvi static thường có tham số khôngliên quan đến đối tượng thuộc lớp.34Code static- Thí dụCú pháp đưa một đoạn code static:static{ }Code static được thực thi ngay khi lớp có code này được tham khảo tới.35Code static- Thí dụCode static chỉ tham khảodữ liệu static36Code 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ự37Code static với constructorConstructor chuẩnkhông đụng đến thành phần stattic38Code static với constructortham khảo khi chưa có đối tượngtham khảo khi đã có đối tượngVì khi có đối tượng, constructorcó code làm thay đổi trị của nnên kết qủa đã khác đi.393.9- Chỉ thị finalLàm sao để không cho phép kế thừa từ một lớp ( lớp không con).Làm sao không cho phép sửa một dữ liệu ( muốn dữ liệu là hằng).Dùng chỉ thị final40final Data là hằng cấm sửa41final class là lớp không con42final method là hành vi không cho phép lớp con viết lại (override)433.10- Phương pháp giải bài toán với JavaBài toán đơn giảnBài toán phức tạp443.10.1- Bài toán đơn giảnMô tảcủabài toánDanh từđơn giảnĐộng từclass BaiToan{ public static void main(String args[]) { }}45Bài toán đơn giản -Thí dụViết chương trình xuất 100 số Fibonacci đầu tiên. Dãy Fibonacci : 1,1,2,3,5,8, 2 số đầu là 1, các số sau bằng tổng 2 số trước nóclass BaiToan{ public static void main (String args[]) { int t1=1, t2=1, t3=1; for (int i=1; i2) { t3= t1+t2; t1=t2; t2=t3; } System.out.println(t3 + “, ”); } }}463.10.2- Bài toán phức tạpMô tảcủabài toánDanh từphức tạp(cấu trúc)Động từclass BaiToan{}tác độngBài toán không qúa phức tạp// PropertiesKiểu TênField [=TrịKhởiTạo];// Mỗi động từ là 1 hành viType HànhVi (...){}public static void main (String args[]) { BaiToan obj= new BaiToan(...); obj.HànhVi_1(); obj.HànhVi_2(); .......}Thứ tự củacác động từ47Thí dụViết chương trìnhin ra 3 nhân viên (tên,lương)class NhânViên{ String Tên; long Lương; NhânViên( String t, long l) { Tên=t; Lương=l;} void Xuất() { System.out.println( Tên + “, “ + Lương); } public static void main (String args[]) { 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(); }}48Bài toán phức tạpMô tảcủabài toáncáckhái niệm(nhóm danh từ mô tả)Động từtác độngBài toán phức tạp. Xem các thí dụ ở các chương sauclass KháiNiệm1 { }class BaiToan{ KháiNiệm1 obj1 = new KháiNiệm1(); KháiNiệm2 obj2 = new KháiNiệm2(); public static void main (String args[]) { BaiToan obj= new BaiToan(...); obj.HànhViChung1(); obj.HànhViChung2(); ....... }}Thứ tự của các động từ mức cả bài toánclass KháiNiệm2 { }49Tóm tắtclass = MembersMember = Datum/methodaccess modifier: public, private, protectedKhông có access modifier được hiểu là “friendly”Từ khóa this: Chỉ thị....................................constructor là ..........................................super: Từ khóa truy cập lớp cha và nếu có thì phải xuất hiện ở dòng đầu tiên của constructor trong lớp con.50Tóm tắtchỉ thị static dùng để chỉ thị ....................................................................................Truy xuất thành phần static của một lớp bằng cách (1): ........................................................(2):.........................................................Ta có thể truy xuất đoạn code static mà không là hành vi của 1 lớp không?51Tóm tắtTậ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 ...................................52Bài tập:Bài 1:Viết chương trình xuất ra danh sách nhân viên gồm 10 người theo dạng:Mã Tên Ngày vào làm lươngNV001 Hoa 2004-07-21 10000.......................................................... (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 constructor53Bài tậpBà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ụ).54Chạy chương trình có tham số với JCreatorTrong JCreator, để chạy chương trình có tham số, ta phải tạo Project.Project: Dự án, một tập các file của một phần mềm.55Tạo Projecthoặc56Đặt tên cho project57Kết qủa: Project trống (chọn File view)58Thêm 1 file59Viết chương trình60Chỉ định tham số cho chương trình61Đặt tham số nhanh: 62Bà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.633.12- Một số lớp cơ bản của Java.Lớp ObjectLớp StringCác lớp gói (wrapper)Lớp Math643.12.1- Lớp ObjectLà lớp cha của mọi lớp trong java ( trực tiếp/gián tiếp)Được để trong gói java.lang (java.lang.Object)Đị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.65Lớp Object (tt)66Thí dụStudent2@18d107fKế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ôngphải là địa chỉ của biến đối tượng )67Nhé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ớpvà địa chỉ biến đối tượng68Giải thíchA a1String s45651112039247469609650113529961931322525358555a=54565111A a String s1String s26960965069609650HelloB b2639955445651116960965025358555biếnAddressvaluefields biến đối tượng a được đặt ở địa chỉ 20392474, có trị là địa chỉ ô nhớ 4565111. Ở địa chỉ 4565111 là một thực thể của lớp A (a=5). Hai chuỗi s1,s2 được đặt ở 2 địa chỉ khác nhau nhưng chúng cùng chỉ đến 1 thực thể là hằng chuỗi “Hello” được để ở địa chỉ 69609650. Đối tượng b được để ở ô 26399554 có trị là thực thể ở 25358555 gồm 2 thành phần mang trị là đối tượng a và s1.69Nhận xétThực thể của lớp là một vùng nhớ chứa dữ liệu của thực thể.Biến đối tượng mang trị là một tham chiếu đến thực thể của lớp. obj1= obj2; là phép gán địa chỉ tham chiếu giữa 2 đối tượng.Chú ý tình huống bên:String s1String s2100Hellobiếnvalues2=s1;100100Hello100100Hellos2=“Hi”;Hi703.12.2- Lớp String - chuỗi ký tựĐịnh nghĩa 1 String: String Str1=“Hello”; String Str2= new String(“Hi”); Nối String String Str3= Str1 + Str2; // Str3=“HelloHi” String Str4 = Str3 + 1; // Str4= “HelloHi1”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 youHelloForget me notStr1Str571Lớp String (tt)- Methods72Lớp String (tt)- Methods73Lớp String (tt)- Methods74Thí dụ về lớp StringCá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.753.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 obj1int x10005151000int x=5;Integer obj1= new Integer(15);Integer obj2= new Integer(“32”);321100Integer obj2110076Wrapper classesData typeWrapper classbooleanBooleanbyteBytecharCharacterdoubleDoublefloatFloatintIntegerlongLongshortShortĐọc Documentation để biết về các hành vi của các wrapper class77Wrapper-Thí dụ783.12.4- Lớp MathTrong gói java.langChứa các hàm xử lý toán học.Là lớp final.79Thí dụ:Hàm randomtrả trị [ 0.0, 1.0 [80
Các file đính kèm theo tài liệu này:
- bai_giang_lap_trinh_huong_doi_tuong_voi_java_chuong_3_1168_2021062.ppt