intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Lập trình hướng đối tượng với Java - Bài 8 Kế thừa

Chia sẻ: Đào Văn Hoàng | Ngày: | Loại File: PDF | Số trang:13

200
lượt xem
15
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Sau khi học bài lập trình hướng đối tượng với Java về phần kế thừa giúp sinh viên hiểu được: Mô tả các khái niệm cơ bản liên quan đến kế thừa. Giải thích nguyên lý kế thừa. Chỉ ra thứ tự khởi tạo và hủy bỏ đối tượng trong kế thừa. Trình bày nguyên lý định nghĩa lại trong kế thừa. Sử dụng các vấn đề trên với ngôn ngữ lập trình Java.

Chủ đề:
Lưu

Nội dung Text: Lập trình hướng đối tượng với Java - Bài 8 Kế thừa

  1. TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN Mục tiêu của bài học Bé m«n C«ng nghÖ phÇn mÒm Sau khi kết thúc bài học, sinh viên có thể: Mô tả các khái niệm cơ bản liên quan đến kế LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG thừa VỚI JAVA Giải thích nguyên lý kế thừa Chỉ ra thứ tự khởi tạo và hủy bỏ đối tượng trong kế thừa Bài 8. Kế thừa (Inheritance) Trình bày nguyên lý định nghĩa lại trong kế thừa Nguyễn Thị Thu Trang Sử dụng các vấn đề trên với ngôn ngữ lập trangntt-fit@mail.hut.edu.vn trình Java. 1 © Nguyễn Thị Thu Trang, SE-FIT-HUT 2 Bài 8. Kế thừa (Inheritance) Bài 8. Kế thừa (Inheritance) 1. Tổng quan về kế thừa 1. Tổng quan về kế thừa 2. Nguyên lý kế thừa 2. Nguyên lý kế thừa 3. Khởi tạo và hủy đối tượng 3. Khởi tạo và hủy đối tượng 4. Định nghĩa lại 4. Định nghĩa lại 5. Lớp ảo và giao diện 5. Lớp ảo và giao diện © Nguyễn Thị Thu Trang, SE-FIT-HUT 3 © Nguyễn Thị Thu Trang, SE-FIT-HUT 4 1
  2. 1. Tổng quan về kế thừa 1.1. Bản chất Kế thừa (Inherit, Derive) Ví dụ: Tái sử dụng mã nguồn (Reusability) Điểm Tạo lớp mới bằng cách phát triển lớp đã có. Tứ giác gồm 4 điểm Lớp mới kế thừa những gì đã có trong lớp cũ và Kết tập phát triển những tính năng mới. Lớp cũ: Tứ giác Tứ giác Lớp cha (parent, superclass) Hình vuông Lớp cơ sở (base class) Kế thừa Lớp mới: Lớp con (child, subclass) Hình Hình Lớp dẫn xuất (derived class) thang vuông © Nguyễn Thị Thu Trang, SE-FIT-HUT 5 © Nguyễn Thị Thu Trang, SE-FIT-HUT 6 1.1. Bản chất (tiếp) 1.2. Phân biệt kế thừa và kết tập Kế thừa (tiếp) Kế thừa Kết tập Lớp con mở rộng (extend) từ lớp cha Kế thừa tái sử dụng Kết tập tái sử dụng Là một loại của lớp cha thông qua lớp. thông qua lại đối tượng. Kế thừa được các thành phần dữ liệu và các hành Tạo lớp mới bằng cách Tạo ra tham chiếu đến vi của lớp cha phát triển lớp đã có sẵn các đối tượng của các Chi tiết hóa cho phù hợp với mục đích sử dụng mới lớp có sẵn trong lớp mới Thêm các thuộc tính/hành vi mới Quan hệ “là một loại” Quan hệ “là một phần” Chỉnh sửa lại các hành vi kế thừa từ lớp cha. (“is a kind of”) (“is a part of”) Ví dụ: Ô tô là một loại Ví dụ: Ô tô có 4 bánh xe phương tiện vận tải © Nguyễn Thị Thu Trang, SE-FIT-HUT 7 © Nguyễn Thị Thu Trang, SE-FIT-HUT 8 2
  3. 1.3. Cây phân cấp kế thừa Ví dụ về cây phân cấp kế thừa Cây phân cấp kế thừa (Inheritance Hình hierarchy) Cấu trúc phân cấp hình cây, biểu diễn mối quan hệ kế thừa giữa các lớp. Hình hai chiều Hình ba chiều A Dẫn xuất trực tiếp B dẫn xuất trực tiếp từ A B Dẫn xuất gián tiếp Hình tròn Tứ giác Tam giác Hình cầu Hình lăng trụ Tứ diện C dẫn xuất gián tiếp từ A C © Nguyễn Thị Thu Trang, SE-FIT-HUT 9 © Nguyễn Thị Thu Trang, SE-FIT-HUT 10 Ví dụ về cây phân cấp kế thừa Bài 8. Kế thừa Mọi đối tượng 1. Tổng quan về kế thừa đều thừa kế từ 2. Nguyên lý kế thừa lớp gốc Object 3. Khởi tạo và hủy đối tượng 4. Định nghĩa lại 5. Lớp ảo và giao diện © Nguyễn Thị Thu Trang, SE-FIT-HUT 11 © Nguyễn Thị Thu Trang, SE-FIT-HUT 12 3
  4. 2. Nguyên lý kế thừa 2. Nguyên lý kế thừa (2) Thành viên protected trong lớp cha Là mức truy cập ở giữa public và private public Không có protected private Được truy cập ở: Các thành viên lớp cha Các thành viên lớp con Cùng lớp Các thành viên các lớp cùng thuộc 1 gói (package) Lớp con Lớp con có thể kế thừa được gì? cùng gói Kế thừa được các thành viên (bao gồm dữ liệu và Lớp con phương thức) được khai báo là public và protected khác gói của lớp cha. Khác gói, Không kế thừa được các thành viên private. non-inher © Nguyễn Thị Thu Trang, SE-FIT-HUT 13 © Nguyễn Thị Thu Trang, SE-FIT-HUT 14 2. Nguyên lý kế thừa (2) 2. Nguyên lý kế thừa (3) public Không có protected private Cùng lớp Yes Yes Yes Yes Lớp con Yes Yes Yes No cùng gói Lớp con Yes No Yes No khác gói Khác gói, Yes No No No non-inher © Nguyễn Thị Thu Trang, SE-FIT-HUT 15 © Nguyễn Thị Thu Trang, SE-FIT-HUT 16 4
  5. 2.1. Cú pháp kế thừa trên Java Ví dụ 1 public class TuGiac { protected Diem d1, d2, d3, d4; Cú pháp kế thừa trên Java: public void setD1(Diem _d1) {d1=_d1;} public Diem getD1(){return d1;} extends public void draw(){//Vẽ tứ giác} … Sử dụng các biến Ví dụ: } public class HinhVuong extends TuGiac { protected trong lớp con class HinhVuong extends TuGiac public HinhVuong(){ d1 = new Diem(0,0); d2 = new Diem(0,1); class Bird extends Animal d3 = new Diem(1,0); d4 = new Diem(1,1); } } public class Test{ public static void main(String args[]){ HinhVuong hv = new HinhVuong(); Gọi hàm public lớp cha hv.draw(); của đối tượng lớp con } } © Nguyễn Thị Thu Trang, SE-FIT-HUT 17 © Nguyễn Thị Thu Trang, SE-FIT-HUT 18 Ví dụ 2 Ví dụ 2 – sửa lại class Person { class Person { private String name; protected String name; private Date bithday; protected Date bithday; public String getName() { return name; } public String getName() { return name; } ... ... } } class Employee extends Person { class Employee extends Person { private double salary; private double salary; public boolean setSalary(double sal) { public boolean setSalary(double sal) { salary = sal; salary = sal; return true; return true; } } public String getDetail(){ public String getDetail(){ String s = name+“,”+birthday+“,”+salary;//Loi String s = name+“,”+birthday+“,”+salary; } } } } © Nguyễn Thị Thu Trang, SE-FIT-HUT 19 © Nguyễn Thị Thu Trang, SE-FIT-HUT 20 5
  6. Ví dụ 2 (tiếp) Ví dụ 3 – Cùng gói public class Test{ public class Person { public static void main(String args[]){ Date birthday; String name; Employee e = new Employee(); ... e.setName("John"); } e.setSalary(3.0); public class Employee extends Person { } ... } public String getDetail() { String s; String s = name + "," + birthday; s += ",“ + salary; return s; } } © Nguyễn Thị Thu Trang, SE-FIT-HUT 21 © Nguyễn Thị Thu Trang, SE-FIT-HUT 22 Ví dụ 3 – Khác gói 2.2. Các hàm không được phép kế thừa package abc; public class Person { Các hàm không được phép kế thừa: protected Date birthday; Các hàm thiết lập và hàm hủy protected String name; ... Làm nhiệm vụ khởi đầu và gỡ bỏ các đối tượng } Chúng chỉ biết cách làm việc với từng lớp cụ thể import abc.Person; Toán tử gán = public class Employee extends Person { Làm nhiệm vụ giống như hàm thiết lập ... public String getDetail() { String s; s = name + "," + birthday + "," + salary; return s; } } © Nguyễn Thị Thu Trang, SE-FIT-HUT 23 © Nguyễn Thị Thu Trang, SE-FIT-HUT 24 6
  7. Bài 8. Kế thừa 3. Khởi tạo và huỷ bỏ đối tượng Khởi tạo đối tượng: 1. Tổng quan về kế thừa Lớp cha được khởi tạo trước lớp con. 2. Nguyên lý kế thừa Các hàm khởi tạo của lớp con gọi hàm khởi tạo của lớp cha 3. Khởi tạo và hủy đối tượng Không tường minh (implicit - tự động gọi) Tường minh (explicit - gọi trực tiếp). 4. Định nghĩa lại Hủy bỏ đối tượng: 5. Lớp ảo và giao diện Ngược lại so với khởi tạo đối tượng © Nguyễn Thị Thu Trang, SE-FIT-HUT 25 © Nguyễn Thị Thu Trang, SE-FIT-HUT 26 3.1. Tự động gọi hàm khởi tạo lớp cha Ví dụ public class TuGiac { public class Test { protected Diem d1, d2; Hàm khởi tạo của lớp con tự động gọi hàm khởi protected Diem d3, d4; public static void main(String arg[]) tạo mặc định của lớp cha (dòng đầu tiên trong public TuGiac(){ { hàm khởi tạo). System.out.println("Lop cha TuGiac()"); HinhVuong hv = Hàm khởi tạo mặc định: } new HinhVuong(); Không tham số //… } Do hệ thống tự cung cấp (nếu không được viết lại) hoặc do } người dùng viết lại. } public class HinhVuong extends Nếu lớp cha có hàm khởi tạo mặc định thì hàm khởi TuGiac{ public HinhVuong(){ tạo này sẽ được tự động gọi trong câu lệnh đầu tiên //Tu dong goi TuGiac() của hàm khởi tạo lớp con. System.out.println("Lop con HinhVuong()"); } } © Nguyễn Thị Thu Trang, SE-FIT-HUT 27 © Nguyễn Thị Thu Trang, SE-FIT-HUT 28 7
  8. 3.2. Gọi trực tiếp hàm khởi tạo của lớp cha Ví dụ public class TuGiac { public class Test { Nếu lớp cha không có hàm khởi tạo mặc định protected Diem d1, d2; protected Diem d3, d4; public static void main(String arg[]) tức là đã ghi chồng hàm khởi tạo của lớp cha public TuGiac(Diem _d1, Diem _d2, { Diem _d3, Diem _d4){ với một số tham số thì System.out.println("Lop cha HinhVuong hv = new TuGiac(d1, d2, d3, d4)"); HinhVuong(); Câu lệnh đầu tiên trong hàm khởi tạo của lớp con d1=_d1; d2=_d2; } bắt buộc phải gọi hàm khởi tạo của lớp cha d3=_d3; d4=_d4; } } //… super(Danh sách tham số); } Lỗi Hàm khởi tạo của lớp con không bắt buộc phải có public class HinhVuong extends TuGiac { tham số. public HinhVuong(){ System.out.println("Lop con HinhVuong()"); } } © Nguyễn Thị Thu Trang, SE-FIT-HUT 29 © Nguyễn Thị Thu Trang, SE-FIT-HUT 30 Gọi trực tiếp hàm khởi tạo của lớp cha Gọi trực tiếp hàm khởi tạo của lớp cha Hàm khởi tạo lớp con không tham số Hàm khởi tạo lớp con có tham số public class TuGiac { HinhVuong hv = new public class TuGiac { protected Diem d1, d2; HinhVuong(); protected Diem d1, d2; protected Diem d3, d4; protected Diem d3, d4; HinhVuong hv = new public TuGiac(Diem _d1, Diem _d2, Diem public TuGiac(Diem _d1, Diem _d2, HinhVuong(new Diem(0,0), _d3, Diem _d4){ Diem _d3, Diem _d4){ new Diem(0,1), System.out.println("Lop cha System.out.println("Lop cha new Diem(1,1), TuGiac(d1, d2, d3, d4)"); TuGiac(d1, d2, d3, d4)"); d1=_d1; d2=_d2; d1=_d1; d2=_d2; new Diem(1,0)); d3=_d3; d4=_d4; d3=_d3; d4=_d4; } //… } //… } } public class HinhVuong extends TuGiac{ public class HinhVuong extends TuGiac{ public HinhVuong(){ public HinhVuong(Diem _d1, Diem _d2, super(new Diem(0,0),new Diem(0,1), Diem _d3, Diem _d4){ new Diem(1,1),new Diem(1,0)); super(_d1, _d2, _d3, _d4); System.out.println("Lop con System.out.println("Lop con HinhVuong()"); HinhVuong(d1, d2, d3, d4)"); } } } } © Nguyễn Thị Thu Trang, SE-FIT-HUT 31 © Nguyễn Thị Thu Trang, SE-FIT-HUT 32 8
  9. Bài 8. Kế thừa 4. Định nghĩa lại hay ghi đè 1. Tổng quan về kế thừa Lớp con có thể định nghĩa hàm trùng tên với hàm trong lớp cha: 2. Nguyên lý kế thừa Nếu hàm mới chỉ trùng tên và khác chữ ký (số lượng hay kiểu dữ liệu của đối số) 3. Khởi tạo và hủy đối tượng Chồng hàm (Overloading) 4. Định nghĩa lại Nếu hàm mới hoàn toàn giống về giao diện (chữ ký) với hàm trong lớp cơ sở: 5. Lớp ảo và giao diện Định nghĩa lại hoặc ghi đè (redefining or override) © Nguyễn Thị Thu Trang, SE-FIT-HUT 33 © Nguyễn Thị Thu Trang, SE-FIT-HUT 34 4. Định nghĩa lại hay ghi đè (2) Ví dụ Phương thức override sẽ thay thế hoặc làm rõ package abc; public class Person { hơn cho phương thức cùng tên trong lớp cha protected Date birthday; Đối tượng của lớp dẫn xuất sẽ hoạt động với protected String name; p g ; phương thức mới phù hợp với nó public String getDetail() {...} ... Có tái sử dụng phương thức cùng tên của lớp } cơ sở bằng từ khóa super import abc; public class Employee extends Person { ... public String getDetail() { String s = super.getDetail() + "," + salary; return s; } } © Nguyễn Thị Thu Trang, SE-FIT-HUT 35 © Nguyễn Thị Thu Trang, SE-FIT-HUT 36 9
  10. 4. Định nghĩa lại hay ghi đè (3) 4. Định nghĩa lại hay ghi đè (3) Một số quy định Một số quy định (tiếp) Danh sách tham số phải giống hệt phương Các chỉ định truy cập không giới hạn chặt hơn thức trong lớp cha. phương thức trong lớp cha Phải có cùng kiểu trả về với phương thức kế Ví dụ, nếu ghi đè một phương thức protected, thì thừa phương thức mới có thể là protected hoặc public, mà không được là private. Không được phép ghi đè: Các hàm không được phép thay đổi (final hoặc const) Lớp cha là final class © Nguyễn Thị Thu Trang, SE-FIT-HUT 37 © Nguyễn Thị Thu Trang, SE-FIT-HUT 38 Ví dụ Bài 8. Kế thừa class Parent { 1. Tổng quan về kế thừa public void doSomething() {} private int doSomething2() { 2. Nguyên lý kế thừa return 0; 3. Khởi tạo và hủy đối tượng } } 4. Định nghĩa lại class Child extends Parent { 5. Lớp ảo và giao diện protected void doSomething() {} private void doSomething2() {} } © Nguyễn Thị Thu Trang, SE-FIT-HUT 39 © Nguyễn Thị Thu Trang, SE-FIT-HUT 40 10
  11. 5.1. Lớp trừu tượng (Abstract Class) 5.1. Lớp trừu tượng (tiếp) Không thể thể hiện hóa (instantiate – tạo đối Ví dụ: abstract class Learner { tượng của lớp) public abstract String getName(); Chưa đầy đủ, thường được sử dụng làm lớp cha. public abstract int getAge(); public int getMaxGrade() { Lớp con kế thừa nó sẽ hoàn thiện nốt. return getAge() - 5; Để trở thành một lớp trừu tượng, cần: } } Khai báo với từ khóa abstract Chứa ít nhất một phương thức trừu tượng (abstract Nếu một lớp có một hay nhiều phương thức trừu method - chỉ có chữ ký mà không có cài đặt cụ thể) tượng thì nó là lớp trừu tượng và phải được public abstract void draw(); khai báo abstract Lớp con khi kế thừa cần cài đặt cụ thể cho các phương Lớp trừu tượng được dùng để gắn kết các lớp thức trừu tượng. đã cài đặt đầy đủ. © Nguyễn Thị Thu Trang, SE-FIT-HUT 41 © Nguyễn Thị Thu Trang, SE-FIT-HUT 42 5.2. Giao diện (Interface) 5.2. Giao diện (tiếp) Đa kế thừa (Multiple Inheritance) Cho phép một lớp có thể kế thừa (thực thi - Một lớp có thể kế thừa nhiều lớp khác A B C implement) nhiều giao diện một lúc. (lớp con có thể có nhiều lớp cha) Không thể thể hiện hóa (instantiate) trực tiếp C++ hỗ trợ đa kế thừa D Để trở thành giao diện, cần Đơn kế thừa (Single Inheritance) Sử dụng từ khóa interface để định nghĩa Một lớp chỉ được kế thừa từ một lớp E A F Chỉ được bao gồm: khác (lớp con chỉ có một lớp cha). Chữ ký các phương thức (method signature) Java chỉ hỗ trợ đơn kế thừa Các khai báo hằng (static & final). B C D Đưa thêm khái niệm Giao diện Lớp thực thi giao diện (Interface) Hoặc là lớp trừu tượng (abstract class) Hoặc là bắt buộc phải thực thi toàn bộ các phương thức trong giao diện. © Nguyễn Thị Thu Trang, SE-FIT-HUT 43 © Nguyễn Thị Thu Trang, SE-FIT-HUT 44 11
  12. 5.2. Giao diện (tiếp) Ví dụ 1 public interface DoiXung { Cú pháp thực thi trên Java: abstract extends implements } extends public abstract class TuGiac { Ví dụ: protected Diem p1, p2, p3, p4; public interface DoiXung {…} … public class HinhVuong extends TuGiac } implements DoiXung {…} public interface FlyableThing {…} public class HinhVuong extends TuGiac public class Bird extends Animal implements DoiXung { … implements FlyableThing {…} } © Nguyễn Thị Thu Trang, SE-FIT-HUT 45 © Nguyễn Thị Thu Trang, SE-FIT-HUT 46 Ví dụ 2 Kết luận abstract class TuGiac { class HinhVuong extends Kế thừa là một phương pháp để tái sử dụng mã protected Diem d1, d2; TuGiac { nguồn //Truy cập được các thành phần protected Diem d3, d4; // Phương thức final //dữ liệu d1, d2, d3, d4 Kế thừa dùng khi ta có quan hệ “là một loại - is a public final void draw(){ kind of”. public double area (){ //Vẽ tứ giác // Tính diện tích hình vuông Lớp con kế thừa toàn bộ tính năng của lớp cha và } } có thể phát triển thêm các tính năng mới. // Phương thức trừu tượng public final void draw(){ Trong Java, không hỗ trợ đa kế thừa Đưa ra public abstract double // Vẽ hình vuông Báo lỗi khái niệm Giao diện (Interface) cho phép lớp con getArea(); } có thể thực thi nhiều giao diện một lúc. } } Hàm khởi tạo lớp con có thể gọi hàm khởi tạo lớp cha tường minh hoặc không tường minh. Lớp con có thể định nghĩa lại hay ghi đè các phương thức đã định nghĩa trong lớp cha. © Nguyễn Thị Thu Trang, SE-FIT-HUT 47 © Nguyễn Thị Thu Trang, SE-FIT-HUT 48 12
  13. Câu hỏi Kế thừa là gì? So sánh kế thừa với kết tập? Nêu bản chất của nguyên lý kế thừa? Những hàm nào không được phép kế thừa và tại sao? So sánh lớp trừu tượng và giao diện? Nêu nguyên lý và thứ tự thực hiện của hàm khởi tạo trong kế thừa? © Nguyễn Thị Thu Trang, SE-FIT-HUT 49 13
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2