Download as pdf or txt
Download as pdf or txt
You are on page 1of 10

Mục tiêu

v Giới thiệu về upcas/ng và downcas/ng


v Phân biệt liên kết =nh và liên kết động
v Nắm vững kỹ thuật đa hình
v Ví dụ và bài tập về các vấn đề trên với ngôn ngữ
Bài 8: Đa hình lập trình Java

1 2

Nội dung Nội dung


1. Upcas/ng và Downcas/ng 1. Upcas(ng và Downcas(ng
2. Liên kết =nh và Liên kết động 2. Liên kết =nh và Liên kết động
3. Đa hình (Polymorphism) 3. Đa hình (Polymorphism)
4. Ví dụ và bài tập 4. Ví dụ và bài tập

3 4

3 4

1
1. Upcasting và Downcasting 1. Upcasting và Downcasting
v Chuyển đổi kiểu dữ liệu nguyên thủy v Chuyển đổi kiểu dữ liệu tham chiếu
§ Java tự động chuyển đổi kiểu khi § Kiểu dữ liệu tham chiếu có thể được chuyển đổi kiểu
• Kiểu dữ liệu tương thích khi
• Chuyển đổi từ kiểu hẹp hơn sang kiểu rộng hơn • Kiểu dữ liệu tham chiếu (lớp) tương thích A
int i; • Nằm trên cùng một cây phân cấp kế thừa
double d = i; A var1 = new B();
§ Phải ép kiểu khi
• Kiểu dữ liệu không tương thích A var1 = new A();
• Chuyển đổi từ kiểu rộng hơn sang kiểu hẹp hơn C var2 = (C)var1; B
int i; § Hai loại chuyển đổi
byte b = i; byte b = (byte)i;
• Up-casFng
• Down-casFng

5 6

5 6

1.1 Upcasting Ví dụ Upcasting Person


- name: String
v Upcas/ng: đi lên trên cây phân cấp thừa kế - birthday: Date
(moving up the inheritance hierarchy) + setName(String)

v Upcas/ng là khả năng nhìn nhận đối tượng thuộc + setBirthday(Date)

lớp dẫn xuất như là một đối tượng thuộc lớp cơ + getDetails(): String

sở. public class Test1 { Employee


v Tự động chuyển đổi kiểu public static void main(String arg[]) {
- salary: double
Employee e = new Employee();
Person p; + setSalary(double)
p = e; + getDetails(): String
p.setName(“Hoa”);
p.setSalary(350000); // compile error
}

7 8

7 8

2
Ví dụ Upcasting Person
Ví dụ Upcasting Person
class Manager extends Employee { - name: String public class Test3 { - name: String
Employee assistant; - birthday: Date String static teamInfo(Person p1, - birthday: Date
// ... + setName(String) Person p2) { + setName(String)
public void setAssistant(Employee e) { + setBirthday(Date) return "Leader: " + p1.getName() + + setBirthday(Date)
assistant = e; + getDetails(): String ", member: " + p2.getName(); + getDetails(): String
} }
// ... public static void main(String arg[]) {
} Employee Employee e1, e2; Employee
public class Test2 { - salary: double Manager m1, m2; - salary: double

public static void main(String arg[]) { + setSalary(double) // ... + setSalary(double)

Manager junior, senior; + getDetails(): String System.out.println(teamInfo(e1, e2)); + getDetails(): String

// ... System.out.println(teamInfo(m1, m2));


senior.setAssistant(junior); System.out.println(teamInfo(m1, e2));
Manager Manager
} }
- assistant: Employee - assistant: Employee
} }
+ setAssistant(Employee) + setAssistant(Employee)

+ getDetails():String + getDetails():String
9 10

9 10

1.2 Downcasting Ví dụ Downcasting


v Down cas/ng: đi xuống cây phân cấp thừa kế
(move back down the inheritance hierarchy) public class Test2 {
public static void main(String arg[]) {
v Down cas/ng là khả năng nhìn nhận một đối Employee e = new Employee();
tượng thuộc lớp cơ sở như một đối tượng thuộc Person p = e; // upcasting
lớp dẫn xuất. Employee ee = (Employee) p; // downcasting
v Không tự động chuyển đổi kiểu Manager m = (Manager) ee; // run-time error

à Phải ép kiểu. Person p2 = new Manager();


Employee e2 = (Employee) p2;

Person p3 = new Employee();


Manager e3 = (Manager) p3;
}
}
11 12

11 12

3
Toán tử instanceof Nội dung
v Kiểm tra xem một đối tượng có phải là thể hiện của một 1. Upcas/ng và Downcas/ng
lớp nào đó không
v Trả về: true | false (nếu đối tượng là null thì trả về false) 2. Liên kết 8nh và Liên kết động
3. Đa hình (Polymorphism)
public class Employee extends Person {}
public class Student extends Person {} 4. Ví dụ và bài tập
public class Test{
public doSomething(Person e) {
if (e instanceof Employee) {...
} else if (e instanceof Student) {...
} else {...
}
}
}

13 14

13 14

Liên kết lời gọi hàm Trong ngôn ngữ Hướng đối tượng
v Liên kết lời gọi hàm (func/on call binding) là quy v Liên kết lời gọi phương thức (method call
trình xác định khối mã hàm cần chạy khi một lời binding): quá trình liên kết lời gọi phương thức tới
gọi hàm được thực hiện đoạn code thực thi phương thức
§ Ví dụ xử lý liên kết lời gọi hàm trong C: đơn giản vì mỗi v Có 2 loại:
hàm có duy nhất một tên § Liên kết Lnh (staFc binding)
§ Liên kết động (dynamic binding)

15 16

15 16

4
2.1 Liên kết tĩnh Ví dụ liên kết tĩnh trong Java
v Liên kết tại thời điểm biên dịch class Human {
public static void walk() {
§ Early Binding/Compile-`me Binding }
System.out.println("Human walks");
§ Lời gọi phương thức được quyết định khi biên dịch, do }
public class Boy extends Human {
đó chỉ có một phiên bản của phương thức được thực public static void walk() {
System.out.println("Boy walks");
hiện }
§ Nếu có lỗi thì sẽ có lỗi biên dịch public static void main(String args[]) {
// Reference is of Human type and object is Boy type
§ Ưu điểm về tốc độ Human obj1 = new Boy();

v Ví dụ trong Java: các phương thức sta/c // Reference is of Human type and object is Human type.
Human obj2 = new Human();
// Reference is of Human type and object is Human type.
Boy obj3 = new Boy();
obj1.walk();
obj2.walk();
obj3.walk();
obj1 = obj3;
obj1.walk();
}
}
17 18

17 18

2.2 Liên kết động Ví dụ Person


v Lời gọi phương thức được quyết định khi thực public class Test { - name: String

hiện (run-<me) public static void main(String arg[]){ - birthday: Date


Person p = new Person(); + setName(String)
§ Late binding/Run-Fme binding
// ... + setBirthday(Date)
§ Phiên bản của phương thức phù hợp với đối tượng được gọi
Employee e = new Employee(); + getDetails(): String
§ Java trì hoãn liên kết phương thức cho đến thời gian // ...
chạy (run-time) - đây được gọi là liên kết động hoặc Manager m = new Manager();
liên kết trễ Employee
// ...
• Java mặc định sử dụng liên kết động
Person pArr[] = {p, e, m}; - salary: double

for (int i=0; i< pArr.length; i++){ + setSalary(double)

System.out.println( + getDetails(): String

pArr[i].getDetail());
}
Manager
}
- assistant: Employee
}
+ setAssistant(Employee)

+ getDetails():String
19 20

19 20

5
Bài tập 1 Nội dung
1. Upcas<ng và Downcas<ng
v Giả sử lớp Sub kế thừa từ lớp cha Sandwich. Tạo hai đối tượng 2. Liên kết Lnh và Liên kết động
từ các lớp này:
Sandwich x = new Sandwich(); 3. Đa hình (Polymorphism)
Sub y = new Sub(); 4. Ví dụ và bài tập
v Phép gán nào sau đây là hợp lệ?
1. x = y;
2. y = x;
3. y = new Sandwich();
4. x = new Sub();

21 22

21 22

3. Đa hình (Polymophism) 3. Đa hình


v Ví dụ: Nếu đi du lịch, bạn có thể chọn ô tô, thuyền, hoặc v Các lớp khác nhau có thể đáp ứng danh sách các thông
máy bay điệp giống nhau, vì vậy cung cấp các dịch vụ giống nhau
§ Dù đi bằng phương `ện gì, kết quả cũng giống nhau là
bạn đến được nói cần đến
§ Cách thức đáp ứng các dịch vụ có thể khác nhau n Cách thức đáp ứng thông
điệp, thực hiện dịch vụ
khác nhau
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 à Đa hình

23 24

23 24

6
3. Đa hình 3. Đa hình Person
v Polymorphism: Nhiều hình thức thực hiện, nhiều - name: String

kiểu tồn tại v Nhìn nhận đối tượng theo nhiều kiểu khác
- birthday: Date

+ setName(String)
§ Khả năng của một biến tham chiếu thay đổi hành nhau à Upcasting và Downcasting + setBirthday(Date)
vi theo đối tượng mà nó đang tham chiếu tới
+ getDetails(): String
v Đa hình trong lập trình public class Test3 {
§ Đa hình phương thức: public static void main(String
args[]){ Employee
• Phương thức trùng tên, phân biệt bởi danh sách tham số.
Person p1 = new Employee(); - salary: double
§ Đa hình đối tượng
Person p2 = new Manager(); + setSalary(double)
• Nhìn nhận đối tượng theo nhiều kiểu khác nhau + getDetails(): String
• 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 Employee e = (Employee) p1;
nhau. Manager m = (Manager) p2; Manager
} - assistant: Employee
} + setAssistant(Employee)

+ getDetails():String
25 26

25 26

3. Đa hình 3. Đa hình Person


v Các đối tượng khác nhau giải nghĩa các thông v Ví dụ: - name: String

điệp theo các cách thức khác nhau à Liên kết v Các đối tượng khác nhau giải nghĩa
- birthday: Date

động + setName(String)
các thông điệp theo các cách thức + setBirthday(Date)
v Ví dụ: khác nhau + getDetails(): String

Person p1 = new Person(); § Liên kết động (Java)


Person p2 = new Employee(); Person p1 = new Person(); Employee
Person p2 = new Employee(); - salary: double
Person p3 = new Manager();
Person p3 = new Manager(); + setSalary(double)
// ...
// ... + getDetails(): String

System.out.println(p1.getDetail()); System.out.println(p1.getDetail());
System.out.println(p2.getDetail()); System.out.println(p2.getDetail()); Manager
System.out.println(p3.getDetail());
System.out.println(p3.getDetail()); - assistant: Employee

+ setAssistant(Employee)

+ getDetails():String
27 28

27 28

7
Toán tử instanceof Nội dung
public class Employee extends Person {} 1. Upcas<ng và Downcas<ng
public class Student extends Person {} 2. Liên kết Lnh và Liên kết động
3. Đa hình (Polymorphism)
public class Test{
4. Ví dụ và bài tập
public doSomething(Person e) {
if (e instanceof Employee) {...
} else if (e instanceof Student) {...
){
} else {...}
}
}

29 32

29 32

Bài tập 2 Bài tập 3

v Cho v Những điều kiện nào trả về true? (Có thể xem Java
biểu đồ lớp: documentation để biết các quan hệ thừa kế giữa các lớp)
Biết rằng System.out là một đối tượng của lớp PrintStream.
1. System.out instanceof PrintStream
2. System.out instanceof OutputStream
3. System.out instanceof LogStream
4. System.out instanceof Object
5. System.out instanceof String
Phương thức printLine() của lớp nào sẽ được sử dụng trong mỗi trường hợp dưới đây, biết 6. System.out instanceof Writer
rằng z là một đối tượng của lớp F? Giải thích ngắn gọn?
1. z.printLine(1)
2. z.printLine(2, "Object-Oriented Programming")
3. z.printLine("Java")
4. z.printLine("Object-Oriented Programming", "Java")
5. z.printLine("Object-Oriented Programming", 3)

33 34

33 34

8
Bài tập 4 Bài tập 5
v Kiểm tra các đoạn mã sau đây và vẽ sơ đồ v Giải thích các đầu ra (hoặc các lỗi nếu có)
lớp tương ứng cho chương trình thử nghiệm sau:

35 36

35 36

PhongBan NhanVien
Bài tập 6 - tenPhongBan: String - tenNhanVien: String
1 1..*

v Phân tích xây dựng các lớp như mô tả sau: - soNhanVien: int + LUONG_MAX: double
+ SO_NV_MAX: int + tinhLuong(): double
§ Hàng điện máy <mã hàng, tên hàng, nhà sản xuất, giá, thời
+ themNV(NhanVien): + inThongTin()
gian bảo hành, điện áp, công suất> boolean
§ Hàng sành sứ < mã hàng, tên hàng, nhà sản xuất, giá, loại + xoaNV(): NhanVien
nguyên liệu> + tinhTongLuong(): double
NhanVienCoHuu NhanVienHopDong
§ Hàng thực phẩm <mã hàng, tên hàng, nhà sản xuất, giá, + inThongTin() - luongCoBan: double - luongHopDong: double
ngày sản xuất, ngày hết hạn dùng> - heSoLuong: double + tinhLuong(): double

v Viết chương trình tạo mỗi loại một mặt hàng cụ Bài tập 7 + tinhLuong(): double + inThongTin()

thể. Xuất thông tin về các mặt hàng này. v Xây dựng các lớp như biểu
+ tangHeSoLuong(double):
boolean
đồ ở hình bên + inThongTin()
§ Tính tổng lương của tất
cả nhân viên trong
phòng ban
TruongPhong
- phuCap: double
- soNamDuongChuc: int

+ tinhLuong(): double
37 38
+ inThongTin()

37 38

9
40

40

10

You might also like