Bài giảng Lập trình hướng đối tượng - Bài 7: Đa hình (Polymophism) - Nguyễn Thị Thu Trang

9/18/17  
Nội dung  
1. Upcasting và Downcasting  
2. Liên kết tĩnh và Liên kết động  
3. Đa hình (Polymophism)  
Bộ môn Công nghệ Phần mềm  
Viện CNTT & TT  
Trường Đại học Bách Khoa Hà Nội  
4. Lập trình tổng quát (generic prog.)  
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG  
Bài 07. Đa hình (Polymophism)  
2
Nội dung  
1.1. Upcasting  
n Moving up the inheritance hierarchy  
1. Upcasting và Downcasting  
2. Liên kết tĩnh và Liên kết động  
3. Đa hình (Polymophism)  
n Up casting là khả năng nhìn nhận đối tượng  
thuộc lớp dẫn xuất như là một đối tượng  
thuộc lớp cơ sở.  
4. Lập trình tổng quát (generic prog.)  
n Tự động chuyển đổi kiểu  
3
4
1
9/18/17  
Ví dụ  
Ví dụ (2)  
class Manager extends Employee {  
Employee assistant;  
// ...  
public void setAssistant(Employee e) {  
assistant = e;  
}
public class Test1 {  
// ...  
public static void main(String arg[]){  
Person p;  
}
public class Test2 {  
public static void main(String arg[]){  
Employee e = new Employee();  
p = e;  
p.setName(“Hoa”);  
Manager junior, senior;  
// ...  
senior.setAssistant(junior);  
// compile error  
p.setSalary(350000);  
}
}
}
5
6
Ví dụ (3)  
1.2. Downcasting  
public class Test3 {  
n Move back down the inheritance hierarchy  
String static teamInfo(Person p1, Person p2){  
return "Leader: " + p1.getName() +  
", member: " + p2.getName();  
}
n Down casting là khả năng nhìn nhận một đối  
tượng thuộc lớp cơ sở như một đối tượng  
thuộc lớp dẫn xuất.  
public static void main(String arg[]){  
Employee e1, e2;  
n Không tự động chuyển đổi kiểu  
à Phải ép kiểu.  
Manager m1, m2;  
// ...  
System.out.println(teamInfo(e1, e2));  
System.out.println(teamInfo(m1, m2));  
System.out.println(teamInfo(m1, e2));  
}
}
7
8
2
9/18/17  
Ví dụ  
Nội dung  
public class Test2 {  
public static void main(String arg[]){  
Employee e = new Employee();  
1. Upcasting và Downcasting  
2. Liên kết tĩnh và Liên kết động  
3. Đa hình (Polymophism)  
Person p = e; // up casting  
Employee ee = (Employee) p; // down casting  
Manager m = (Manager) ee; // run-time error  
4. Lập trình tổng quát (generic prog.)  
Person p2 = new Manager();  
Employee e2 = (Employee) p2;  
Person p3 = new Employee();  
Manager e3 = (Manager) p3;  
}
}
9
10  
2.1. Liên kết tĩnh (Static Binding)  
Ví dụ  
public class Test {  
n Liên kết tại thời điểm biên dịch  
public static void main(String arg[]){  
n
Early Binding/Compile-time Binding  
Person p = new Person();  
p.setName(“Hoa”);  
p.setSalary(350000); //compile-time error  
n
Lời gọi phương thức được quyết định khi biên  
dịch, do đó chỉ có một phiên bản của phương  
thức được thực hiện  
}
}
n
n
Nếu có lỗi thì sẽ có lỗi biên dịch  
Ưu điểm về tốc độ  
11  
12  
3
9/18/17  
Ví dụ  
2.2. Liên kết động (Dynamic binding)  
public class Test {  
public static void main(String arg[]){  
n Lời gọi phương thức được quyết định khi  
Person p = new Person();  
// ...  
thực hiện (run-time)  
Employee e = new Employee();  
// ...  
Manager m = new Manager();  
// ...  
Person pArr[] = {p, e, m};  
for (int i=0; i< pArr.length; i++){  
System.out.println(  
n
Late binding/Run-time binding  
Phiên bản của phương thức phù hợp với đối  
tượng được gọi.  
n
n
Java mặc định sử dụng liên kết động  
pArr[i].getDetail());  
}
}
}
13  
14  
Nội dung  
3. Đa hình (Polymophism)  
n Ví dụ: Nếu đi du lịch, bạn có thể chọn ô tô, thuyền, hoặc  
1. Upcasting và Downcasting  
máy bay  
2. Liên kết tĩnh và Liên kết động  
3. Đa hình (Polymophism)  
4. Lập trình tổng quát (generic prog.)  
n
Dù đi bằng phương tiện gì, kết quả cũng giống nhau là  
bạn đến được nói cần đến  
n
Cách thức đáp ứng các dịch vụ có thể khác nhau  
15  
16  
4
9/18/17  
3. Đa hình (2)  
3. Đa hình (3)  
n Các lớp khác nhau có thể đáp ứng danh sách các thông điệp  
n Polymorphism: Nhiều hình thức thực hiện,  
giống nhau, vì vậy cung cấp các dịch vụ giống nhau  
nhiều kiểu tồn tại  
n
Cách thức đáp ứng  
thông điệp, thực hiện  
dịch vụ khác nhau  
n Đa hình trong lập trình  
n
Đa hình phương thức:  
n
Chúng có thể tráo đổi  
cho nhau mà không  
ảnh hưởng đến đối  
tượng gửi thông điệp  
n
Phương thức trùng tên, phân biệt bởi danh sách tham  
số.  
n
Đa hình đối tượng  
n
Nhìn nhận đối tượng theo nhiều kiểu khác nhau  
n
à Đa hình  
n
Các đối tượng khác nhau cùng đáp ứng chung danh  
sách các thông điệp có giải nghĩa thông điệp theo  
cách thức khác nhau.  
17  
18  
3. Đa hình (4)  
3. Đa hình (5)  
n Nhìn nhận đối tượng theo nhiều  
kiểu khác nhau à Upcasting và  
Downcasting  
n Các đối tượng khác nhau giải nghĩa các  
thông điệp theo các cách thức khác nhau à  
Liên kết động  
public class Test3 {  
n Ví dụ:  
public static void main(String  
Person p1 = new Person();  
Person p2 = new Employee();  
Person p3 = new Manager();  
// ...  
args[]){  
Person p1 = new Employee();  
Person p2 = new Manager();  
Employee e = (Employee) p1;  
Manager m = (Manager) p2;  
System.out.println(p1.getDetail());  
System.out.println(p2.getDetail());  
System.out.println(p3.getDetail());  
}
}
19  
20  
5
9/18/17  
Ví dụ khác  
Toán tử instanceof  
class EmployeeList {  
Employee list[];  
public class Employee extends Person {}  
public class Student extends Person {}  
...  
public void add(Employee e) {...}  
public void print() {  
for (int i=0; i<list.length; i++) {  
public class Test{  
public doSomething(Person e) {  
if (e instanceof Employee) {...  
} else if (e instanceof Student) {... ){  
} else {...}  
System.out.println(list[i].getDetail());  
}
}
...  
}
}
EmployeeList list = new EmployeeList();  
Employee e1; Manager m1;  
...  
list.add(e1); list.add(m1);  
list.print();  
21  
22  
Static Binding và Polymorphism  
Dynamic Binding và Polymorphism  
n
n
Abstract Class  
Overriding:  
n Function/Method Overloading  
n
Java: mặc định phương thức lớp con trùng chữ ký lớp cha à là overriding  
n Constructor Overloading: là 1 thể hiện của  
function overloading  
n Operator Overloading  
n
C#: Muốn overriding một phương thức ảo hoặc trừu tượng thuộc lớp cha phải dùng từ  
khoá override  
n
C++: phương thức của lớp dẫn xuất cùng kí hiệu với phương thức được khai báo với  
từ khoá virtual trong lớp cha à nó overriding phương thức của lớp cha (tương tự  
Java)  
n
Abstract Method và Virtual Method  
n
Abstract method: là p/thức chỉ có khai báo interface, không có cài đặt. Lớp dẫn xuất  
từ lớp có các abstract method phải implement tất cả các phương thức loại này. Java,  
C#: dùng từ khóa abstract  
n C# và C++ cư xử với hàm định nghĩa chồng  
theo cơ chế static binding trong khi Java cư  
xử theo cơ chế dynamic binding  
n
Virtual method: Là p/thức có thể bị overridden trong lớp dẫn xuất và phải có cài đặt  
trong lớp cơ sở. Lớp dẫn xuất có thể không cần overriding p/thức này.  
n
Java: mặc định mọi phương thức đều là virtual (trừ final)  
n
C#: khai báo dùng từ khóa virtual. Dùng từ khóa override cho phương thức ghi đè ở lớp dẫn  
xuất.  
n
Riêng với C#, nếu bỏ 2 từ khóa à che được phương thức lớp cha. Để tránh warning, dùng từ khóa  
new chỉ tường minh (chuyển thành static binding)  
23  
24  
n
C++: khai báo dùng từ khóa virtual. Ý nghĩa như Java, mặc định bị ghi đè, không che được  
6
9/18/17  
Nội dung  
4. Lập trình tổng quát  
n 4.1. Giới thiệu  
n 4.2. Java generic data structure  
1. Upcasting và Downcasting  
2. Liên kết tĩnh và Liên kết động  
3. Đa hình (Polymophism)  
4. Lập trình tổng quát (generic  
prog.)  
n
n
n
n
4.2.1. Data structure  
4.2.2. Java collection framework  
4.2.3. Các interface trong Java collection framework  
4.2.4. Các cài đặt cho các interface – implementation  
n 4.3. Định nghĩa và sử dụng Template  
n 4.4. Ký tự đại diện (Wildcard)  
25  
26  
4. Lập trình tổng quát  
4. 1. Giới thiệu về lập trình tổng quát  
n Tổng quát hóa chương trình để có thể hoạt  
động với các kiểu dữ liệu khác nhau, kể cả  
kiểu dữ liệu trong tương lai  
n
4.1. Giới thiệu  
4.2. Java generic data structure  
n
n
n
n
n
4.2.1. Data structure  
n
thuật toán đã xác định  
4.2.2. Java collection framework  
4.2.3. Các interface trong Java collection framework  
4.2.4. Các cài đặt cho các interface – implementation  
n Ví dụ:  
n
n
n
n
C: dùng con trỏ void  
C++: dùng template  
Java: lợi dụng upcasting  
Java 1.5: template  
n
n
4.3. Định nghĩa và sử dụng Template  
4.4. Ký tự đại diện (Wildcard)  
27  
28  
7
9/18/17  
Ví dụ: C dùng con trỏ void  
Ví dụ: C++ dùng template  
template<class ItemType>  
void sort(ItemType A[], int
// Sort count items in the arr
// The algorithm that is us
for (int i = count-1; i > 0; i--) {  
int index_of_max = 0;  
for (int j = 1; j <= i ; j++)  
if (A[j] > A[index_of_max]) index_of_max = j;  
if (index_of_max != i) {  
ItemType temp = A[i];  
A[i] = A[index_of_max];  
A[index_of_max ] = temp;  
}
Khi sử dụng,có thể thay thế  
ItemType bằng int, string,… hoặc  
bất kỳ một đối tượng của một lớp  
n Hàm memcpy:  
void* memcpy(void* region1,  
const void* region2, size_t n){  
nào đó  
const char* first = (const char*)region2;  
const char* last = ((const char*)region2) + n;  
char* result = (char*)region1;  
while (first != last)  
*result++ = *first++;  
return result;  
}
}
}
29  
30  
Nhắc lại – equals của lớp tự viết  
Ví dụ: Java dùng upcasting và Object  
class MyValue {  
class MyStack {  
int i;  
...  
}
public void push(Object obj) {...}  
public Object pop() {...}  
}
public class EqualsMethod2 {  
public static void main(String[] args) {  
MyValue v1 = new MyValue();  
MyValue v2 = new MyValue();  
v1.i = v2.i = 100;  
public class TestStack{  
MyStack s = new MyStack();  
Point p = new Point();  
Circle c = new Circle();  
s.push(p); s.push(c);  
Circle c1 = (Circle) s.pop();  
Point p1 = (Point) s.pop();  
}
System.out.println(v1.equals(v2));  
System.out.println(v1==v2);  
}
}
31  
32  
8
9/18/17  
class MyValue {  
Bài tập  
int i;  
public boolean equals(Object obj) {  
n Viết lại phương thức equals cho lớp MyValue  
return (this.i == ((MyValue) obj).i);  
}
(phương thức này kế thừa từ lớp Object)  
}
public class EqualsMethod2 {  
public static void main(String[] args) {  
MyValue v1 = new MyValue();  
MyValue v2 = new MyValue();  
v1.i = v2.i = 100;  
System.out.println(v1.equals(v2));  
System.out.println(v1==v2);  
}
}
34  
Ví dụ: Java 1.5: Template  
Ví dụ: Java 1.5: Template (2)  
n
Dùng Template:  
List<Integer> myList = new LinkedList<Integer>();  
myList.add(new Integer(0));  
Integer x = myList.iterator().next();  
//myList.add(new Long(0));  
à
Error  
n Không dùng Template  
List myList = new LinkedList();  
myList.add(new Integer(0));  
Integer x = (Integer)  
myList.iterator().next();  
35  
36  
9
9/18/17  
4. Lập trình tổng quát  
4.2.1. Cấu trúc dữ liệu-data structure  
n Cấu trúc dữ liệu là cách tổ chức dữ liệu để  
n
n
4.1. Giới thiệu  
4.2. Java generic data structure  
giải quyết vấn đề.  
n
n
n
n
4.2.1. Data structure  
n Một số cấu trúc dữ liệu phổ biến:  
4.2.2. Java collection framework  
4.2.3. Các interface trong Java collection framework  
4.2.4. Các cài đặt cho các interface – implementation  
n
n
n
n
n
Mảng (Array)  
Danh sách liên kết (Linked List)  
Ngăn xếp (Stack)  
Hàng đợi (Queue)  
Cây (Tree)  
n
n
4.3. Định nghĩa và sử dụng Template  
4.4. Ký tự đại diện (Wildcard)  
37  
38  
a. Linked List  
a. Linked List (2)  
n Linked list là cấu trúc gồm các node liên kết với nhau  
thông qua các mối liên kết. Node cuối linked list  
được đặt là null để đánh dấu kết thúc danh sách.  
n
Thể hiện Node thông qua lớp tự tham chiếu (self-  
referential class)  
class Node  
n Linked list giúp tiết kiệm bộ nhớ so với mảng trong  
{
private int data;  
private Node nextNode;  
// constructors and methods ...  
các bài toán xử lý danh sách.  
n Khi chèn/xoá một node trên linked list, không phải  
dãn/dồn các phần tử như trên mảng.  
}
n Việc truy nhập trên linked list luôn phải tuần tự.  
15  
10  
39  
40  
10  
9/18/17  
a. Linked List (3)  
b. Stack  
n
n
Stack là một cấu trúc theo kiểu LIFO (Last In  
First Out), phần tử vào sau cùng sẽ được lấy ra  
trước.  
n Một linked list được quản lý bởi tham chiếu tới node  
đầu và node cuối.  
Hai thao tác cơ bản trên Stack  
firstNode  
lastNode  
n
Chèn phần tử: Luôn chèn vào đỉnh Stack  
(push)  
n
Lấy ra phần tử: Luôn lấy ra từ đỉnh Stack  
(pop)  
...  
H
D
Q
41  
42  
c. Tree  
d. Queue  
n Tree là một cấu trúc phi tuyến (non-linear).  
n
n
Queue (Hàng đợi) là cấu trúc theo kiểu FIFO  
(First In First Out), phần tử vào trước sẽ được  
lấy ra trước.  
n Mỗi node trên cây có thể có nhiều liên kết tới node  
khác.  
Nút gốc  
Hai thao tác cơ bản trên hàng đợi  
n
Chèn phần tử: Luôn chèn vào cuối hàng đợi  
(enqueue)  
Nút trong  
n
Lấy ra phần tử: Lấy ra từ đầu hàng đợi  
(dequeue)  
Nút lá  
43  
44  
11  
9/18/17  
e. Binary Search Tree  
e. Binary Search Tree (2)  
n Cây nhị phân là cây mà mỗi node không có quá 2  
n Ví dụ về Binary Search Tree  
node con.  
n Cây tìm kiếm nhị phân là cây nhị phân mà:  
47  
n
n
Giá trị các nút thuộc cây con bên trái nhỏ hơn giá trị của  
nút cha.  
Giá trị các nút thuộc cây con bên phải lớn hơn giá trị của  
nút cha.  
Cây con trái  
Cây con phải  
25  
77  
n Duyệt cây nhị phân  
11  
43  
65  
68  
93  
n
n
n
Inorder traversal  
Preorder traversal  
Postorder traversal  
7
17  
31 44  
45  
46  
4. Lập trình tổng quát  
4.2.2. Java Collection Framework  
n Collection là đối tượng có khả năng chứa  
n
n
4.1. Giới thiệu  
4.2. Java generic data structure  
các đối tượng khác.  
n Các thao tác thông thường trên collection  
n
n
n
n
4.2.1. Data structure  
n
Thêm/Xoá đối tượng vào/khỏi collection  
4.2.2. Java collection framework  
4.2.3. Các interface trong Java collection framework  
4.2.4. Các cài đặt cho các interface – implementation  
n
Kiểm tra một đối tượng có ở trong collection  
không  
n
n
n
Lấy một đối tượng từ collection  
Duyệt các đối tượng trong collection  
Xoá toàn bộ collection  
n
n
4.3. Định nghĩa và sử dụng Template  
4.4. Ký tự đại diện (Wildcard)  
47  
48  
12  
9/18/17  
4.2.2. Java Collection Framework (2)  
4.2.2. Java Collection Framework (3)  
n Các collection đầu tiên của Java:  
n Một số lợi ích của Collections Framework  
n
n
n
Mảng  
Vector: Mảng động  
Hastable: Bảng băm  
n
n
n
n
Giảm thời gian lập trình  
Tăng cường hiệu năng chương trình  
Dễ mở rộng các collection mới  
Khuyến khích việc sử dụng lại mã chương trình  
n Collections Framework (từ Java 1.2)  
n
Là một kiến trúc hợp nhất để biểu diễn và thao  
tác trên các collection.  
n
Giúp cho việc xử lý các collection độc lập với biểu  
diễn chi tiết bên trong của chúng.  
49  
50  
4. Lập trình tổng quát  
4.2.2. Java Collection Framework (4)  
n 4.1. Giới thiệu  
n Collections Framework bao gồm  
n
Interfaces: Là các giao tiếp thể hiện tính chất  
của các kiểu collection khác nhau như List, Set,  
Map.  
Implementations: Là các lớp collection có sẵn  
được cài đặt các collection interfaces.  
Algorithms: Là các phương thức tĩnh để xử lý  
trên collection, ví dụ: sắp xếp danh sách, tìm  
phần tử lớn nhất...  
n 4.2. Java generic data structure  
n
n
n
4.2.1. Data structure  
4.2.2. Java collection framework  
4.2.3. Các interface trong Java collection  
framework  
n
n
n
4.2.4. Các cài đặt cho các interface – implementation  
n 4.3. Định nghĩa và sử dụng Template  
n 4.4. Ký tự đại diện (Wildcard)  
51  
52  
13  
9/18/17  
4.2.3. Interfaces  
a. Giao diện Collection  
n List: Tập các đối tượng tuần tự, kế tiếp nhau, có thể lặp lại  
n Set: Tập các đối tượng không lặp lại  
n Xác định giao diện cơ bản cho các  
thao tác với một tập các đối tượng  
n
n
n
Thêm vào tập hợp  
Xóa khỏi tập hợp  
Kiểm tra có là thành viên  
n Map: Tập các cặp khóa-giá trị (key-value) và không cho  
phép khóa lặp lại  
<<interface>>  
Collection  
<<interface>>  
Map  
n Chứa các phương thức thao tác  
trên các phần tử riêng lẻ hoặc theo  
khối  
<<interface>>  
<<interface>>  
List  
<<interface>>  
SortedMap  
n Cung cấp các phương thức cho  
phép thực hiện duyệt qua các  
phần tử trên tập hợp (lặp) và  
chuyển tập hợp sang mảng  
Set  
<<interface>>  
SortedSet  
53  
54  
b. Giao diện List  
c. Giao diện Set  
n List kế thừa từ Collection, nó cung cấp thêm các  
phương thức để xử lý collection kiểu danh sách (Danh  
sách là một collection với các phần tử được xếp theo  
chỉ số).  
n
n
Set kế thừa từ Collection, hỗ trợ các thao tác xử lý trên  
collection kiểu tập hợp (Một tập hợp yêu cầu các phần  
tử phải không được trùng lặp).  
Set không có thêm phương thức riêng ngoài các  
phương thức kế thừa từ Collection.  
n Một số phương thức của List  
n
n
n
n
n
n
Object get(int index);  
Object set(int index, Object o);  
void add(int index, Object o);  
Object remove(int index);  
int indexOf(Object o);  
int lastIndexOf(Object o);  
55  
56  
14  
9/18/17  
d. Giao diện SortedSet  
n SortedSet kế thừa từ Set, nó hỗ trợ thao tác trên tập  
hợp các phần tử có thể so sánh được. Các đối tượng  
đưa vào trong một SortedSet phải cài đặt giao tiếp  
Comparable hoặc lớp cài đặt SortedSet phải nhận một  
Comparator trên kiểu của đối tượng đó.  
Collection,  
Set và List  
n Một số phương thức của SortedSet:  
n
n
n
Object first(); // lấy phần tử đầu tiên (nhỏ nhất)  
Object last(); // lấy phần tử cuối cùng (lớn nhất)  
SortedSet subSet(Object e1, Object e2); // lấy một tập các phần tử  
nằm trong khoảng từ e1 tới e2.  
57  
58  
e. Duyệt collection  
e. Duyệt collection (2)  
n Các phần tử trong collection có thể được duyệt thông  
n
n
Iterator cho phép duyệt tuần tự một collection.  
Các phương thức của Iterator:  
qua Iterator.  
n Các lớp cài đặt Collection cung cấp phương thức trả về  
n
n
n
boolean hasNext();  
Object next();  
void remove();  
iterator trên các phần tử của chúng.  
n
Ví dụ:  
Collection c;  
Iterator it = c.iterator();  
while ( it.hasNext() ) {  
Point p = (Point) it.next();  
System.out.println( p.toString() );  
}
...  
Iterator it = c.iterator();  
59  
60  
15  
9/18/17  
f. Giao diện Iterator  
f. Giao diện Iterator (2) - Ví dụ  
Collection c;  
n Cung cấp cơ chế thuận tiện để  
duyệt (lặp) qua toàn bộ nội  
dung của tập hợp, mỗi lần là  
một đối tượng trong tập hợp  
// Some code to build the  
collection  
n
Giống như SQL cursor  
Iterator i = c.iterator();  
while (i.hasNext()) {  
Object o = i.next();  
// Process this object  
}
n ListIterator thêm các phương  
thức đưa ra bản chất tuần tự  
của danh sách cơ sở  
n Iterator của các tập hợp đã sắp  
xếp duyệt theo thứ tự tập hợp  
62  
g. Giao diện Map  
g. Giao tiếp Map (2)  
n
Xác định giao diện cơ bản để thao tác với một  
tập hợp bao gồm cặp khóa-giá trị  
n
Map cung cấp 3 cách view dữ liệu:  
n
n
n
View các khoá:  
n
n
n
n
Thêm một cặp khóa-giá trị  
Xóa một cặp khóa-giá trị  
Lấy về giá trị với khóa đã có  
Kiểm tra có phải là thành viên  
(khóa hoặc giá trị)  
Set keySet(); // Trả về các khoá  
View các giá trị:  
Collection values(); // Trả về các giá trị  
View các cặp khoá-giá trị  
Set entrySet(); // Trả về các cặp khoá-giá trị  
n
Cung cấp 3 cách nhìn cho  
nội dung của tập hợp:  
n
n
n
Tập các khóa  
Tập các giá trị  
Tập các ánh xạ khóa-giá trị  
n
Sau khi nhận được kết quả là một collection, ta có  
thể dùng iterator để duyệt các phần tử của nó.  
63  
64  
16  
9/18/17  
h. Giao diện SortedMap  
4. Lập trình tổng quát  
n Giao diện SortedMap kế thừa từ Map, nó cung cấp thao  
n 4.1. Giới thiệu  
n 4.2. Java generic data structure  
tác trên các bảng ánh xạ với khoá có thể so sánh được.  
n Giống như SortedSet, các đối tượng khoá đưa vào  
trong SortedMap phải cài đặt giao tiếp Comparable  
hoặc lớp cài đặt SortedMap phải nhận một Comparator  
trên đối tượng khoá.  
n
n
n
n
4.2.1. Data structure  
4.2.2. Java collection framework  
4.2.3. Các interface trong Java collection framework  
4.2.4. Các cài đặt cho các interface –  
implementation  
n 4.3. Định nghĩa và sử dụng Template  
n 4.4. Ký tự đại diện (Wildcard)  
65  
66  
4.2.4. Implementations  
4.2.4. Implementations (2)  
LinkedList  
List  
n Các cài đặt trong Collections Framework chính là các  
ArrayList  
lớp collection có sẵn trong Java. Chúng cài đặt các  
collection interface ở trên để thể hiện các cấu trúc dữ  
liệu cụ thể. Ví dụ: mảng động, danh sách liên kết, cây  
đỏ đen, bảng băm...  
HashSet  
LinkedHashSet  
Set  
SortedSet  
TreeSet  
HashMap  
LinkedHashMap  
SortedMap  
Map  
TreeMap  
67  
68  
17  
9/18/17  
4.2.4. Implementations (3) -Mô tả các cài  
đặt  
4.2.4. Implementations (3) -Mô tả các cài  
đặt  
n ArrayList: Mảng động, nếu các phần tử thêm vào vượt  
quá kích cỡ mảng, mảng sẽ tự động tăng kích cỡ.  
n LinkedList: Danh sách liên kết 2 chiều. Hỗ trợ thao tác  
n
n
HashMap: Bảng băm (cài đặt của Map).  
LinkedHashMap: Bảng băm kết hợp với linked list nhằm  
đảm bảo thứ tự các phần tử (cài đặt của Map).  
trên đầu và cuối danh sách.  
n
TreeMap: Cây đỏ đen (cài đặt của Map).  
n HashSet: Bảng băm.  
n LinkedHashSet: Bảng băm kết hợp với linked list nhằm  
đảm bảo thứ tự các phần tử.  
n TreeSet: Cây đỏ đen (red-black tree).  
69  
70  
public class MapExample {  
public static void main(String args[]) {  
Map map = new HashMap();  
Integer ONE = new Integer(1);  
for (int i=0, n=args.length; i<n; i++) {  
String key = args[i];  
4.2.4. Implementations (3) – Tổng kết  
Integer frequency =(Integer)map.get(key);  
if (frequency == null) { frequency = ONE; }  
else {  
int value = frequency.intValue();  
frequency = new Integer(value + 1);  
}
map.put(key, frequency);  
}
System.out.println(map);  
Map sortedMap = new TreeMap(map);  
System.out.println(sortedMap);  
}
72  
}
18  
9/18/17  
4. Lập trình tổng quát  
4.3. Định nghĩa và sử dụng Template  
n
n
4.1. Giới thiệu  
4.2. Java generic data structure  
class MyStack<T> {  
n
n
n
n
4.2.1. Data structure  
...  
4.2.2. Java collection framework  
4.2.3. Các interface trong Java collection framework  
4.2.4. Các cài đặt cho các interface – implementation  
public void push(T x) {...}  
public T pop() {  
...  
}
n
n
4.3. Định nghĩa và sử dụng Template  
4.4. Ký tự đại diện (Wildcard)  
}
73  
74  
Nhắc lại ví dụ: Lập trình tổng quát trên  
Java dùng upcasting và Object  
Sử dụng template  
public class Test {  
class MyStack {  
public static void main(String args[]) {  
...  
public void push(Object obj) {...}  
public Object pop() {...}  
}
MyStack<Integer> s1 = new MyStack<Integer>();  
s1.push(new Integer(0));  
Integer x = s1.pop();  
public class TestStack{  
MyStack s = new MyStack();  
Point p = new Point();  
Circle c = new Circle();  
s.push(p); s.push(c);  
Circle c1 = (Circle) s.pop();  
Point p1 = (Point) s.pop();  
}
//s1.push(new Long(0));  
à
Error  
MyStack<Long> s2 = new MyStack<Long>();  
s2.push(new Long(0));  
Long y = s2.pop();  
}
}
75  
76  
19  
9/18/17  
Định nghĩa Iterator  
4. Lập trình tổng quát  
public interface List<E>{  
void add(E x);  
n 4.1. Giới thiệu  
n 4.2. Java generic data structure  
Iterator<E> iterator();  
}
n
n
n
n
4.2.1. Data structure  
4.2.2. Java collection framework  
4.2.3. Các interface trong Java collection framework  
4.2.4. Các cài đặt cho các interface – implementation  
public interface Iterator<E>{  
E next();  
boolean hasNext();  
n 4.3. Định nghĩa và sử dụng Template  
n 4.4. Ký tự đại diện (Wildcard)  
}
class LinkedList<E> implements List<E> {  
// implementation  
}
77  
78  
4.4. Ký tự đại diện (Wildcard)  
Ví dụ: Sử dụng Wildcards  
public class Test {  
public class Test {  
void printList(List<?> lst) {  
Iterator it = lst.iterator();  
while (it.hasNext())  
System.out.println(it.next());  
}
public static void main(String args[]) {  
List<String> lst0 = new LinkedList<String>();  
//List<Object> lst1 = lst0; Error  
//printList(lst0); Error  
à
à
}
public static void main(String args[]) {  
List<String> lst0 =  
void static printList(List<Object> lst) {  
Iterator it = lst.iterator();  
while (it.hasNext())  
System.out.println(it.next());  
}
new LinkedList<String>();  
List<Employee> lst1 =  
new LinkedList<Employee>();  
}
printList(lst0);  
printList(lst1);  
// String  
// Employee  
}
79  
80  
}
20  
Tải về để xem bản đầy đủ
pdf 21 trang yennguyen 24340 Free
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình hướng đối tượng - Bài 7: Đa hình (Polymophism) - Nguyễn Thị Thu Trang", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_lap_trinh_huong_doi_tuong_bai_7_da_hinh_polymophis.pdf