Bài giảng Lập trình hướng đối tượng - Chương 3: Lập trình hướng đối tượng với Java - Trần Minh Thái (Phần 1)
Tóm tắt Bài giảng Lập trình hướng đối tượng - Chương 3: Lập trình hướng đối tượng với Java - Trần Minh Thái (Phần 1): ...ínhCú pháp/**Javadoc*/: chú thích để tạo tài liệu Javadoc (không bắt buộc)Modifier: chỉ định truy cậpDatatype: kiểu dữ liệu, có thể là một lớp lồng (nested class)attributeName: tên thuộc tính, theo quy tắc định danh/**Javadoc*/Modifier DataType attributeName;Bước 3: Định nghĩa thuộc tínhKhai báo thà...ung cấp thông tin1. Kiểm tra ràng buộcBước 5: Định nghĩa phương thứcBước 5: Định nghĩa phương thứcCú pháp/**Javadoc*/: chú thích để tạo tài liệu Javadoc (không bắt buộc)Modifier: chỉ định truy cậpDatatype: kiểu dữ liệu trả về của phương thứcmethodName: tên phương thứcparameterList: danh sách các tha...yênsoLuongHienTai: Số lượng đăng ký hiện tại, số nguyênLớp HocPhanPhương thứcdangKy(): Đăng ký thêm một sinh viênhuyDangKy(): Huỷ đăng kýhienThi(): Hiển thị thông tin học phầnHocPhan(): Phương thức khởi tạoPhương thức getter, setterĐịnh nghĩa thuộc tính lớp HocPhanĐịnh nghĩa phương thức khởi tạo Địn...
Chương 3 Lập trình Hướng đối tượng với Java – P1TRẦN MINH THÁIEmail: minhthai@huflit.edu.vnWebsite: www.minhthai.edu.vn Cập nhật: 02 tháng 03 năm 2017Nội dungKhai báo lớp và đối tượng trong JavaPhương thức khởi tạoCác phạm vi trong Java, cách sử dụngCác khái niệm về hướng đối tượngLập trình hướng đối tượng (OOP)Mô hình hóa các đối tượng trong thế giới thực thành đối tượng phần mềm Chương trình = Đối tượng + Thông điệpMột đối tượng gồm cóThuộc tính: các đặc điểm, trạng thái của đối tượngHành vi: các hành vi/ chức năng của đối tượngLớp đối tượng là gì?Lớp đối tượng (class): định nghĩa danh sách các thuộc tính (dữ liệu) và các phương thức chung của một nhóm đối tượng nào đóLớp là khái niệm trung tâm của OOP, là sự mở rộng của khái niệm cấu trúc (struct)Lớp = thuộc tính + phương thứcLớp đối tượng là gì?Lớp được xem như một kiểu dữ liệu (kiểu đối tượng)Lớp giúp lập trình viên: Trừu tượng hóa dữ liệuĐóng gói và ẩn thông tinLớp là mô hình hóa rút gọn của thực thể trên thực tế, chỉ mô tả những thuộc tính, phương thức quan tâmĐối tượng là gì?Đối tượng (Object): là một thể hiện cụ thể của lớp, các thuộc tính có giá trị xác địnhĐối tượng được xem như là một biến có kiểu dữ liệu là lớpLớp đối tượng vs Đối tượng?Thể hiệnCác nguyên lý cơ bản của hướng đối tượngNguyên lý cơ bản của OOPTrừu tượng hoáLoại bỏ đi các thông tin cụ thể, giữ lại các thông tin chungTập trung vào các đặc điểm chính của thực thể, làm cho nó khác biệt với những thực thể khácPhụ thuộc vào góc nhìnTrừu tượng hoáKhái quáthóaKhái quáthóa1 5 7-3 8 .... Số nguyên( int )Người( PERSON )Danh từ chung trong ngôn ngữ tự nhiênattributesint, NGUOI, PERSONlà các ADTĐóng gói – Module hoáChia nhỏ hệ thống phức tạp thành các đối tượng nhỏ hơnĐóng gói: Che giấu, ẩn chi tiết thực hiện bên trongHành vi riêng/ nội (private, internal): hành vi xử lý dữ liệu bên trong của đối tượngCung cấp cho các đối tượng khác (client) một hành vi giao tiếp (public/ interface methods)Tính trong suốt: Thay đổi việc thực thi bên trong không làm ảnh hưởng tới các đối tượng khácPhân cấpMột nhóm đối tượng mang những đặc điểm khác biệt với những đối tượng khác có thể tách thành nhóm conLặp lại bước trên ta có cây phân cấpCách xây dựng lớp đối tượngXây dựng lớp đối tượngLớp đóng gói các thành viên và chỉ định điều khiển truy cập tới các thành viên:Thuộc tínhPhương thứcTập hợp các lớp được nhóm lại thành gói (package). Mỗi lớp trong gói cũng được chỉ định điều khiển truy cậpXây dựng lớp đối tượngCác từ khóa chỉ định điều khiển truy cập trong Java:public: có thể truy cập từ mọi nơiprotected: có thể truy cập từ trong gói hoặc từ các lớp conprivate: chỉ có thể truy cập từ chính lớp đóKhông chỉ định: có thể truy cập từ trong góiCác bước xây dựng lớp đối tượngBước 1: Mô hình hóa lớp đối tượng Phát hiện các thuộc tính và hành viBước 2: Mô tả phần tiêu đề của lớpBước 3: Định nghĩa thuộc tínhBước 4: Định nghĩa phương thức getter, setterBước 5: Định nghĩa phương thức constructorBước 6: Định nghĩa phương thứcBước 1: Mô hình hoá lớp đối tượngTa cần biết/ quan tâm những thông tin gì về một đối tượng thuộc lớp này thuộc tínhTa thực sự cần xử lý (tác động) gì từ bên ngoài lên đối tượng hành vi giao tiếpĐể có được hành vi giao tiếp, có cần thêm những xử lý mà bên ngoài không cần biết? hành vi nộiBước 1: Mô hình hoá lớp trừu tượngMột lớp cần có:Tên lớpDanh sách các thuộc tính (fields)Phương thức getter, setterPhương thức constructorCác phương thức: khởi tạo, cập nhật, kiểm tra ràng buộc, xử lý tính toán, cung cấp thông tinXác định thành phần thuộc tính (field)Xác định thuộc tínhĐối với mỗi đối tượng, xác định các thông tin cần lưu trữ. Sau đó lập bảng mô tả thuộc tính như sau:Nếu có ràng buộc liên thuộc tính thì lập thêm bảng sau:SttThuộc tínhKiểu/ lớpRàng buộc Diễn giảiSttMô tả ràng buộcThuộc tính liên quanGhi chúXác định thuộc tínhRàng buộc là các quy định, quy tắc áp đặt trên các giá trị thuộc tính của đối tượng trong lớp, sao cho đối tượng này thể hiện đúng với thực tếRàng buộc tĩnh: ràng buộc trên giá trị thuộc tínhRàng buộc động: ràng buộc trên biến đổi giá trị thuộc tínhVí dụ: “Lương của nhân viên ít nhất là 1.500.000 đồng” Tĩnh“Lương của nhân viên chỉ có thể tăng” Động23Ví dụ 1 xét lớp PhanSoSttThuộctínhKiểu/ lớpRàng buộc Diễn giải1tuSoSố nguyênTử số2mauSoSố nguyênmauSo 0Mẫu sốVí dụ 2 xét lớp MyDateSttThuộcTínhKiểu/ lớpRàng buộc Diễn giải1daySố nguyên1≤day≤31Ngày2monthSố nguyên1≤month≤12Tháng 3yearSố nguyênNăm26STTMô tả ràng buộcThuộc tính liên quanGhi chú1Nếu month là 4, 6, 9, 11 thì day tối đa là 30day, month2Nếu month là 2 và year nhuận thì day tối đa là 29Nếu month là 2 và year không nhuận thì day tối đa là 28day, month, yearVí dụ 2 xét lớp MyDate (tt)Khai báo lớp (class)Bước 2: Mô tả phần tiêu đề lớpCú pháp pack.name: tên gói/**Javadoc*/: chú thích để tạo tài liệu Javadoc (không bắt buộc)Modifier: chỉ định truy cập (chỉ có thể là public hoặc không chỉ định)ClassName: tên lớp, theo quy tắc định danh của Javapackage pack.name;Modifier class ClassName { Khai báo thuộc tính; Khai báo và định nghĩa phương thức}Bước 3: Định nghĩa thuộc tínhCú pháp/**Javadoc*/: chú thích để tạo tài liệu Javadoc (không bắt buộc)Modifier: chỉ định truy cậpDatatype: kiểu dữ liệu, có thể là một lớp lồng (nested class)attributeName: tên thuộc tính, theo quy tắc định danh/**Javadoc*/Modifier DataType attributeName;Bước 3: Định nghĩa thuộc tínhKhai báo thành viên hằngCú phápModifier: chỉ định truy cậpDatatype: kiểu dữ liệuCONST_NAME: tên hằngvalue: giá trị gán cho hằngVí dụ public final int MAX_STUDENT = 100;Modifier final DataType CONST_NAME = value;Bảo vệ dữ liệu của đối tượngThuộc tính của lớp thường được đặt chỉ định truy cập là privateclass CIRLCEint x, y, r;int BorderColor;int BkColor;public int getX()public void setX(int xx)public int getY()public void setY(int yy)public int getR()public void setR(int r)public double getPerimeter()public double getArea()Định nghĩa phương thức getter và setterBảo vệ dữ liệu của đối tượngTruy cập vào thuộc tính của đối tượng thông qua Phương thức setter (cập nhật giá trị của thuộc tính): che giấu và kiểm soát giá trị truyền cho thuộc tínhvà Phương thức getter (lấy giá trị của thuộc tính)Phương thức getter và setterprivate int intAttr;//Setter methodpublic void setIntAttr (int intAttr){ this.intAttr = intAttr;} //Getter methodpublic int getIntAttr (){ return this.intAttr;}!!!Từ khóa this cho phép tự tham chiếu đến chính đối tượng đóCó thể bổ sung lệnh kiểm tra giá trị truyền vàoVí dụVí dụ (tt)Định nghĩa phương thức constructorBước 4: Định nghĩa ConstructorKhi một đối tượng tạo ra, constructor được tự động gọi:Gán giá trị ban đầu cho các thuộc tínhCó thể thực hiện một số thao tác xử lýMột lớp có thể có nhiều constructorBước 4: Định nghĩa ConstructorĐặc điểmKhông có giá trị trả vềTên phương thức trùng với tên lớpCó thể có hoặc không có tham sốSử dụng phải có từ khóa newBước 4: Định nghĩa ConstructorCú pháp/**Javadoc*/Modifier ClassName(parameterList){ //định nghĩa phương thức} Các loại ConstructorCó ba loạiDefault: public ClassName ()Parameter: public ClassName (danh sách tham số)Copy: public ClassName (ClassName object)Default ConstructorNên cóKhông có tham sốMỗi lớp có duy nhất một default constructorParameter constructorTạo ra 01 đối tượng mới có thông tin thuộc tính mang các giá trị của tham số tương ứng được truyền vàoCopy ConstructorTạo ra 01 đối tượng mới có thông tin thuộc tính giống với 01 đối tượng đã cóCó 01 tham số là một đối tượng của cùng lớp Copy ConstructorToán tử gán (=) vs Copy ConstructorToán tử gán không tạo ra đối tượng mới: chỉ thực hiện phép gán giữa 2 đối tượng đã tồn tạiCopy Constructor để tạo một đối tượng mới và gán nội dung của một đối tượng đã tồn tại cho đối tượng mới vừa tạoLưu ý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/nullKhi một lớp đã có constructor thì constructor mặc định của ngôn ngữ không còn tác dụng nữaVí dụBài tậpĐịnh nghĩa các phương thức getter, setter và constructors cho lớpMyDate PhanSoĐịnh nghĩa phương thứcNhóm kiểm tra ràng buộc: Kiểm tra tính hợp lệ giá trị thuộc tính của đối tượngNhóm khởi tạo: Cung cấp giá trị ban đầu cho đối tượngNhóm cập nhật: Thay đổi giá trị thuộc tính của đối tượngNhóm xử lý tính toán: Xử lý tính toán các yêu cầu từ thông tin của đối tượngNhóm cung cấp thông tin: Cung cấp thuộc tính nội bộ của đối tượngBước 5: Định nghĩa phương thức2. Khởi tạo3. Cập nhật4. Xử lý, tính toán5. Cung cấp thông tin1. Kiểm tra ràng buộcBước 5: Định nghĩa phương thứcBước 5: Định nghĩa phương thứcCú pháp/**Javadoc*/: chú thích để tạo tài liệu Javadoc (không bắt buộc)Modifier: chỉ định truy cậpDatatype: kiểu dữ liệu trả về của phương thứcmethodName: tên phương thứcparameterList: danh sách các tham số, bao gồm kiểu dữ liệu và tên của tham số/**Javadoc*/Modifier DataType methodName(parameterList) { Định nghĩa phương thức}Giá trị trả vềtrue: Thoả ràng buộcfalse: Không thoả ràng buộcTham sốRàng buộc miền giá trị: Chỉ có 1 tham số ứng với tham số cần kiểm traRàng buộc liên thuộc tính: Có tham số là các thuộc tính liên quan53public boolean kiemTra... ( tham số )Kiểm tra ràng buộcCác phương thức thuộc nhóm khởi tạo và cập nhật có liên quan đến ràng buộc phải được bổ sung thêm kiểm tra ràng buộcViệc kiểm tra tham số thoả hoặc không thoả ràng buộc bằng cách gọi phương thức kiểm tra ràng buộc tương ứng54Lưu ýpublic boolean tenPhuongThuc ( Tham số ){ //Trả về true: thực hiện được //Trả về false: không thực hiện được boolean kq = false; if(Tham số thoả ràng buộc) { gán giá trị tương ứng cho thuộc tính của lớp kq = true; } return kq; }55hoặcpublic boolean Tên hàm ( Tham số ){ //Trả về true: thực hiện được //false: không thực hiện được if(Tham số không thoả ràng buộc) return false; gán giá trị tương ứng cho thuộc tính của lớp return true; }56Bài tậpGiả sử cần xử lý dãy các số nguyên (lớp MyArray)Xác định thuộc tínhLiệt kê các constructorLiệt kê các phương thứcThành viên lớpThành viên lớp: các thành viên có thể được truy cập mà không cần thông qua một đối tượngDùng từ khóa static Modifier static DataType attributeName;Modifier static DataType methodName(parameterList) { Định nghĩa phương thức}Modifier static final DataType CONST_NAME = value;Thành viên lớp vs Thành viên đối tượngThành viên lớpThành viên đối tượngCó thể truy cập thông qua tên lớp hoặc qua đối tượngChỉ được truy cập thông qua một đối tượngThuộc tính của các đối tượng có giá trị giống nhauThuộc tính của các đối tượng có giá trị khác nhauThay đổi giá trị thuộc tính của đối tượng này ảnh hưởng tới tất cả các đối tượng khác cùng lớpThay đổi giá trị thuộc tính của một đối tượng này là độc lập với các đối tượng khác cùng lớp!!! Một phương thức static chỉ có thể truy cập vào các thuộc tính static và chỉ có thể gọi các phương thức static của cùng lớpVí dụ 1Ví dụ 2Ví dụ 2 (tt)Tạo đối tượngSử dụng lớp đối tượngCú pháp ClassName objectName = new ClassName();ClassName: Tên lớp mà đối tượng tạo ra từ lớp đóobjectName: Tên đối tượngClassName(): Phương thức khởi tạoSử dụng lớp đối tượngTruy cập tới các thành viên của đối tượng qua toán tử ‘.’Lưu ý tới chỉ định điều khiển truy cậpCác đối tượng được khai báo mà không khởi tạo sẽ mang giá trị nullSử dụng lớp đối tượngVí dụCho bài toán đăng ký học phần. Hãy thiết kế lớp đối tượng theo yêu cầu sau:Đối tượng “học phần” (HocPhan) có các thông tin: Mã môn, tên môn, số lượng đăng ký tối đa và số lượng đăng ký hiện tạiCác chức năng: Cho phép người dùng đăng ký một SV vào lớp, hủy đăng ký một SV và hiển thị thông tin môn học, sao cho:Không thể đăng ký nữa nếu số đăng ký đã bằng định mứcKhông thể hủy đăng ký nếu không có sinh viênLớp HocPhanThuộc tínhmaHocPhan: Mã học phần, chuỗi ký tựtenHocPhan: Tên học phần, chuỗi ký tựsoLuongMax: Số lượng tối đa, số nguyênsoLuongHienTai: Số lượng đăng ký hiện tại, số nguyênLớp HocPhanPhương thứcdangKy(): Đăng ký thêm một sinh viênhuyDangKy(): Huỷ đăng kýhienThi(): Hiển thị thông tin học phầnHocPhan(): Phương thức khởi tạoPhương thức getter, setterĐịnh nghĩa thuộc tính lớp HocPhanĐịnh nghĩa phương thức khởi tạo Định nghĩa phương thức đăng ký học phầnĐịnh nghĩa phương thức huỷ đăng kýĐịnh nghĩa phương thức hiển thị thông tin học phầnSử dụng lớp HocPhanBài tậpViết thêm các phương thức setter và getter cho lớp HocPhanBổ sung kiểm tra ràng buộc cho số lượng tối đa phải [20..100] Viết lại chương trình cho phép thực hiện những yêu cầu sau: Thông tin của học phần được nhập từ bàn phímCho phép đăng ký thêm một sinh viên. Mỗi lần đăng ký xong, hỏi lại người dùng có tiếp tục không. Hiển thị thông tin môn học nếu người dùng không muốn tiếp tụcCho phép hủy đăng ký một sinh viên. Mỗi lần hủy đăng ký xong, hỏi lại người dùng có tiếp tục không. Hiển thị thông tin môn học nếu người dùng không muốn tiếp tụcVấn đề gán và so sánh đối tượngGán đối tượngobject2 = object1;object1 và object2 là các tham chiếu gán giá trị tham chiếuSo sánh 2 đối tượngSử dụng toán tử bằng (==) object1 == object2 Chỉ kiểm tra xem 2 tham chiếu có cùng trỏ đến một đối tượng không?public class SoSanhDoiTuong { private int value; public SoSanhDoiTuong() { this.setValue(0); } public SoSanhDoiTuong(int value) { this.setValue(value); } public int getValue() { return value; } public void setValue(int value) { this.value = value; }}public class SoSanhDoiTuongTest { public static void main(String []args) { SoSanhDoiTuong t1 = new SoSanhDoiTuong(10); SoSanhDoiTuong t2 = new SoSanhDoiTuong(10); System.out.println(" Gia tri t1 = " + t1.getValue()); System.out.println(" Gia tri t2 = " + t2.getValue()); System.out.println("* So sanh hai doi tuong:"); if(t1==t2) System.out.println(" t1 bang voi t2 "); else System.out.println(" t1 khac t2 "); }} Gia tri t1 = 10 Gia tri t2 = 10* So sanh hai doi tuong: t1 khac t2 public class SoSanhDoiTuongTest { public static void main(String []args) { SoSanhDoiTuong t1 = new SoSanhDoiTuong(10); SoSanhDoiTuong t2 = new SoSanhDoiTuong(); t2 = t1; System.out.println(" Gia tri t1 = " + t1.getValue()); System.out.println(" Gia tri t2 = " + t2.getValue()); System.out.println("* So sanh hai doi tuong:"); if(t1==t2) System.out.println(" t1 bang voi t2 "); else System.out.println(" t1 khac t2 "); }} Gia tri t1 = 10 Gia tri t2 = 10* So sanh hai doi tuong: t1 bang voi t2 So sánh 2 đối tượngPhương thức equals(Object)Trả về true nếu mọi thành viên của 2 đối tượng có giá trị bằng nhauTrả về false nếu ngược lại!!!Chỉ áp dụng trên các lớp của Java!!!Đối với các lớp định nghĩa mới: Không sử dụng được Cần sử dụng nguyên lý nạp chồng phương thức để viết lạipublic class SoSanhDoiTuongTest { public static void main(String []args) { SoSanhDoiTuong t1 = new SoSanhDoiTuong(10); SoSanhDoiTuong t2 = new SoSanhDoiTuong(10); System.out.println(" Gia tri t1 = " + t1.getValue()); System.out.println(" Gia tri t2 = " + t2.getValue()); System.out.println("* So sanh hai doi tuong:"); if(t1.equals(t2)) System.out.println(" t1 bang voi t2 "); else System.out.println(" t1 khac t2 "); }} Gia tri t1 = 10 Gia tri t2 = 10* So sanh hai doi tuong: t1 khac t2 public class SoSanhDoiTuong { private int value; public SoSanhDoiTuong() { this.setValue(0); } public SoSanhDoiTuong(int value) { this.setValue(value); } public int getValue() { return value; } public void setValue(int value) { this.value = value; } @Override public boolean equals(Object obj) { SoSanhDoiTuong dt2 = (SoSanhDoiTuong) obj; if (this.value == dt2.value) return true; else return false; }}public class SoSanhDoiTuongTest { public static void main(String []args) { SoSanhDoiTuong t1 = new SoSanhDoiTuong(10); SoSanhDoiTuong t2 = new SoSanhDoiTuong(10); System.out.println(" Gia tri t1 = " + t1.getValue()); System.out.println(" Gia tri t2 = " + t2.getValue()); System.out.println("* So sanh hai doi tuong:"); if(t1.equals(t2)) System.out.println(" t1 bang voi t2 "); else System.out.println(" t1 khac t2 "); }} Gia tri t1 = 10 Gia tri t2 = 10* So sanh hai doi tuong: t1 bang voi t2 Mảng đối tượngMảng đối tượngCú pháp ClassName[] arrayName = new ClassName[size];Trong đó:ClassName : Tên lớp mà đối tượng tạo ra từ lớp đóarrayName : Tên mảng đối tượngsize : Kích thướcCác phần tử sẽ mang giá trị nullMảng đối tượngHoặcClassName[] arrayName = {new ClassName(), ..., new ClassName()};!!!Số lần khởi tạo đối tượng là số lượng mảngBài tậpBổ sung vào chương trình đăng ký học phần một lớp quản lý học phần (QuanLyHocPhan) bao gồm các chức năng:Tạo danh sách các học phần được mở gồm các thông tin được người dùng nhập từ bàn phímCho phép đăng ký thêm một sinh viên cho một học phần trong danh sách học phần có sẵn. Mỗi lần đăng ký xong, hỏi lại người dùng có tiếp tục không. Cho phép hủy đăng ký một sinh viên của một học phần nào đó. Mỗi lần hủy đăng ký xong, hỏi lại người dùng có tiếp tục khôngHiển thị thông tin học phần nếu người dùng không muốn tiếp tụcQ&A
File đính kèm:
- bai_giang_lap_trinh_huong_doi_tuong_chuong_3_lap_trinh_huong.pptx