Bài giảng Lập trình hướng đối tượng: Chương 3 Đóng gói và xây dựng lớp, tạo và sử dụng đối tượng cung cấp cho người học những kiến thức như: Trừu trượng hóa dữ liệu; Đóng gói và xây dựng lớp; Tạo và sử dụng đối tượng. Mời các bạn cùng tham khảo!
8/31/17 Mục tiêu học n Bộ môn Công nghệ Phần mềm Viện CNTT & TT Trường Đại học Bách Khoa Hà Nội n n Nêu chất, vai trị trừu tượng hóa Giải thích đóng gói che giấu thông tin Xây dựng lớp n LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Bài 03 Đóng gói xây dựng lớp, tạo sử dụng đối tượng n n Định nghĩa lớp, thực ẩn Tạo phương thức, trường/thuộc tính Tạo sử dụng đối tượng n n n Phương thức khởi tạo Khai báo khởi tạo đối tượng Sử dụng đối tượng Nội dung Nội dung Trừu trượng hóa liệu Đóng gói xây dựng lớp Tạo sử dụng đối tượng 3 Trừu trượng hóa liệu Đóng gói xây dựng lớp Tạo sử dụng đối tượng 8/31/17 1.1 Trừu tượng hóa n Giảm thiểu tinh lọc chi tiết nhằm tập trung vào số khái niệm/vấn đề quan tâm thời điểm n n n 1.1 Trừu tượng hóa (2) “abstraction – a concept or idea not associated with any specific instance” Ví dụ: Các định nghĩa tốn học n Trừu tượng hóa điều khiển: Sử dụng chương trình (subprogram) luồng điều khiển (control flow) n Ví dụ: a := (1 + 2) * n n loại trừu tượng hóa n n Trừu tượng hóa liệu: Xử lý liệu theo cách khác n Trừu tượng hóa điều khiển (control abstraction) Trừu tượng hóa liệu (data abstraction) Nếu khơng có trừu tượng hóa điều khiển, LTV phải tất ghi, bước tính tốn mức nhị phân… Ví dụ: Kiểu liệu n Sự tách biệt rõ ràng đặc tính trừu tượng kiểu liệu chi tiết thực thi cụ thể kiểu liệu 1.2 Trừu tượng hóa liệu OOP n n n Đối tượng thực tế phức tạp Cần đơn giản hóa, bỏ qua chi tiết khơng cần thiết Chỉ “trích rút” lấy thông tin liên quan, thông tin quan tâm, quan trọng với toán 8/31/17 1.2 Trừu tượng hóa liệu (2) n n Trừu tượng hóa cách nhìn cách biểu diễn thực thể bao gồm thuộc tính liên quan ngữ cảnh Tập hợp thể thực thể thành nhóm có chung thuộc tính gọi Lớp (class) unclassified "things" n organisms, mammals, humans 11 n 12 organisms, mammals, dangerous mammals 13 8/31/17 1.3 Lớp vs Đối tượng n n n Lớp mơ hình khái niệm, mơ tả thực thể Lớp mẫu, định nghĩa thuộc tính phương thức chung đối tượng Một lớp trừu tượng hóa tập đối tượng u u u Biểu diễn lớp UML Đối tượng vật thật, thực thể thực Đối tượng thể (instance) lớp, liệu đối tượng khác khác Mỗi đối tượng có lớp xác định liệu hành vi Professor n Tên lớp n Cấu trúc (thuộc tính) - name - employeeID : UniqueId - hireDate - status - discipline - maxLoad + submitFinalGrade() + acceptCourseOffering() + setMaxLoad() + takeSabbatical() + teachClass() Hành vi (thao tác) 14 Một thuộc tính đặc tính đặt tên lớp mô tả khoảng giá trị mà thể đặc tính chứa n Lớp (class) biểu diễn hình chữ nhật với thành phần: n Thuộc tính (attribute) gì? n n Một lớp khơng có thuộc tính có số lượng thuộc tính Student Attributes - name - address - studentID - dateOfBirth Lớp đối tượng UML Class :Student Student - name - address - studentID - dateOfBirth - name = “M Modano” - address = “123 Main St.” - studentID = - dateOfBirth = “03/10/1967” Objects sv2:Student - name = “D Hatcher” - address = “456 Oak Ln.” - studentID = - dateOfBirth = “12/11/1969” 8/31/17 Nội dung 2.1 Đóng gói (Encapsulation) n Trừu trượng hóa liệu Đóng gói xây dựng lớp Tạo sử dụng đối tượng Một đối tượng có hai khung nhìn: n n Bên trong: Chi tiết thuộc tính phương thức lớp tương ứng với đối tượng Bên ngồi: Các dịch vụ mà đối tượng cung cấp cách đối tượng tương tác với phần lại hệ thống Client Methods Data 18 19 2.1 Đóng gói (2) n 2.1 Đóng gói (3) Dữ liệu/thuộc tính hành vi/phương thức đóng gói lớp Encapsulation n n Một đối tượng thực thể đóng gói, cung cấp tập dịch vụ định Một đối tượng đóng gói xem hộp đen – công việc bên ẩn so với client Dù thay đổi thiết kế/mã nguồn bên giao diện bên ngồi khơng bị thay đổi theo BankAccount - owner: String - balance: double + debit(double): boolean +credit(double) Input 20 Don’t know how it works, but it works! Output 21 8/31/17 2.2 Xây dựng lớp n 2.2 Xây dựng lớp (2) Thông tin cần thiết để định nghĩa lớp n Tên (Name) n n n Các phần liệu cần lấy trừu tượng hóa Danh sách thông điệp & thực thi n Các thơng điệp mà đối tượng nhận Lớp đóng gói thành viên (member) n Tên lớp nên mô tả đối tượng giới thật Tên lớp nên số ít, ngắn gọn, xác định rõ ràng cho trừu tượng hóa n Các trường/thuộc tính (field/attribute) Các hàm/phương thức (function/method): String owner; Danh sách phần tử liệu n n n double balance; BankAccount Attribute declarations - owner: String - balance: double Method declarations + debit(double): boolean +credit(double) 22 23 2.2 Xây dựng lớp (3) n n 2.2.1 Khai báo lớp Các lớp nhóm lại thành package n Package bao gồm tập hợp lớp có quan hệ logic với nhau, n Package coi thư mục, nơi tổ chức lớp, giúp xác định vị trí dễ dàng sử dụng lớp cách phù hợp Ví dụ: n Một số package có sẵn Java: java.lang, javax.swing, java.io… n Package ta tự đặt n n n Cách dấu “.” Quy ước sử dụng ký tự thường để đặt tên package Ví dụ: package oop.k52.cnpm; 24 n Cú pháp khai báo: package tenpackage; chi_dinh_truy_cap class TenLop { // Than lop n } chi_dinh_truy_cap: n public: Lớp truy cập từ đâu, kể bên package chứa lớp n Khơng có (mặc định): Lớp truy cập từ bên package chứa lớp 25 8/31/17 Ví dụ - Khai báo lớp 2.2.2 Khai báo thành viên lớp package oop.k52.cnpm; n Các thành viên lớp có định truy cập gần tương tự lớp public class Student { public … } Khơng có private Cùng lớp Cùng gói Khác gói 27 Ví dụ: private 2.2.2 Khai báo thành viên lớp (2) n 28 Các thành viên lớp có định truy cập gần tương tự lớp public Khơng có private Cùng lớp Cùng gói Yes Yes Yes Yes Yes No Khác gói Yes No No 29 class Student{ private String name; public String getName() { return this.name; } public void setName(String name) { this.name = name; } } 30 8/31/17 Ví dụ: private (2) a Thuộc tính class Student{ private String name; public String getName() { return this.name; } public void setName(String name) { this.name = name; } } class Manager{ private Student[] students; public initianize() { students = new Student[10]; students[0] = new Student(); //students[0].name = “Hung”; error students[0].setName(“Hung”); } } n n Các thuộc tính phải khai báo bên lớp Mỗi đối tượng có thuộc tính riêng n Giá trị thuộc tính thuộc đối tượng khác khác Student - name - address - studentID - dateOfBirth Nguyễn Thu Hương Nguyễn Hồng Nam Hải Phịng… Hà Nội… … 31 32 a Thuộc tính (2) n b Phương thức Thuộc tính khởi tạo khai báo n Các giá trị mặc định sử dụng không khởi tạo n n n Xác định cách đối tượng đáp ứng lại thông điệp Phương thức xác định hoạt động lớp Bất kỳ phương thức phải thuộc lớp BankAccount - owner: String - balance: double + debit(double): boolean +credit(double) boolean 33 34 8/31/17 * Kiểu liệu trả * Chữ ký phương thức (signature) n Mỗi phương thức phải có chữ ký riêng gồm: n n n Tên phương thức Số lượng tham số kiểu chúng n n Khi phương thức trả giá trị đối tượng bắt buộc phải có câu lệnh return để trả điều khiển cho đối tượng gọi phương thức Nếu phương thức khơng trả giá trị (void) khơng cần câu lệnh return Có thể có nhiều lệnh return phương thức; câu lệnh mà chương trình gặp thực thi 35 36 Ví dụ c Thành viên Public boolean checkOdd(int i) { if (i %2 ==0) return true; else return false; } n n Một thuộc tính/phương thức khơng thể thay đổi giá trị/nội dung trình sử dụng Cú pháp khai báo: chi_dinh_truy_cap final kieu_du_lieu TEN_HANG = gia_tri; n Public boolean checkOdd(int i) { return true; return false; //error } Ví dụ: final double PI = 3.141592653589793; public final int VAL_THREE = 39; private final int[] A = { 1, 2, 3, 4, 5, }; 37 8/31/17 package com.megabank.models; public class BankAccount { private String owner; private double balance; public boolean debit(double amount){ if (amount > balance) return false; else { balance -= amount; return true; } } public void credit(double amount){ balance += amount; } } 2.3 Che giấu liệu (Data hiding) BankAccount - owner: String - balance: double + debit(double): boolean +credit(double) n Dữ liệu che giấu bên lớp truy cập thay đổi phương thức bên n Tránh thay đổi trái phép làm sai lệch liệu 39 40 Cơ chế che giấu liệu n Các thành viên liệu n n n Chỉ truy cập từ phương thức bên lớp Chỉ định truy cập private để bảo vệ liệu Các đối tượng khác muốn truy nhập vào liệu riêng tư phải thông qua phương thức public 41 BankAccount - owner: String - balance: double + debit(double): boolean +credit(double) 43 10 8/31/17 Cơ chế che giấu liệu (2) n Bài tập: lớp BankAccount Vì liệu riêng tư Thơng thường lớp cung cấp dịch vụ để truy cập chỉnh sửa giá trị liệu n n n package demo; public class BankAccount { private String owner; private double balance; Accessor (getter): Trả giá trị thuộc tính (dữ liệu) Mutator (setter): Thay đổi giá trị thuộc tính Thường getX setX, x tên thuộc tính 44 public String getOwner() { return owner; } public void setOwner(String owner1) { owner = owner1; } public double getBalance() { return balance; } public void setBalance(double balance1) { balance = balance1; } 45 } Bài tập: lớp BankAccount Bài tập NhanVien -tenNhanVien: String package demo; public class BankAccount { private String owner; private double balance; public String getOwner() { return owner; } public void setOwner(String owner) { this.owner = owner; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } } n Viết mã nguồn cho lớp NhanVien hình bên biết: -luongCoBan: double Lương = Lương * Hệ số lương +LUONG_MAX: double n n n n 46 -heSoLuong: double +tangLuong(double):boolean Phương thức inTTin() hiển thị +tinhLuong(): double thông tin đối tượng NhanVien +inTTin() tương ứng Phương thức tangLuong(double) tăng hệ số lương lên lượng giá trị tham số double truyền vào Nếu điều làm cho lương nhân viên > lương tối đa cho phép khơng cho phép thay đổi, in thông báo trả false, ngược lại trả true Viết phương thức get set cho thuộc tính lớp NhanVien 47 11 8/31/17 Nội dung 3.1 Khởi tạo liệu n Trừu trượng hóa liệu Đóng gói xây dựng lớp Tạo sử dụng đối tượng Dữ liệu cần khởi tạo trước sử dụng n n n Lỗi khởi tạo lỗi phổ biến Với kiểu liệu đơn giản, sử dụng toán tử = Với đối tượng Cần dùng phương thức khởi tạo Student - name - address - studentID - dateOfBirth Nguyễn Thu Hương Nguyễn Hồng Nam Hải Phịng… Hà Nội… 48 n n 49 3.2 Phương thức khởi tạo Khởi tạo hủy bỏ đối tượng n … Mỗi đối tượng tồn hoạt động hệ điều hành cấp phát vùng nhớ để lưu lại giá trị liệu thành phần Khi tạo đối tượng HĐH gán giá trị khởi tạo cho liệu thành phần n Phải thực tự động trước người lập trình tác động lên đối tượng n Sử dụng hàm/phương thức khởi tạo Ngược lại kết thúc cần phải giải phóng hợp lý tất nhớ cấp phát cho đối tượng n Java: JVM n C++: Hàm hủy (destructor) 50 n n Là phương thức đặc biệt gọi tự động tạo đối tượng Mục đích chính: Khởi tạo cho thuộc tính đối tượng Student - name - address - studentID - dateOfBirth Nguyễn Thu Hương Nguyễn Hồng Nam Hải Phịng… Hà Nội… … 51 12 8/31/17 3.2 Phương thức khởi tạo (2) n Mỗi lớp phải chứa constructor n n n n 3.2 Phương thức khởi tạo (3) n Có nhiệm vụ tạo thể lớp Tên constructor trùng với tên lớp Constructor khơng có kiểu liệu trả Phương thức khởi tạo dùng định truy cập n n n Ví dụ: n public BankAccount(String o, double b){ owner = o; balance = b; } n public private Khơng có (mặc định – phạm vi package) Một phương thức khởi tạo khơng thể dùng từ khóa abstract, static, final, native, synchronized Các phương thức khởi tạo không xem thành viên lớp 52 53 3.2 Phương thức khởi tạo (4) n 3.3 Khai báo khởi tạo đối tượng Phương khởi tạo mặc định (default constructor) n n Là phương thức khởi tạo KHÔNG THAM SỐ public BankAccount(){ owner = “noname”; balance = 100000; } Nếu ta không viết phương khởi tạo lớp n n n n n Đối tượng tạo ra, thể hóa (instantiate) từ mẫu chung (lớp) Các đối tượng phải khai báo kiểu đối tượng trước sử dụng: n n JVM cung cấp phương thức khởi tạo mặc định Phương thức khởi tạo mặc định JVM cung cấp có định truy cập giống lớp Kiểu đối tượng lớp đối tượng Ví dụ: n String strName; n BankAccount acc; Một lớp nên có phương thức khởi tạo mặc định 54 55 13 8/31/17 3.3 Khai báo khởi tạo đối tượng (2) n Đối tượng cần khởi tạo trước sử dụng n n n n n n Sử dụng toán tử = để gán Sử dụng từ khóa new với constructor để khởi tạo đối tượng: n n 3.3 Khai báo khởi tạo đối tượng (3) n Một đối tượng khởi tạo mặc định null n Đối tượng thao tác thơng qua tham chiếu (~ trỏ) Ví dụ: Ví dụ: BankAccount account = new BankAccount(); 56 57 3.3 Khai báo khởi tạo đối tượng (4) n Cú pháp: Ten_lop ten_doi_tuong = new Pthuc_khoi_tao(ds_tham_so); Từ khóa new dùng để tạo đối tượng Tự động gọi phương thức khởi tạo tương ứng BankAccount acc1; acc1 = new BankAccount(); Có thể kết hợp vừa khai báo vào khởi tạo đối tượng 3.3 Khai báo khởi tạo đối tượng (5) Phương thức khởi tạo khơng có giá trị trả về, sử dụng với từ khóa new trả tham chiếu đến đối tượng n n n Mảng đối tượng khai báo giống mảng liệu Mảng đối tượng khởi tạo mặc định với giá trị null Ví dụ: Employee emp1 = new Employee(123456); Employee emp2; emp2 = emp1; Department dept[] = new Department[100]; Test[] t = {new Test(1),new Test(2)}; 58 59 14 8/31/17 Ví dụ Ví dụ class BankAccount{ private String owner; private double balance; } public class Test{ public static void main(String args[]){ BankAccount acc1 = new BankAccount(); public class BackAccount{ private String owner; private double balance; public BankAccount(){ owner = ”noname”; } } public class Test{ public static void main(String args[]){ BankAccount acc1 = new BankAccount(); } } } } Phương thức khởi tạo mặc định Java cung cấp Phương thức khởi tạo mặc định tự viết 60 61 Ví dụ public class BankAccount { private String owner; private double balance; public BankAccount(String name){ setOwner(name); } public void setOwner(String o){ owner = o; } } public class Test{ public static void main(String args[]){ BankAccount account1 = new BankAccount(); //Error BankAccount account2 = new BankAccount(“Hoang”); } } 3.4 Sử dụng đối tượng n n Đối tượng cung cấp hoạt động phức tạp kiểu liệu nguyên thủy Đối tượng đáp ứng lại thông điệp n 62 Toán tử "." sử dụng để gửi thông điệp đến đối tượng 63 15 8/31/17 3.4 Sử dụng đối tượng (2) n n public class BankAccount{ private String owner; private double balance; public BankAccount(String name) { Để gọi thành viên (dữ liệu thuộc tính) lớp đối tượng, sử dụng toán tử “.” Nếu gọi phương thức lớp tốn tử “.” không cần thiết setOwner(name); } public void setOwner(String o){ owner = o; } public String getOwner(){ return owner; } } public class Test{ public static void main(String args[]){ BankAccount acc1 = new BankAccount(“”); BankAccount acc2 = new BankAccount(“Hong”); acc1.setOwner(“Hoa”); System.out.println(acc1.getOwner() + “ ”+ 64 65 Bài tập n n n n package example; public class Student { private int year; private String name; name year phương thức khởi dựng n n n Student.java Viết lớp Student n Student(String name, int year) public Student(int year, String name) { this.year = year; this.name = name; } Tự tạo phương thức getter, setter cho đủ dùng Đảm bảo đóng gói, che dấu liệu Lớp Test n n n acc2.getOwner()); } Nhập số phần tử cho mảng Student (trong lớp học) Nhập Student In danh sách tên Student lớp hiển thị tổng số tuổi Student 66 public int getYear() { return year; } public String getName() { return name; } } 67 16 8/31/17 Test.java Tự tham chiếu – this package example; import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int N = scanner.nextInt(); Student[] cls = new Student[N]; n n for (Student s: cls){ String name = scanner.next(); int year = scanner.nextInt(); s = new Student(year, name); n } int total = 0; System.out.println("Danh sach lop: "); for (int i=0; i