Nội dung
• Thừa kế
 Thừa kế là gì?
 Thừa kế trong Java
 Hàm xây dựng trong thừa kế
• Đa hình
 Nạp đè phương thức
 Đa hình
 Ứng dụng của tính đa hình
• Lớp trừu tượng & Phương thức trừu tượng
• Đa thừa kế (multiple inheritance)
• Giao diện (interface)
              
                                            
                                
            
 
            
                
67 trang | 
Chia sẻ: phuongt97 | Lượt xem: 680 | Lượt tải: 0
              
            Bạn đang xem trước 20 trang nội dung tài liệu Bài giảng Lập trình hướng đối tượng - Chương 3: Thừa kế và đa hình - Trần Công Án, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ả lập đa thừa kế
 Đa thừa kế (multiple inheritance)
public class ChildClass implements InterfaceOne, InterfaceTwo {
private InterfaceOne one;
private InterfaceTwo two;
ChildClass(InterfaceOne one, InterfaceTwo two) {
this.one = one;
this.two = two;
}
@Override
public String methodA(int a) {
return one.methodA(a);
}
@Override
public void methodB(String s) {
two.methodB(s);
}
}
CT176 – Lập trình Hướng đối tượng 50
Giao diện 
(interface)
CT176 – Lập trình Hướng đối tượng 51
Giao diện (interface)
• Một giao diện có thể xem là một lớp hoàn toàn ảo: tất 
cả các phương thức đều không được cài đặt
• Một giao diện:
 Chỉ chứa các khai báo của các phương thức với thuộc tính 
truy cập public
 Hoặc các hằng số tĩnh public (public static final...)
 Được khai báo bằng từ khóa interface
 Giao diện (interface)
[public] interface [extends ] {
//khai báo của các hằng số (static final ...)
//khai báo các phương thức
}
CT176 – Lập trình Hướng đối tượng 52
Giao diện (interface)
• Giao diện đóng vai trò như một “cam kết” (contract): 
 Giao diện có thể làm được gì (nhưng không chỉ định làm như 
thế nào)
 Qui ước đặt tên: tiếp vị ngữ -able (có khả năng/có thể)
• Một lớp có thể cài đặt (implement) các giao diện:
 Cài đặt tất cả các phương thức của các giao diện
 Xác nhận khả năng của lớp có thể làm được gì
 Sử dụng từ khóa implements
• Không thể tạo đối tượng thuộc một giao diện, nhưng có 
thể tạo tham chiếu thuộc kiểu giao diện
 Giao diện (interface)
CT176 – Lập trình Hướng đối tượng 53
Ví dụ
 Giao diện (interface)
public interface Movable {
//abstract methods to be implemented 
//by the subclasses
public void moveUp();
public void moveDown();
public void moveLeft();
public void moveRight();
}
CT176 – Lập trình Hướng đối tượng 54
Ví dụ
 Giao diện (interface)
public class MovablePoint implements Movable {
private int x, y; //coordinates of the point
public MovablePoint(int x, int y) {
this.x = x; this.y = y;
}
public String toString() {
return "(" + x + "," + y + ")";
}
public void moveUp() { y--; }
public void moveDown() { 
y++; 
}
public void moveLeft() {
x--;
}
public void moveRight() {
x++;
}
}
public class TestMovable {
public static void main(String[] args) {
Movable m1 = new MovablePoint(5, 5);
System.out.println(m1);
m1.moveDown();
System.out.println(m1);
m1.moveRight();
System.out.println(m1);
}
}
Kết quả:
CT176 – Lập trình Hướng đối tượng 55
Phương thức mặc định (default method)
• Từ Java 8, các giao diện có thể có các phương thức mặc 
định:
 Là phương thức được cài đặt (có thân hàm)
 Cho phép thêm vào giao diện các phương thức mà không làm 
các lớp đã cài đặt giao diện bị lỗi
• Các lớp cài đặt phương thức có thể cài đặt hay không 
cài đặt các phương thức mặc định:
 Không cài đặt: thừa kế phương thức mặc định
 Cài đặt: nạp đè phương thức mặc định của giao diện
 Không cài đặt, chỉ khai báo: phương thức ảo.
• Cú pháp: thêm từ khóa default trước khai báo
 Giao diện (interface)
CT176 – Lập trình Hướng đối tượng 56
Tổng kết
• Tính thừa kế cho phép sử dụng lại mã (reuse code)
• Lớp thừa kế được gọi là lớp con, lớp được thừa kế 
được gọi là lớp cha
• Lớp con có tất cả các thành phần của lớp cha
 Định nghĩa thêm thuộc tính hoặc phương thức mới
 Nạp đè (overriding) hàm của lớp cha
• Quan hệ giữa lớp con và lớp cha là quan hệ là (is-a)
• Tính đa hình cho phép các loại đối tượng khác nhau 
ứng xử khác nhau với cùng 1 thông điệp
• Đa hình: thừa kế + nạp đè hàm + liên kết động
 Tổng kết
CT176 – Lập trình Hướng đối tượng 57
Tổng kết
• Java không hỗ trợ đa thừa kế (lớp con có hơn 1 lớp cha)
• Các kỹ thuật mô phỏng đa thừa kế: 
 Hàm mặc nhiên (default method) của giao diện 
 Quan hệ composition (hay delegation) 
• Giao diện:
 Đóng vai trò như một “cam kết” về tính năng của một kiểu
 Như là một lớp hoàn toàn ảo: chỉ có khai báo phương thức, 
không có định nghĩa phương thức và các thuộc tính
 Tổng kết
CT176 – Lập trình Hướng đối tượng 58
Tổng kết
 Tổng kết
https://goo.gl/iK0Bj2
CT176 – Lập trình Hướng đối tượng 59
Quiz
1. Which of the following is true about inheritance in 
Java?
a) Private methods are final.
b) Protected members are accessible within a package and 
inherited classes outside the package.
c) Protected methods are final.
d) We cannot override private methods. 
e) In Java all classes inherit from the Object class directly or 
indirectly, the Object class is root of all classes.
f) Multiple inheritance is not allowed in Java
 Quiz
CT176 – Lập trình Hướng đối tượng 60
Quiz
2. Say that there are three classes: Computer, 
AppleComputer, and IBMComputer. What are the likely 
relationships between these classes? 
a) Computer is the superclass, AppleComputer and IBMComputer
are subclasses of Computer
b) IBMComputer is the superclass, AppleComputer and Computer
are subclasses of IBMCompute
c) Computer, AppleComputer and IBMComputer are sibling 
classes
d) Computer is a superclass, AppleComputer is a subclasses of 
Computer, and IBMComputer is a sublclas of AppleComputer
 Quiz
CT176 – Lập trình Hướng đối tượng 61
Quiz
3. Can an object be a subclass of another object?
a) Yes, as long as single inheritance is followed
b) No, inheritance is only between classes
c) Only when one has been defined in terms of the other
d) Yes, when one object is used in the constructor of another.
4. How many objects of a given class can there be in a 
program?
a) One per defined class
b) One per constructor definition
c) As many as the program needs
d) One per main() method
 Quiz
CT176 – Lập trình Hướng đối tượng 62
Quiz
5. Which of the following is correct syntax for defining a 
new class Jolt based on the superclass SoftDrink?
a) class Coca isa SoftDrink { /*class member */ }
b) class Coca implements SoftDrink { /*class member */ }
c) class Coca defines SoftDrink { /*class member */ }
d) class Coca extends SoftDrink { /*class member */ }
6. What restriction of using the super in a constructor?
a) It can only be used in the parent's constructor
b) Only one child class can use it
c) It must be used in the last statement of the constructor
d) It must be used in the first statement of the constructor
 Quiz
CT176 – Lập trình Hướng đối tượng 63
Quiz
7. Output of following Java Program?
 Quiz
class Base {
public void show() {
System.out.println("Base::show() called");
}
}
class Derived extends Base {
public void show() {
System.out.println("Derived::show() called");
}
}
public class Main {
public static void main(String[] args) {
Base b = new Derived();;
b.show();
}
}
a) Derived::show() called
b) Base::show() called
CT176 – Lập trình Hướng đối tượng 64
Quiz
8. Output of following Java Program?
 Quiz
class Base {
final public void show() {
System.out.println("Base::show() called");
}
}
class Derived extends Base {
public void show() {
System.out.println("Derived::show() called");
}
}
class Main {
public static void main(String[] args) {
Base b = new Derived();;
b.show();
}
}
a) Base::show() called
b) Derived::show() called
c) Compiler Error
d) Runtime Error
CT176 – Lập trình Hướng đối tượng 65
Quiz
9. Output of following Java Program?
 Quiz
class Base {
public static void show() {
System.out.println("Base::show() called");
}
}
class Derived extends Base {
public static void show() {
System.out.println("Derived::show() called");
}
}
class Main {
public static void main(String[] args) {
Base b = new Derived();;
b.show();
}
}
(A) Base::show() called
(B) Derived::show() called
(C) Compiler Error
CT176 – Lập trình Hướng đối tượng 66
Quiz
10. Output of following Java Program?
 Quiz
(A) Base Derived Derived
(B) Base Base Derived
(C) Base Derived Base
(D) Complier Error
class Main {
public static void doPrint(Base b) {
b.print();
}
public static void main(String[] args) {
Base x = new Base();
Base y = new Derived();
Derived z = new Derived();
doPrint(x);
doPrint(y);
doPrint(z);
}
}
class Base {
public void print() {
System.out.println("Base");
}
}
class Derived extends Base {
public void print() {
System.out.println("Derived");
}
}
CT176 – Lập trình Hướng đối tượng 67
Quiz
11. Output of following Java Program?
 Quiz
class Grandparent {
public void print() {
System.out.println("Grandparent's print()");
}
}
class Parent extends Grandparent {
public void print() {
System.out.println("Parent's print()");
}
}
class Child extends Parent {
public void print() {
super.super.print();
System.out.println("Child's print()");
}
}
public class Main {
public static void main( 
String[] args) {
Child c = new Child();
c.print();
}
}
CT176 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Question?
            Các file đính kèm theo tài liệu này:
bai_giang_lap_trinh_huong_doi_tuong_chuong_3_thua_ke_va_da_h.pdf