Bài giảng Kế thừa
Vấnđềsửdụng lại
Sửdụng lại bằng kếthừa
Kếthừa trong Java
định nghĩa lớp kếthừa
thêm phương thức, thuộc tính
kiểm soát truy cập
constructor
Lớp Object
Tóm tắt nội dung Bài giảng Kế thừa, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
Kế thừa Kế thừa 2Nguyễn Việt Hà Nội dung Vấn đề sử dụng lại Sử dụng lại bằng kế thừa Kế thừa trong Java định nghĩa lớp kế thừa thêm phương thức, thuộc tính kiểm soát truy cập constructor Lớp Object Kế thừa 3Nguyễn Việt Hà Tài liệu tham khảo Thinking in Java, chapter 6 Java how to program, chapter 9 Kế thừa 4Nguyễn Việt Hà Sử dụng lại 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” Kế thừa 5Nguyễn Việt Hà Sử dụng lại 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 Kế thừa 6Nguyễn Việt Hà Ví dụ: has_a class Person { private String name; private Date bithday; public String getName() { return name; } ... } class Employee { private Person me; private double salary; public String getName() { return me.getName(); } ... } Kế thừa 7Nguyễn Việt Hà class Manager { private Employee me; private Employee assistant; public setAssistant(Employee e) {...} ... } ... Manager junior = new Manager(); Manager senior = new Manager(); senior.setAssistant(junior); // error Kế thừa 8Nguyễn Việt Hà 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 Kế thừa 9Nguyễn Việt Hà Thuật ngữ Kế thừa Lớp cơ sở, lớp cha Lớp dẫn xuất, lớp con Kế thừa 10Nguyễn Việt Hà 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; } } Kế thừa 11Nguyễn Việt Hà Employee e = new Employee(); e.setName("John"); e.setSalary(3.0); Person -name -birthday +setName() +setBirthday() Employee -salary +setSalary() +getDetail() Kế thừa 12Nguyễn Việt Hà private members class Employee extends Person { ... public String getDetail() { String s; // s = name + "," + birthday; s = getName() + "," + getBirthday(); s += "," + salary; return s; } } Kế thừa 13Nguyễn Việt Hà Mức truy cập protected Để đảm bảo che dấu thông tin, thông thường các thuộc tính được khai báo là private Đối tượng thuộc lớp dẫn xuất phải truy cập tới chúng thông qua các phương thức get và set. Mức truy cập protected giải quyết vấn đề này Đối tượng của lớp dẫn xuất truy cập được các protected members của lớp cơ sở Các đối tượng khác không truy cập được Kế thừa 14Nguyễn Việt Hà public class Person { protected Date birthday; protected String name; ... } public class Employee extends Person { ... public String getDetail() { String s; s = name + "," + birthday; s += "," + salary; return s; } } Kế thừa 15Nguyễn Việt Hà Các mức kiểm soát truy cập YesYesYesYespublic YesYesYesprotected YesYespackage (default) Yesprivate UniverseSubclassSame package Same class Modifier Kế thừa 16Nguyễn Việt Hà Trong cùng gói public class Person { Date birthday; String name; ... } public class Employee extends Person { ... public String getDetail() { String s; s = name + "," + birthday; s += "," + salary; return s; } } Kế thừa 17Nguyễn Việt Hà Khác gói package abc; public class Person { protected Date birthday; protected String name; ... } import abc.Person; public class Employee extends Person { ... public String getDetail() { String s; s = name + "," + birthday; s += "," + salary; return s; } } Kế thừa 18Nguyễn Việt Hà Định nghĩa lại các phương thức Chúng ta có thể định nghĩa lại các phương thức của lớp cơ sở Đối tượng của lớp dẫn xuất sẽ hoạt động với phương thức mới phù hợp với nó Có thể 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 Kế thừa 19Nguyễn Việt Hà Ví dụ package abc; public class Person { protected Date birthday; protected String name; public String getDetail() {...} ... } import abc; public class Employee extends Person { ... public String getDetail() { String s; s = super.getDetail() + "," + salary; return s; } } Kế thừa 20Nguyễn Việt Hà Định nghĩa lại phương thức Phải có quyền truy cập không chặt hơn phương thức được định nghĩa lại Phải có kiểu giá trị trả lại như nhau Kế thừa 21Nguyễn Việt Hà class Parent { public void doSomething() {} public int doSomething2() { return 0; } } class Child extends Parent { protected void doSomething() {} public void doSomething2() {} } Kế thừa 22Nguyễn Việt Hà Thừa kế nhiều tầng Person -name -birthday +setName +setBirthday Employee -salary +setSalary +getDetail Manager -rank ... Programmer -project ... Student -id ... Mọi đối tượng đều thừa kế từ lớp gốc Object Kế thừa 23Nguyễn Việt Hà Constructor Lớp dẫn xuất kế thừa mọi thuộc tính và phương thức của lớp cơ sở Không kế thừa phương thức khởi tạo Có hai giải pháp gọi constructor của lớp cơ sở sử dụng constructor mặc định gọi constructor của lớp cơ sở một cách tường minh Kế thừa 24Nguyễn Việt Hà class Point { protected int x, y; public Point() {} public Point(int xx, int yy) { x = xx; y = yy; } } class Circle extends Point { protected int radius; public Circle() {} } Point p = new Point(10, 10); Circle c1 = new Circle(); Circle c2 = new Circle(10, 10); // erorr Kế thừa 25Nguyễn Việt Hà Gọi constructor của lớp cơ sở Việc khởi tạo thuộc tính của lớp cơ sở nên giao phó cho constructor của lớp cơ sở Sử dụng từ khóa super để gọi constructor của lớp cơ sở Constructor của lớp cơ sở bắt buộc phải được thực hiện đầu tiên Nếu lớp cơ sở không có constructor mặc định thì bắt buộc phải gọi constructor tường minh Kế thừa 26Nguyễn Việt Hà class Point { protected int x, y; public Point() {} public Point(int xx, int yy) { x = xx; y = yy; } } class Circle extends Point { protected int radius; public Circle() {} public Circle(int xx, int yy, int r) { super(xx, yy); radius = r; } } Kế thừa 27Nguyễn Việt Hà class Point { protected int x, y; public Point(int xx, int yy) { x = xx; y = yy; } } class Circle extends Point { protected int radius; public Circle() { super(0, 0); } public Circle(int xx, int yy, int r) { super(xx, yy); radius = r; } } Kế thừa 28Nguyễn Việt Hà class Point { protected int x, y; public Point() {} public Point(int xx, int yy) { x = xx; y = yy; } } class Circle extends Point { protected int radius; public Circle() { } public Circle(int xx, int yy, int r) { // super(xx, yy); radius = r; } } Kế thừa 29Nguyễn Việt Hà Thứ tự khởi tạo class Point { protected int x, y; public Point() { System.out.println("Point constructor"); } } class Circle extends Point { protected int radius; public Circle() { System.out.println("Circle constructor"); } } ... Circle c = new Circle(); Kế thừa 30Nguyễn Việt Hà Từ khóa final Thuộc tính final hằng số, chỉ được gán giá trị khởi tạo một lần, không thay đổi được giá trị Phương thức final không cho phép định nghĩa lại ở lớp dẫn xuất Tham số final không thay đổi được giá trị của tham chiếu Lớp final không định nghĩa được lớp dẫn xuất
File đính kèm:
- Bài giảng Kế thừa.pdf