Công nghệ Java - Chương 6: Kế thừa, đóng gói trong java
Bạn đang xem 20 trang mẫu của tài liệu "Công nghệ Java - Chương 6: Kế thừa, đóng gói trong java", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- cong_nghe_java_chuong_6_ke_thua_dong_goi_trong_java.ppt
Nội dung text: Công nghệ Java - Chương 6: Kế thừa, đóng gói trong java
- CÔNG NGHỆ JAVA CH6. KẾ THỪA, ĐÓNG GÓI TRONG JAVA Quang Dieu Tran PhD 7/5/2021 1
- Package 7/5/2021 2
- Package • Một gói thư viện là tập hợp các lớp, các giao tiếp, các kiểu liệt kê và các chú thích. • Nó cung cấp các chức năng bảo vệ truy cập và quản lý không gian tên • Thao tác trên gói có 2 kỹ thuật: – KT đặt tên – KT điều khiển truy xuất 7/5/2021 3
- Package • Một gói là một nhóm các lớp và giao tiếp có quan hệ với nhau được tổ chức như 1 đơn vị trong không gian tên. • Gói giúp phân hoạch không gian tên lớp, giao diện thành những vùng dễ quản lý hơn. 7/5/2021 4
- Đặc điểm gói • Một gói có thể có nhiều gói con • Không được có hai thành viên trùng tên • Tên của gói được viết bằng chữ thường • Java có 2 loại gói: – Gói được định nghĩa trước – Gói được định nghĩa bởi người dùng 7/5/2021 5
- Định nghĩa gói • Để tạo 1 gói, ta đặt từ khóa package ngay phát biểu đầu tiên của tập tin nguồn. • Nếu bỏ qua khai báo package ➔ lớp sẽ được đặt vào gói mặc định. 7/5/2021 6
- Các bước định nghĩa gói • Bước 1: lựa chọn tên gói – Tên gói phải là chữ thường – Tên gói không được bắt đầu bằng java hoặc javax – Không được bắt đầu bằng số hoặc dấu nối (-) • Bước 2: tạo thư mục cùng tên với gói – Java sử dụng hệ thống thư mục để lưu trữ các gói ➔ các lớp được chứa trong thư mục cùng tên PackageName. 7/5/2021 7
- Các bước định nghĩa gói • Bước 3: đưa các tập tin nguồn vào trong gói – Thêm câu lệnh package vào dòng đầu tiên của mã nguồn. – Chỉ có duy nhất 1 câu lệnh package đối với mỗi tệp nguồn. • Bước 4: biên dịch và chạy ứng dụng – Khi biên dịch phải đảm bảo sử dụng tên lớp đầy đủ bao gồm cả tên gói. – Dùng dấu chấm để phân biệt một package với package cha của nó. 7/5/2021 8
- Định nghĩa gói • Java xem gốc của cây phân cấp gọi được định nghĩa ở biến môi trường CLASSPATH • Ví dụ: package java.awt.image; ➔ Được lưu trữ trong thư mục Java\awt\image với hệ điều hành Windows 7/5/2021 9
- Điều khiển truy xuất • Các quyền truy xuất: 7/5/2021 10
- Sử dụng gói • Java đưa ra phát biểu import để những lớp nào đó hay toàn bộ gói có thể lấy được➔có thể sử dụng lớp trực tiếp qua tên nó mà không cần dùng dấu chấm truy xuất. • Trong tập tin Java, khai báo import sẽ đứng liền sau phát biểu package; 7/5/2021 11
- Sử dụng gói • Ví dụ • Tất cả các gói chuẩn đều nằm trong gói tên là java ➔ phải nhập tên lớp và gói mà bạn muốn sử dụng. • Riêng gói java.lang có nhiều chức năng thông dụng➔được import ngầm định • Phát biểu import của gói chỉ có tác dụng trên các thành phần public của nó. 7/5/2021 12
- Kế thừa - Inheritance 7/5/2021 13
- Kế thừa trong thế giới thực 7/5/2021 14
- Kế thừa trong thế giới thực • Quá trình truyền các đặc tính và cách cư xử của cha mẹ cho con cái được gọi là kế thừa. • Mục đích: tránh tạo ra các đặc tính và hành vi đã có sẵn mà chỉ sử dụng lại những cái có sẵn đó để tạo nên các thực thể mới. 7/5/2021 15
- Kế thừa trong lập trình • Là một phần quan trọng và không thể thiếu trong lập trình hướng đối tượng. • Kế thừa cho phép bạn định nghĩa một lớp tổng quát nhất, sau đó định nghĩa thêm các lớp mới bằng cách thêm 1 số chi tiết vào lớp tổng quát này. 7/5/2021 16
- Abstract class 7/5/2021 17
- Lớp trừu tượng (abstract class) • Chúng ta có thể tạo ra các lớp cơ sở để tái sử dụng mà không muốn tạo ra đối tượng thực của lớp. – Các lớp Point, Circle, Rectangle chung nhau khái niệm cùng là hình vẽ Shape ➔ Giải pháp là khai báo lớp trừu tượng (abstract class) 7/5/2021 18
- Lớp trừu tượng (abstract class) • Lớp trừu tượng dùng để tạo ra khung làm việc chung. • Không thể tạo đối tượng từ lớp trừu tượng. 7/5/2021 19
- Ví dụ 7/5/2021 20
- Tái sử dụng • Tồn tại nhiều loại đối tượng có các thuộc tính và hành vi tương tự hoặc liên quan đến nhau – Person, Student, Manager, • Xuất hiện nhu cầu sử dụng lại các mã nguồn đã viết – Sử dụng lại thông qua copy – Sử dụng lại thông qua quan hệ has_a – Sử dụng lại thông qua cơ chế “kế thừa” 7/5/2021 21
- Tái sử dụng • Copy mã nguồn – Tốn công, dễ nhầm – Khó sửa lỗi do tồn tại nhiều phiên bản • Quan hệ has_a – Sử dụng lớp cũ như là thành phần của lớp mới – Sử dụng lại cài đặt với giao diện mới • Phải viết lại giao diện • Chưa đủ mềm dẻo 7/5/2021 22
- Ví dụ: has_a class Person { String name; Date bithday; public String getName() { return name; } } class Employee { Person me; double salary; public String getName() { return me.getName(); } } 7/5/2021 23
- Ví dụ: has_a class Manager { Employee me; Employee assistant; public setAssistant(Employee e) { } } Manager junior = new Manager(); Manager senior = new Manager(); senior.setAssistant(junior); // error 7/5/2021 24
- Kế thừa • Dựa trên quan hệ is_a • Thừa hưởng lại các thuộc tính và phương thức đã có • Chi tiết hóa cho phù hợp với mục đích sử dụng mới – Thêm các thuộc tính mới – Thêm hoặc hiệu chỉnh các phương thức 7/5/2021 25
- Lớp con • Dùng từ khóa extends để tạo ra lớp con. • Lớp con phải tuân theo 1 số nguyên tắc sau: – Chỉ được kế thừa trực tiếp từ 1 lớp duy nhất – Nếu nó không có bất kì lớp cha nào thì ngầm định nó kế thừa lớp Object – Lớp con không được kế thừa hàm dựng của lớp cha. 7/5/2021 26
- Cài đè (Overriding) • Khi lớp con có 1 phương thức giống hệt lớp cha, ta gọi đó là cài đè. • Mục đích: định nghĩa mới hay thực hiện hành vi khác so với lớp cha. 7/5/2021 27
- Cài đè (Overriding) • Qui tắc: – Phương thức cài đè phải trùng tên, kiểu, số các tham số và kiểu trả về so với phương thức bị cài đè. – Phương thức bị cài đè phải có định danh truy cập yếu hơn hoặc bằng so với phương thức cài đè. 7/5/2021 28
- Từ khóa super • Cho phép lớp con truy cập tới các thành phần ở lớp cha. • super trong constructor dùng để truy xuất tới constructor của lớp cha, phải là câu lệnh đầu tiên trong hàm dựng. 7/5/2021 29
- Nạp chồng phương thức • Nạp chồng là khả năng lớp có nhiều phương thức cùng tên 7/5/2021 30
- Nạp chồng: Các tham số khác nhau • Số các tham số khác nhau. • Kiểu dữ liệu trả về giống nhau. 7/5/2021 31
- Nạp chồng: Kiểu dữ liệu trả về khác nhau • Có cùng số tham số • Khác nhau kiểu dữ liệu trả về 7/5/2021 32
- Nạp chồng hàm dựng • Cho phép xây dựng đối tượng bằng nhiều cách 7/5/2021 33
- Các phương thức trừu tượng • Phương thức chỉ có khai báo mà không có cài đặt được gọi là phương thức trừu tượng. • Phương thức trừu tượng là phương thức có từ khóa abstract • Phương thức trừu tượng phải được khai báo trong abstract class hoặc trong interface • Phương thức trừu tượng không có cặp dấu ngoặc kép ({}) và được kết thúc bằng dấu chấm phẩy (;) 7/5/2021 34
- Các phương thức trừu tượng 7/5/2021 35
- Thuật ngữ • Kế thừa • Lớp cơ sở, lớp cha • Lớp dẫn xuất, lớp con 7/5/2021 36
- Kế thừa trong Java [public] class DerivedClass extends BaseClass { /* new features goes here */ } Ví dụ: class Employee extends Person { private double salary; public boolean setSalary(double sal) { salary = sal; return true; } } 7/5/2021 37
- Kế thừa trong Java Person Employee e = new Employee(); -name -birthday e.setName("John"); +setName() e.setSalary(3.0); +setBirthday() Employee -salary +setSalary() +getDetail() 7/5/2021 38
- Thừa kế nhiều tầng Person -name -birthday +setName +setBirthday Mọi đối tượng đều thừa kế từ lớp gốc Object Student Employee -id -salary +setSalary +getDetail Programmer Manager -project -rank 7/5/2021 39
- Interfaces - giao diện 7/5/2021 40
- Định nghĩa giao diện • Bạn có thể trừu tượng hoàn toàn giao diện của lớp với sự hiện thực của nó nhờ từ khóa interface. • Trong interface bạn đặc tả một lớp phải làm gì nhưng không cần biết phải làm thế nào. • Interface là tập các khai báo phương thức, hằng mà lớp con kế thừa. 7/5/2021 41
- Định nghĩa giao diện • Interface có cú pháp tương tự lớp nhưng không có biến thành viên, chỉ có khai báo hằng và các khai báo phương thức. • Số lượng lớp hiện thực 1 interface là không hạn chế. • 1 lớp cũng được hiện thực số lượng tùy ý các interface. 7/5/2021 42
- Định nghĩa giao diện • Để hiện thực 1 interface, lớp phải cài đặt đầy đủ tất cả các phương thức mà interface đó định nghĩa. • Interface được thiết kế để hỗ trợ phương thức động lúc thực thi chương trình. 7/5/2021 43
- Định nghĩa giao diện • Cú pháp của 1 interface 7/5/2021 44
- Hiện thực giao diện • Sau khi interface được định nghĩa, 1 hay nhiều lớp có thể hiện thực interface đó. • Để hiện thực 1 interface ta dùng từ khóa implements, sau đó cài đặt tất cả các phương thức mà interface đó định nghĩa 7/5/2021 45
- Chú ý • Các phương thức hiện thực interface phải khai báo public. • Hình thức của phương thức phải giống hệt đặc tả trong interface . • Nếu một lớp chứa 1 interface nhưng không hiện thực hết tất cả các phương thức➔lớp phải khai báo abstract. 7/5/2021 46
- Đa kế thừa • Java không cho phép đa kế thừa từ nhiều lớp cơ sở – đảm bảo tính dễ hiểu – hạn chế xung đột • Nhưng có thể cài đặt đồng thời nhiều giao diện 7/5/2021 47
- Ví dụ interface Action { void moveTo(int x, int y); void erase(); void draw(); } class Circle1 implements Action { int x, y, r; Circle1(int _x, int _y, int _r) { } public void erase() { } public void draw() { } public void moveTo(int x1, int y1) { } } 7/5/2021 48
- Truy xuất hiện thực thông qua tham chiếu interface • Bạn có thể khai báo 1 biến tham chiếu tới interface . • Khi bạn gọi phương thức ➔ phương thức thực thi sẽ tự động tìm đến thể hiện thực sự. 7/5/2021 49
- Biến trong giao diện • Có thể dùng các biến trong interface để import các hằng dùng chung cho nhiều lớp. • Khi hiện thực các interface này thì các biến trên có tính chất như 1 hằng. 7/5/2021 50
- Kế thừa giao diện • Một interface có thể được kế thừa từ 1 interface khác bằng từ khóa extends. • Khi một lớp hiện thực 1 interface kế thừa 1 interface khác, nó phải cài đặt tất cả các phương thức của cả 2 interface này 7/5/2021 51
- Kế thừa giao diện • Một lớp trừu tượng cũng có thể kế thừa 1 interface khác. abstract class Shape implements Action { protected int x, y; public Shape() { } public Shape(int _x, int _y) { } public void moveTo(int x1, int y1) { erase(); x = x1; y = y1; draw(); } } 7/5/2021 52