Bài 3 - Cơ bản về lập trình hướng đối tượng trong Java. Nội dung chính trong chương này gồm có: Các khái niệm cơ bản của lập trình hướng đối tượng, đóng gói và xây dựng lớp, khai báo và sử dụng đối tượng, một số lớp tiện ích trong Java. Mời các bạn cùng tham khảo.
24/08/2015 BÀI CƠ BẢN VỀ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG TRONG JAVA Các khái niệm lập trình hướng đối tượng Khai báo sử dụng class Java 1 CÁC KHÁI NIỆM CƠ BẢN 24/08/2015 Lập trình hướng đối tượng gì? • Mơ hình hóa đối tượng giới thực thành đối • • • • tượng phần mềm Chương trình = Đối tượng + Thơng điệp Chương trình cấu thành đối tượng tương tác đối tượng (qua thơng điệp) Thuộc tính: đặc điểm, trạng thái đối tượng Hành vi: hành vi đối tượng Lớp vs đối tượng • Lớp (Class): định nghĩa thuộc tính phương thức chung nhóm đối tượng • Lớp trừu tượng, thuộc tính khơng mang giá trị cụ thể • Có thể liên tưởng đến kiểu liệu • Đối tượng (Object): thể cụ thể lớp, thuộc tính có giá trị xác định • Có thể liên tưởng đến biến • Lớp mơ hình hóa rút gọn thực thể thực tế • Chỉ mơ tả thuộc tính, phương thức quan tâm 24/08/2015 Lớp vs đối tượng myMoto:Motobike - model: “Dream II” - colour: “Dark Purple” - capacity: 100 Tên lớp Thuộc tính Phương thức Motobike - model - colour - capacity - start() - accelerate() - brake() - stop() Lớp - start() - accelerate() - brake() - stop() neighborMoto:Motobike - model: “SHi” - colour: “Dark Red” - capacity: 150 - start() - accelerate() - brake() - stop() Đối tượng Các nguyên lý HĐT 24/08/2015 Trừu tượng hóa • Loại bỏ thông tin cụ thể, giữ lại thông tin chung • Tập trung vào đặc điểm thực thể, làm cho khác biệt với thực thể khác • Phụ thuộc góc nhìn Phân cấp • Một nhóm đối tượng mang đặc điểm khác biệt với đối tượng khác tách thành nhóm Lặp lại bước ta có phân cấp Sinh vật Thực vật Hạt kín Hạt trần Động vật Có xương sống Cá Khơng xương sống Mức độ trừu tượng hóa tăng Chim 24/08/2015 Mơ-đun hóa Đóng gói • Mơ-đun hóa: Chia nhỏ hệ thống phức tạp thành đối tượng nhỏ • Đóng gói: Che giấu, ẩn chi tiết thực bên đối tượng • Một đối tượng có khung nhìn: từ bên trong, từ bên ngồi • Cung cấp cho đối tượng khác (client) giao diện • Tính suốt: Thay đổi việc thực thi bên không làm ảnh hưởng tới đối tượng khác Input Output Các phương thức Dữ liệu ĐÓNG GĨI VÀ XÂY DỰNG LỚP 10 24/08/2015 Đóng gói • Lớp đóng gói thành viên định điều khiển truy cập tới thành viên đó: • Thuộc tính • Phương thức • Tập hợp lớp nhóm lại thành gói (package) Mỗi lớp gói định điều khiển truy cập • Các từ khóa định điều khiển truy cập Java: • public: truy cập từ nơi • protected: truy cập từ gói từ lớp • Khơng định: truy cập từ gói • private: truy cập từ lớp 11 Các bước xây dựng lớp • Bước 1: Mơ hình hóa lớp đối tượng • Phát thuộc tính hành vi • Bước 2: Mơ tả phần tiêu để lớp • Bước 3: Định nghĩa thuộc tính • Bước 4: Định nghĩa phương thức khởi tạo (Constructor) • Bước 5: Định nghĩa phương thức 12 24/08/2015 Mơ hình hóa lớp đối tượng • Bước thực trừu tượng hóa đối tượng thực • Định nghĩa lớp cần có: • Tên lớp • Danh sách thuộc tính • (Có thể cần) Phương thức khởi tạo • Danh sách phương thức 13 Mô tả phần tiêu đề lớp • Cú pháp package pack.name; /**Javadoc*/ Modifier class ClassName{ //class’s body } Tiêu đề lớp (class header) • Trong đó: pack.name : tên gói /**Javadoc*/: thích để tạo tài liệu Javadoc (không bắt buộc) Modifier : định truy cập (chỉ public không định) ClassName : tên lớp, theo quy tắc định danh Java 14 24/08/2015 Khai báo thuộc tính • Cú pháp /**Javadoc*/ Modifier DataType attributeName; • Trong đó: /**Javadoc*/: thích để tạo tài liệu Javadoc (khơng bắt buộc) Modifier : định truy cập Datatype : kiểu liệu, lớp lồng (nested class) attributeName : tên thuộc tính, theo quy tắc định danh 15 Khai báo thành viên số • Cú pháp: Modifier final DataType CONST_NAME = value; • Trong đó: Modifier : định truy cập Datatype : kiểu liệu CONST_NAME : tên value : giá trị gán cho • Ví dụ public final int MAX_STUDENT = 100; 16 24/08/2015 Khai báo phương thức • Cú pháp /**Javadoc*/ Modifier DataType methodName(parameterList){ // method’s body } • Trong đó: /**Javadoc*/: thích để tạo tài liệu Javadoc (không bắt buộc) Modifier : định truy cập Datatype : kiểu liệu trả phương thức methodName : tên phương thức parameterList : danh sách tham số, bao gồm kiểu liệu tên tham số 17 Lệnh return • Nếu DataType void: phương thức khơng trả giá trị • Ngược lại, nội dung phương thức cần sử dụng lệnh return để trả giá trị có kiểu liệu tương ứng • Khi câu lệnh return thực hiện, phương thức kết thúc • Lưu ý: • Việc sử dụng return nhiều lần phương thức khiến chương trình cấu trúc • Nên sử dụng biến cục lưu tính giá trị trả trước sử dụng return • Cố gắng phương thức có câu lệnh return 18 24/08/2015 Các phương pháp truyền tham số • Khi xây dựng phương thức có nhận tham số, Java ln sử dụng cách thức truyền theo kiểu tham trị(pass-byvalue), tức truyền vào sao/giá trị tham số: • Tham số có kiểu liệu nguyên thủy: truyền vào giá trị tham số Do thay đổi giá trị phương thức không ảnh hưởng tới gốc • Tham số có kiểu liệu tham chiếu: truyền tham chiếu gốc • Chúng ta phân tích kỹ vấn đề sau 19 Phương thức khởi tạo (constructor) • Khi đối tượng tạo ra, phương thức đặc biệt gọi phương thức khởi tạo tự động gọi: • Gán giá trị ban đầu cho thuộc tính • Có thể thực số thao tác xử lý • Một lớp có nhiều phương thức khởi tạo • Cú pháp /**Javadoc*/ Modifier ClassName(parameterList){ // method’s body } • Phương thức khởi tạo mặc định (nên có) /**Javadoc*/ Modifier ClassName(){ // method’s body } 20 10 24/08/2015 Constructor /** Constructs a newly created Subject object by assigning initial values for attributes *@param initID : the ID of subject *@param initName : the name of subject *@param initQuota : the quota of subject *@param initCurrentEnrolment : the initial number of students enrolling */ định truy cập thành viên public Subject(String initID, String initName, int initQuota, int initCurrentEnrolment){ this.subjectID = new String(initID); this.subjectName = new String (initName); this.quota = initQuota; this.currentEnrolment = initCurrentEnrolment; } 31 enrolStudent() /** Enrols a student into course*/ public void enrolStudent(){ System.out.print("Enrolling student… "); if (currentEnrolment < quota){ ++currentEnrolment; System.out.println("Student enrolled in " + subjectName); } else System.out.println("Quota reached, enrolment failed"); } 32 16 24/08/2015 unEnrolStudent() /** Cancels an enrolment*/ public void unEnrolStudent(){ System.out.print("Un-enrolling student… "); if (currentEnrolment