Bài giảng Công nghệ Java - Chương 6: Kế thừa, đóng gói trong Java - Trần Quang Diệu

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ự. 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. 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

ppt52 trang | Chia sẻ: thucuc2301 | Lượt xem: 577 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Công nghệ Java - Chương 6: Kế thừa, đóng gói trong Java - Trần Quang Diệu, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
CÔNG NGHỆ JAVA CH6. KẾ THỪA, ĐÓNG GÓI TRONG JAVAQuang Dieu Tran PhD11/27/2020111/27/20201Package11/27/20202PackageMộ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ênThao tác trên gói có 2 kỹ thuật:KT đặt tênKT điều khiển truy xuất11/27/20203PackageMộ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.11/27/20204Đặc điểm góiMột gói có thể có nhiều gói conKhông được có hai thành viên trùng tênTên của gói được viết bằng chữ thườngJava có 2 loại gói:Gói được định nghĩa trướcGói được định nghĩa bởi người dùng11/27/20205Đị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.11/27/20206Các bước định nghĩa góiBước 1: lựa chọn tên góiTên gói phải là chữ thườngTên gói không được bắt đầu bằng java hoặc javaxKhô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óiJava 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.11/27/20207Các bước định nghĩa góiBước 3: đưa các tập tin nguồn vào trong góiThê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ụngKhi 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ó.11/27/20208Định nghĩa góiJava xem gốc của cây phân cấp gọi được định nghĩa ở biến môi trường CLASSPATHVí dụ: package java.awt.image; Được lưu trữ trong thư mục Java\awt\image với hệ điều hành Windows11/27/20209Điều khiển truy xuấtCác quyền truy xuất: 11/27/202010Sử dụng góiJava đư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;11/27/202011Sử dụng góiVí 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 địnhPhá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ó.11/27/202012Kế thừa - Inheritance11/27/202013Kế thừa trong thế giới thực11/27/202014Kế thừa trong thế giới thựcQuá 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.11/27/202015Kế thừa trong lập trìnhLà 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.11/27/202016Abstract class11/27/202017Lớ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)11/27/202018Lớ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.11/27/202019Ví dụ11/27/202020Tái sử dụngTồ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 nhauPerson, Student, Manager,Xuất hiện nhu cầu sử dụng lại các mã nguồn đã viếtSử dụng lại thông qua copySử dụng lại thông qua quan hệ has_aSử dụng lại thông qua cơ chế “kế thừa”11/27/202021Tái sử dụngCopy mã nguồnTốn công, dễ nhầmKhó sửa lỗi do tồn tại nhiều phiên bảnQuan hệ has_aSử dụng lớp cũ như là thành phần của lớp mớiSử dụng lại cài đặt với giao diện mớiPhải viết lại giao diệnChưa đủ mềm dẻo11/27/202022Ví dụ: has_aclass Person { String name; Date bithday; public String getName() { return name; }...}class Employee { Person me; double salary; public String getName() { return me.getName(); }...}11/27/202023Ví dụ: has_aclass Manager { Employee me; Employee assistant; public setAssistant(Employee e) {...} ...}...Manager junior = new Manager();Manager senior = new Manager();senior.setAssistant(junior); // error11/27/202024Kế thừaDựa trên quan hệ is_aThừ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ớiThêm các thuộc tính mớiThêm hoặc hiệu chỉnh các phương thức11/27/202025Lớp conDù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ấtNếu nó không có bất kì lớp cha nào thì ngầm định nó kế thừa lớp ObjectLớp con không được kế thừa hàm dựng của lớp cha.11/27/202026Cà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.11/27/202027Cà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 đè.11/27/202028Từ khóa superCho 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.11/27/202029Nạp chồng phương thứcNạp chồng là khả năng lớp có nhiều phương thức cùng tên11/27/202030Nạp chồng: Các tham số khác nhauSố các tham số khác nhau.Kiểu dữ liệu trả về giống nhau.11/27/202031Nạp chồng: Kiểu dữ liệu trả về khác nhauCó cùng số tham sốKhác nhau kiểu dữ liệu trả về11/27/202032Nạp chồng hàm dựngCho phép xây dựng đối tượng bằng nhiều cách11/27/202033Các phương thức trừu tượngPhươ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 abstractPhương thức trừu tượng phải được khai báo trong abstract class hoặc trong interfacePhươ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 (;)11/27/202034Các phương thức trừu tượng11/27/202035Thuật ngữKế thừaLớp cơ sở, lớp chaLớp dẫn xuất, lớp con11/27/202036Kế 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; }}11/27/202037Kế thừa trong JavaEmployee e = new Employee();e.setName("John");e.setSalary(3.0);Person-name-birthday+setName()+setBirthday()Employee-salary+setSalary()+getDetail()11/27/202038Thừa kế nhiều tầngPerson-name-birthday+setName+setBirthdayEmployee-salary+setSalary+getDetailManager-rank...Programmer-project...Student-id...Mọi đối tượng đềuthừa kế từ lớp gốc Object11/27/202039Interfaces - giao diện11/27/202040Định nghĩa giao diệnBạ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.11/27/202041Định nghĩa giao diệnInterface 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.11/27/202042Đị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.11/27/202043Định nghĩa giao diệnCú pháp của 1 interface11/27/202044Hiện thực giao diệnSau 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ĩa11/27/202045Chú ý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.11/27/202046Đa kế thừaJava không cho phép đa kế thừa từ nhiều lớp cơ sởđảm bảo tính dễ hiểuhạn chế xung đột Nhưng có thể cài đặt đồng thời nhiều giao diện11/27/202047Ví 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) {...}}11/27/202048Truy xuất hiện thực thông qua tham chiếu interfaceBạ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ự.11/27/202049Biến trong giao diệnCó 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. 11/27/202050Kế thừa giao diệnMộ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ày11/27/202051Kế thừa giao diệnMộ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(); }}11/27/202052

Các file đính kèm theo tài liệu này:

  • pptsession06_package_interface_inheritance_2827_2001627.ppt
Tài liệu liên quan