Bài giảng Đối tượng và lớp

Viết class  Tạo các đối tượng và các biến tham chiếu đối tượng  Constructors  Các bổ từ (public, private vàstatic)  Phương thức, biến Class và Instance  Phạm vi hoạt động của biến  Sử dụng từ khóa this  Tính đóng gói  Phương thức nạp chồng

pdf14 trang | Chia sẻ: haohao89 | Lượt xem: 2143 | Lượt tải: 1download
Bạn đang xem nội dung tài liệu Bài giảng Đối tượng và lớp, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
1ĐỐI TƯỢNG VÀ LỚP (Object & Class) 2 Ôn tập  ADT : 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 phương thứ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ó. 3 Nội dung  Viết class  Tạo các đối tượng và các biến tham chiếu đối tượng  Constructors  Các bổ từ (public, private và static)  Phương thức, biến Class và Instance  Phạm vi hoạt động của biến  Sử dụng từ khóa this  Tính đóng gói  Phương thức nạp chồng 4 Đối tượng (Objects)  Đối tượng đại diện cho một thực thể trong thế giới thật. vd: 1 ô tô, 1 con người, 1 hình tròn, 1 khoản tiền  Trong LTHDT, đối tượng là một thực thể hoạt động khi chương trình đang chạy.  Mỗi đối tượng trong hệ thống đều được xác định bằng 3 yếu tố duy nhất: định danh của đối tượng (identity), trạng thái (state), và các hành vi (behavior):  State = tập các data field (properties)  Behavior = tập các method  State xác định đối tượng, behavior xác định đối tượng làm cái gì. 5 Lớp đối tượng( Object Class)  Lớp là một khái niệm trừu tượng, dùng để chỉ một tập hợp các đối tượng có trong hệ thống. vd: Nhân Viên, Con Người, Xe Hơi ….  Lớp được dùng để biểu diễn đối tượng cho nên Lớp cũng có thuộc tính và phương thức :  Thuộc tính của lớp tượng ứng với thuộc tính của các đối tượng  Phương thức của lớp tượng ứng với các hành động của đối tượng  Một lớp có thể có hoặc không có thuộc tính, phương thức. Nếu không có thuộc tính và phương thức thì lớp trở thành lớp trừu tượng -> Lớp này không có đối tượng tương ứng. 6 Lớp và Đối tượng( Class – Object) Lớp và đối tượng có mối liên quan đến nhau, nhưng bản chất lại khác nhau:  Lớp là một khái niệm tồn tại khi phát triển hệ thống, mang tính khái niệm, trừu tượng.  Đối tượng là một thể hiện của lớp. Là một thực thể cụ thể tồn tại khi hệ thống đang hoạt động.  Tất cả các đối tượng thuộc về cùng 1 lớp sẽ có cùng các thuộc tính và các phương thức. 7Lập trình hướng đối tượng  Xác định những objects trong bài toán.  Nhân Viên, Công Ty  Sau khi các object được xác định, viết lớp miêu tả các attributes và behaviors của mỗi đối tượng. Giả sử công ty muốn viết một chương trình trả lương hàng tuần cho nhân viên của một công ty. Tính lương nhân viên được dựa trên số giờ làm việc. Chương trình phải tính phí bảo hiểm xã hội, bảo hiểm y tế cũng như thuế thu nhập. 8 Lập trình hướng đối tượng  Xác định những objects trong bài toán.  Nhân Viên, Công Ty  Sau khi các object được xác định, viết lớp miêu tả các attributes và behaviors của mỗi đối tượng. Những attributes của đối tượng Nhân Viên sẽ là những thuộc tính mà nhân viên “có”, như tên, địa chỉ, mã nhân viên, số sổ bảo hiểm, số giờ làm việc ... biến (variables) Những behaviors của đối tượng Nhân Viên là những cái gì mà đối tượng nhân viên “làm”, như tính lương của nhân viên, gởi mail nhắc nhân viên kiểm tra lương 1 lần 1 tuần,… phương thức (methods) 9 Các bài toán ví dụ  Viết chương trình tính diện tích, chu vi hình chữ nhật  Viết chương trình tính diện tích, chu vi hình tròn  Viết chương trình tính điểm trung bình của sinh viên, điểm trung bình= (điểm lý thuyết + điểm thực hành)/2. Chương trình cho phép nhập thông tin sv, tính điểm trung bình, in điểm sv 10 Các bài toán ví dụ  Viết chương trình tính diện tích, chu vi hình chữ nhật  Viết chương trình tính diện tích, chu vi hình tròn.  Viết chương trình tính điểm trung bình của sinh viên, điểm trung bình= (điểm lý thuyết + điểm thực hành)/2. Chương trình cho phép nhập thông tin sv, tính điểm trung bình, xuất thông tin sv. Object: Hình chữ nhật  Class Attributes: Chiều dài, chiều rộng  Variables Behaviors: Tính diện tích, tính ch vi Methods 11 Các bài toán ví dụ  Viết chương trình tính diện tích, chu vi hình chữ nhật  Viết chương trình tính diện tích, chu vi hình tròn  Viết chương trình tính điểm trung bình của sinh viên, điểm trung bình= (điểm lý thuyết + điểm thực hành)/2. Chương trình cho phép nhập thông tin sv, tính điểm trung bình, xuất thông tin sv Object: Hình tròn  Class Attributes: Bá kính  Variables Behaviors: Tính diện tích, tính chu vi Methods 12 Các bài toán ví dụ  Viết chương trình tính diện tích, chu vi hình chữ nhật  Viết chương trình tính diện tích, chu vi hình tròn  Viết chương trình tính điểm trung bình của sinh viên, điểm trung bình= (điểm lý thuyết + điểm thực hành)/2. Chương trình cho phép nhập thông tin sv, tính điểm trung bình, in điểm Object: Sinh viên  Class Attributes: Mã sv, họ tên, ngày sinh, nơi sinh, lớp, môn học, điểm lý thuyết, điểm thực hành, điểm trung bình Variables Behaviors: Nhập thông tin sinh viên, tính điểm trung bình, in điểm Methods 13 Mô hình hóa đối tượng ClassName - Attributes + Behaviors Properties Data Fields Variables Instance Data Methods 14 Mô hình hóa đối tượng Object: Hình chữ nhật  Class Attributes: Chiều dài, chiều rộng  Variables Behaviors: Tính diện tích, tính chu vi Methods Hình chữ nhật - Chiều dài - Chiều rộng + Tính diện tích + Tính chu vi 15 Mô hình hóa đối tượng Hình tròn - Bán kính + Tính diện tích + Tính chu vi Object: Hình tròn  Class Attributes: Bán kính  Variables Behaviors: Tính diện tích, tính chu vi Methods 16 Mô hình hóa đối tượng Object: Sinh viên  Class Attributes: Mã sv, họ tên, ngày sinh, nơi sinh, lớp, môn học, điểm lý thuyết, điểm thực hành, điểm trung bình  Variables Behaviors: Nhập thông tin sinh viên, tính điểm trung bình, in điểm Methods Sinh viên - Mã sv - Họ tên - Ngày sinh - Nơi sinh - Lớp - Môn học - Điểm lý thuyết - Điểm thực hành - Điểm trung bình + Nhập thông tin sinh viên + Tính điểm trung bình + In điểm 17 Cấu trúc 1 lớp và access modifiers  Lớp: Thực hiện 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ó.  Thực hiện lớp:  Khai báo mức cho phép sử dụng.  Khai báo lớp cha  Khai 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 modifier  Mỗi ngôn ngữ OOP quy định cú pháp riêng cho việc thực hiện lớp. 18 Cấu trúc một lớp Field_1 Field_2 ....... Method_1() Method_2() .......... class BCác giới hạn truy cập 1. Cho phép truy cập tự do (public) 2. Chỉ cho phép trong cùng một gói truy cập 3. Không cho bên ngoài truy cập (private). 4. Chỉ cho lớp con truy cập (protected). 5. Không cho phép lớp con hiệu chỉnh (final). Access Modifiers class A là con 19 Cú pháp khai báo class trong Java [Access Modifier] class CLASSNAME extends FATHERCLASSNAME { [Access Modifier] DataType1 Property1 [=Value]; [Access Modifier] DataType2 Property2 [=Value]; [Access Modifier] CLASSNAME( DataType Arg,…) { } [Access 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ập Cú pháp khai báo 1 phương thức  Modifier  static  abstract  final….. 20 Access_modifier Modifier Datatype Method_name (Parameter_list) { //body of method } 21 Access_modifier (Bổ từ truy xuất)  public: Cho phép các đối tượng khác truy xuất tự do.  private: Không cho phép các lớp bên ngoài truy xuất, đây là một bổ từ truy xuất giới hạn nhất.  protected: Cho phép các lớp con hoặc các lớp cùng package truy xuất.  Default access(package access): Cho phép các lớp trong cùng package truy xuất. 22 Đặc tính truy xuất Modifier private friendly protected public Cùng class YES YES YES YES Cùng gói, khác class NO YES YES YES lớp con trong cùng gói với lớp cha NO YES YES YES Khác gói, khác lớp NO NO NO YES Lớp con khác gói với lớp cha NO NO YES YES 23 Viết lớp HinhChuNhat class HinhChuNhat { double cdai, crong; public double DienTich() { return cdai * crong; } public double ChuVi() { return (cdai + crong)*2; } } Hình chữ nhật - Chiều dài - Chiều rộng + Tính diện tích + Tính chu vi 24 Viết lớp HinhTron class HinhTron { double bkinh; public double DienTich() { return Math.PI * bkinh * bkinh; } public double ChuVi() { return 2 * Math.PI * bkinh; } } HinhTron - bkinh : double + DienTich() : double + ChuVi() : double 25 Viết lớp SinhVien class SinhVien { String MaSV, HoTen, NoiSinh; Date NgaySinh; String Lop, MonHoc; double diemlt, diemth; public double DiemTB() { return (diemlt+diemth)/2; } public void InDiem () { System.out.println(MaSV+ “\t”+ HoTen+ ”\t”+ NgaySinh+ ”\t”+ NoiSinh+ ”\t”+ Lop+ ”\t”+ MonHoc+ ”\t”+ DiemTB()); } } SinhVien - MaSV : String - HoTen : String - NgaySinh : Date - NoiSinh : String - Lop : String - MonHoc : String - DiemLT : double - DiemTH : double + DiemTB() : double + InDiem() : void 26 Constructor  Constructor là một dạng phương thức đặc biệt, được gọi để xây dựng đối tượng.  Constructor thỏa 2 đặc tính sau:  Constructor phải cùng tên với tên class của nó  Constructor không có kiểu dữ liệu trả về, kể cả kiểu void  Một class có thể có nhiều constructor  Một constructor không có tham số được gọi là default constructor.  Nếu một lớp không có constructor nào được viết, thì trình biên dịch sẽ phát sinh một constructor trong lớp đó. Default constructor này là public, không có tham số, và không làm bất kỳ gì.  Các Constructor được gọi sử dụng toán tử new khi tạo một đối tượng. Nó đóng vai trò khởi tạo đối tượng.  Nếu là constructor tự tạo thì việc khởi tạo giá trị ban đầu được ấn định bởi code trong constructor.  Nế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. public ClassName (parameterList) { } 27 Constructor – Ví dụ public class Mushroom { public Mushroom(int size) { } public Mushroom() { } public Mushroom(boolean isMagic) { } public Mushroom(boolean isMagic, int size) { } public Mushroom(int size, boolean isMagic) { } } 28 Ví dụ: lớp có nhiều constructor Viết lại default constructor constructor tự tạo Copy constructor 29 Viết lớp HinhChuNhat class HinhChuNhat { double cdai, crong; public HinhChuNhat (double cd, double cr) { cdai = cd; crong = cr; } public double DienTich() { return cdai * crong; } public double ChuVi() { return (cdai + crong)*2; } } 30 Viết lớp HinhTron class HinhTron { double bkinh; public HinhTron (double bk) { bkinh = bk; } public HinhTron () { bkinh = 0.0; } public double DienTich() { return Math.PI * bkinh * bkinh; } public double ChuVi() { return 2 * Math.PI * bkinh; } } 31 Viết lớp SinhVien public double DiemTB() { return (diemlt+diemth)/2; } public void InDiem () { System.out.println(MaSV+ “\t”+ HoTen+ ”\t”+ NgaySinh+ ”\t”+ NoiSinh+ ”\t”+ Lop+ ”\t”+ MonHoc+ ”\t”+ DiemTB); } } class SinhVien { String MaSV, HoTen, NoiSinh Date NgaySinh; String Lop, MonHoc; double diemlt, diemth, diemtb; public SinhVien (String ma, String ht, Date ngs, String ns, String l, String mh, double lt, double th ) { MaSV = ma; HoTen = ht; NoiSinh = ns; NgaySinh = ngs; Lop = l; MonHoc = mh; diemlt = lt; diemth = th; } 32 Gợi ý khi xây dựng constructor  Việc thường làm là gán giá 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. 33 Sử dụng một lớp  Định nghĩa biến đối tượng.  Biến đối tượng trong Java là tham chiếu (địa chỉ) của vùng nhớ chứa dữ liệu của đối tượng. obj 1000 data 1000 ClassName obj ; obj= new ClassName(); 34 Sử dụng Constructor  Một constructor được sử dụng để tạo mới 1 đối tượng, bằng cách sử dụng từ khóa new  Nếu một class có nhiều constructor, chúng ta xác định constructor nào được gọi với các đối số sử dụng cùng với toán tử new.  Ví dụ: HinhChuNhat n; n = new HinhChuNhat(3,6); HinhChuNhat x = new HinhChuNhat(5,8); HinhTron t1 = new HinhTron(); HinhTron t2 = new HinhTron(5.0); 35 Sử dụng Constructor của lớp HinhTron class HinhTron { double bkinh; public HinhTron (double bk) { bkinh = bk; } public HinhTron () { bkinh = 0.0; } public double DienTich() { return Math.PI * bkinh * bkinh; } public double ChuVi() { return 2 * Math.PI * bkinh; } } Example: HinhTron t1 = new HinhTron(8.9); HinhTron t2 = new HinhTron(); 36 Sử dụng Constructor mặc định class HinhChuNhat { double cdai, crong; public HinhChuNhat (double cd, double cr) { cdai = cd; crong = cr; } public double DienTich() { return cdai * crong; } public double ChuVi() { return (cdai + crong)*2; } } Example: HinhChuNhat n1= new HinhChuNhat(8,10); HinhChuNhat n2= new HinhChuNhat(); 37 Sử dụng Constructor mặc định class HinhChuNhat { double cdai, crong; public HinhChuNhat (double cd, double cr) { cdai = cd; crong = cr; } public double DienTich() { return cdai * crong; } public double ChuVi() { return (cdai + crong)*2; } } Example: HinhChuNhat n1= new HinhChuNhat(8,10); HinhChuNhat n2= new HinhChuNhat(); X 38 Sử dụng Constructor mặc định class HinhChuNhat { double cdai, crong; public HinhChuNhat() { cdai = 0; crong = 0; } public HinhChuNhat (double cd, double cr) { cdai = cd; crong = cr; } public double DienTich() { return cdai * crong; } public double ChuVi() { return (cdai + crong)*2; } } Example: HinhChuNhat n1= new HinhChuNhat(8,10); HinhChuNhat n2= new HinhChuNhat(); 39 Chỉ thị this  Khi 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. 40 Ví dụ 41 Ví dụ: gọi hành vi trong constructor 42 Ví dụ: truy xuất thành phần Truy xuất thành phần qua từ khóa this Truy xuất thành phần không qua từ khóa this 43 this trong constructor  Để tránh code bị lặp lại, một constructor có thể sử dụng từ khóa this để gọi một constructor khác trong cùng lớp.  Nếu một constructor sử dụng từ khóa this để gọi một constructor khác trong lớp thì câu lệnh this phải xuất hiện ở dòng đầu tiên trong constructor, ngược lại trình biên dịch sẽ báo lỗi. 44 Ví dụ: this trong constructor class HinhChuNhat { double cdai, crong; public HinhChuNhat() { this(0,0); } public HinhChuNhat (double cd, double cr) { cdai = cd; crong = cr; } public double DienTich() { return cdai * crong; } public double ChuVi() { return (cdai + crong)*2; } } 45 Hành vi hủy (Destructor)  Là quá trình xóa một đối tượng  Một Destructor:  Giải phóng bộ nhớ được cấp phát  Không cho phép truy xuất các thuộc tính và phương thức 46 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ượng Góc nhìn nội dung văn bản chương trình: Tầm vực (scope) của đối tượng Mộ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êng và không hỗ trợ hành vi hủy. 47 Tạo một Object  Trong Java, sử dụng từ khóa new để khởi tạo một đối tượng.  Ví dụ: HinhChuNhat n1 = new HinhChuNhat(); HinhChuNhat n2 = new HinhChuNhat(8,10); HinhTron t; t = new HinhTron(5.5); Tham chiếu đối tượng sẽ được gán cho n1, n2, t ClassName object = new ClassName (…); ClassName object; object = new ClassName (…); 48 Truy xuất đối tượng  Tham chiếu dữ liệu của đối tượng: objectReference.data vd: n1.cdai hoặc t.crong  Gọi phương thức của đối tượng: objectReference.method vd: n1.DienTich() 49 Phương thức (method)  Cấu trúc của phương thức: Một phương thức là một tập các câu lệnh được nhóm lại với nhau nhằm thực hiện một công việc. 50 Phương thức (tiếp)  parameter profile gồm kiểu, thứ tự, và số tham số của một phương thức.  method signature (header) gồm tên phương thức và parameter profiles.  Các tham số khai báo trong method header được gọi là tham số hình thức (formal parameters).  Khi phương thức được gọi, các tham số hình thức được thay thế bởi các biến hoặc dữ liệu, được gọi là các tham số thực sự (actual parameters). 51 Phương thức (tiếp)  Một phương thức có thể trả về một giá trị. Kiểu của giá trị đó là kiểu dữ liệu của phương thức trả về.  Nếu phương thức không trả về một giá trị, kiểu trả về của phương thức dùng từ khóa void.  Ví dụ, kiểu giá trị trả về trong phương thức main là void. 52 myMethod(); myMethodcompute Gọi phương thức  Gọi phương thức ở trong cùng một class, thì chỉ cần dùng tên phương thức. 53 doIt helpMe helpMe();obj.doIt(); main Gọi phương thức  Gọi phương thức ở trong một lớp khác (đối tượng khác). Gọi thông qua đối tượng của nó. 54 Phạm vi các biến  Phạm vi của các biến static và instance là toàn bộ lớp. Chúng có thể được khai báo bất kỳ nơi nào trong lớp.  Phạm vi của biến cục bộ bắt đầu từ khi khai báo đến hết block chứa biến đó. Một biến cục bộ phải được khai báo trước khi sử dụng.  Một biến được khai báo bên trong một phương thức được gọi là biến cục bộ. 55 Biến cục bộ (Local Data)  Những biến cục bộ có thể được khai báo bên trong một phương thức.  Những tham số hình thức của một phương thức tự động tạo những biến cục bộ khi phương thức được gọi  Khi phương thức kết thúc, tất cả những biến cục bộ bị hủy (bao gồm cả những tham số hình thức)  Những biến thể hiện được khai báo tại mức class sẽ tồn tại với điều kiện đối tượng (object) tồn tại. 56 Biến thể hiện (Instance Data)  Biến cdai, crong trong class HinhChuNhat được gọi là instance data.  Biến instance thuộc một instance xác định, nó không được chia sẻ giữa các đối tượng trong cùng 1 class.  Mỗi khi đối tượng HinhChuNhat được tạo, biến cdai, crong mới cũng được tạo.  Một lớp khai báo kiểu dữ liệu cho biến nhưng nó không cấp phát bất kỳ bộ nhớ nào cho nó.  Các đối tượng của 1 lớp chia sẻ các định nghĩa phương thức, nhưng mỗi đối tượng có bộ nhớ riêng do đó hai đối tượng có thể có những trạng thái khác nhau. n1 5,7Cdai,crong n2 8,10Cdai,crong 57 Ví dụ class HinhChuNhat { double cdai, crong; public HinhChuNhat() { this(0,0); } public HinhChuNhat (double cd, double cr) { cdai = cd; crong = cr; } public double DienTich() { return cdai * crong; } public double ChuVi() { return (cdai + crong)*2; } } … public static void main(String[] agrs) { double dt1, dt2, cv1, cv2; HinhChuNhat n1 = new HinhChuNhat(); dt1 = n1.DienTich(); cv1 = n1.ChuVi(); // xuat ket qua tinh n1… HinhChuNhat n2 = new HinhChuNhat(8,10); dt2 = n2.DienTich(); cv2 = n2.ChuVi(); // xuat ket qua tinh n2… } 58  Encapsulation là một trong 4 khái niệm cơ bản về lập trình hướng đối tượng. (inheritance, polymorphism, và abstraction)  Encapsulation là kỹ thuật làm cho cá
Tài liệu liên quan