CÔNG NGHỆ JAVA

CH6. KẾ THỪA, ĐÓNG GÓI TRONG JAVA

Quang Dieu Tran PhD

03/06/18 03/06/18 1 1

Package

03/06/18 2

Package

• Một gói thư viện là tập hợp các lớp, các

giao tiếp, các kiểu liệt kê và các chú thích.

• Nó cung cấp các chức năng bảo vệ truy

cập và quản lý không gian tên • Thao tác trên gói có 2 kỹ thuật:

– KT đặt tên – KT điều khiển truy xuất

03/06/18 3

Package

• Một gói là một nhóm các lớp và giao tiếp có quan hệ với nhau được tổ chức như 1 đơn vị trong không gian tên.

• Gói giúp phân hoạch không gian tên lớp, giao diện thành những vùng dễ quản lý hơn.

03/06/18 4

Đặc điểm gói

• Một gói có thể có nhiều gói con • Không được có hai thành viên trùng tên • Tên của gói được viết bằng chữ thường • Java có 2 loại gói:

– Gói được định nghĩa trước – Gói được định nghĩa bởi người dùng

03/06/18 5

Định nghĩa gói

• Để tạo 1 gói, ta đặt từ khóa package

ngay phát biểu đầu tiên của tập tin nguồn. • Nếu bỏ qua khai báo package  lớp sẽ

được đặt vào gói mặc định.

03/06/18 6

Các bước định nghĩa gói

• Bước 1: lựa chọn tên gói – Tên gói phải là chữ thường – Tên gói không được bắt đầu bằng

java hoặc javax

– Không được bắt đầu bằng số hoặc

dấu nối (-)

• Bước 2: tạo thư mục cùng tên với

gói – Java sử dụng hệ thống thư mục để lưu trữ các gói  các lớp được chứa trong thư mục cùng tên PackageName.

03/06/18 7

Các bước định nghĩa gói

• Bước 3: đưa các tập tin nguồn

vào trong gói – Thêm câu lệnh package vào dòng đầu tiên của mã nguồn.

– Chỉ có duy nhất 1 câu lệnh

package đối với mỗi tệp nguồn.

• Bước 4: biên dịch và chạy ứng

dụng – Khi biên dịch phải đảm bảo sử

dụng tên lớp đầy đủ bao gồm cả tên gói.

– Dùng dấu chấm để phân biệt một package với package cha của nó.

03/06/18 8

Định nghĩa gói

• Java xem gốc của cây phân cấp gọi được định nghĩa ở biến môi trường CLASSPATH

• Ví dụ:

package java.awt.image;

 Được lưu trữ trong thư mục

Java\awt\image với hệ điều hành Windows

03/06/18 9

Điều khiển truy xuất

• Các quyền truy xuất:

03/06/18 10

Sử dụng gói

• Java đưa ra phát biểu import để những lớp nào đó hay toàn bộ gói có thể lấy đượccó thể sử dụng lớp trực tiếp qua tên nó mà không cần dùng dấu chấm truy xuất.

• Trong tập tin Java, khai báo import sẽ

đứng liền sau phát biểu package;

03/06/18 11

Sử dụng gói

• Ví dụ

• Tất cả các gói chuẩn đều nằm trong gói

tên là java  phải nhập tên lớp và gói mà bạn muốn sử dụng.

• Riêng gói java.lang có nhiều chức

năng thông dụngđược import ngầm định • Phát biểu import của gói chỉ có tác dụng

trên các thành phần public của nó.

03/06/18 12

Kế thừa - Inheritance

03/06/18 13

Kế thừa trong thế giới thực

03/06/18 14

Kế thừa trong thế giới thực

• Quá trình truyền các đặc tính và cách cư

xử của cha mẹ cho con cái được gọi là kế thừa.

• Mục đích: tránh tạo ra các đặc tính và hành vi đã có sẵn mà chỉ sử dụng lại những cái có sẵn đó để tạo nên các thực thể mới.

03/06/18 15

Kế thừa trong lập trình

• Là một phần quan trọng và không thể thiếu trong lập trình hướng đối tượng.

• Kế thừa cho phép bạn định nghĩa một lớp tổng quát nhất, sau đó định nghĩa thêm các lớp mới bằng cách thêm 1 số chi tiết vào lớp tổng quát này.

03/06/18 16

Abstract class

03/06/18 17

Lớp trừu tượng (abstract class)

• Chúng ta có thể tạo ra các lớp cơ sở để tái sử dụng mà không muốn tạo ra đối tượng thực của lớp. – Các lớp Point, Circle, Rectangle chung nhau

khái niệm cùng là hình vẽ Shape

 Giải pháp là khai báo lớp trừu tượng

(abstract class)

03/06/18 18

Lớp trừu tượng (abstract class)

• Lớp trừu tượng dùng để tạo ra khung làm việc chung.

• Không thể tạo đối tượng từ lớp trừu tượng.

03/06/18 19

Ví dụ

03/06/18 20

Tái sử dụng

• 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”

03/06/18 21

Tái sử dụng

• 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

03/06/18 22

Ví dụ: has_a

class Person { String name; Date bithday;

public String getName() { return name; } ... } class Employee { Person me; double salary;

public String getName() { return me.getName(); } ... }

03/06/18 23

Ví dụ: has_a

class Manager { Employee me; Employee assistant;

public setAssistant(Employee e) {...} ... } ... Manager junior = new Manager(); Manager senior = new Manager(); senior.setAssistant(junior); // error

03/06/18 24

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

03/06/18 25

Lớp con

• Dùng từ khóa extends để tạo ra lớp con. • Lớp con phải tuân theo 1 số nguyên tắc

sau: – Chỉ được kế thừa trực tiếp từ 1 lớp duy nhất – Nếu nó không có bất kì lớp cha nào thì ngầm

định nó kế thừa lớp Object

– Lớp con không được kế thừa hàm dựng của

lớp cha.

03/06/18 26

Cài đè (Overriding)

• Khi lớp con có 1 phương thức giống hệt

lớp cha, ta gọi đó là cài đè.

• Mục đích: định nghĩa mới hay thực hiện

hành vi khác so với lớp cha.

03/06/18 27

Cài đè (Overriding)

• Qui tắc:

– Phương thức cài đè phải trùng tên, kiểu, số các tham số và kiểu trả về so với phương thức bị cài đè.

– Phương thức bị cài đè phải có định danh truy cập yếu hơn hoặc bằng so với phương thức cài đè.

03/06/18 28

Từ khóa super

• Cho phép lớp con truy cập tới các thành

phần ở lớp cha.

• super trong constructor dùng để truy xuất tới constructor của lớp cha, phải là câu lệnh đầu tiên trong hàm dựng.

03/06/18 29

Nạp chồng phương thức

• Nạp chồng là khả năng lớp có nhiều

phương thức cùng tên

03/06/18 30

Nạp chồng: Các tham số khác nhau

• Số các tham số

khác nhau.

• Kiểu dữ liệu trả về

giống nhau.

03/06/18 31

Nạp chồng: Kiểu dữ liệu trả về khác nhau

• Có cùng số tham số • Khác nhau kiểu dữ

liệu trả về

03/06/18 32

Nạp chồng hàm dựng

• Cho phép xây dựng tượng bằng

đối nhiều cách

03/06/18 33

Các phương thức trừu tượng

• Phương thức chỉ có khai báo mà không có cài đặt

được gọi là phương thức trừu tượng.

• Phương thức trừu tượng là phương thức có từ khóa

abstract

• Phương thức trừu tượng phải được khai báo trong

abstract class hoặc trong interface

• Phương thức trừu tượng không có cặp dấu ngoặc kép ({}) và được kết thúc bằng dấu chấm phẩy (;)

03/06/18 34

Các phương thức trừu tượng

03/06/18 35

Thuật ngữ

• Kế thừa • Lớp cơ sở, lớp cha • Lớp dẫn xuất, lớp con

03/06/18 36

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; } }

03/06/18 37

Kế thừa trong Java

Employee e = new Employee();

Person

e.setName("John"); e.setSalary(3.0);

-name -birthday +setName() +setBirthday()

Employee

-salary +setSalary() +getDetail()

03/06/18 38

Thừa kế nhiều tầng

Person

-name -birthday +setName +setBirthday

Mọi đối tượng đều thừa kế từ lớp gốc Object

Student

Employee

-id ...

-salary +setSalary +getDetail

Programmer

Manager

-project ...

-rank ...

03/06/18 39

Interfaces - giao diện

03/06/18 40

Định nghĩa giao diện

• Bạn có thể trừu tượng hoàn toàn giao diện của lớp với sự hiện thực của nó nhờ từ khóa interface.

• Trong interface bạn đặc tả một lớp

phải làm gì nhưng không cần biết phải làm thế nào.

• Interface là tập các khai báo phương

thức, hằng mà lớp con kế thừa.

03/06/18 41

Định nghĩa giao diện

• Interface có cú pháp tương tự lớp

nhưng không có biến thành viên, chỉ có khai báo hằng và các khai báo phương thức.

• Số lượng lớp hiện thực 1 interface là

không hạn chế.

• 1 lớp cũng được hiện thực số lượng tùy ý

các interface.

03/06/18 42

Định nghĩa giao diện

• Để hiện thực 1 interface, lớp phải cài đặt đầy đủ tất cả các phương thức mà interface đó định nghĩa.

• Interface được thiết kế để hỗ trợ

phương thức động lúc thực thi chương trình.

03/06/18 43

Định nghĩa giao diện

• Cú pháp của 1 interface

03/06/18 44

Hiện thực giao diện

• Sau khi interface được định nghĩa, 1

hay nhiều lớp có thể hiện thực interface đó.

• Để hiện thực 1 interface ta dùng từ

khóa implements, sau đó cài đặt tất cả các phương thức mà interface đó định nghĩa

03/06/18 45

Chú ý

• Các phương thức hiện thực interface

phải khai báo public.

• Hình thức của phương thức phải giống hệt

đặc tả trong interface .

• Nếu một lớp chứa 1 interface nhưng không hiện thực hết tất cả các phương thứclớp phải khai báo abstract.

03/06/18 46

Đa kế thừa

• Java không cho phép đa kế thừa từ nhiều

lớp cơ sở – đảm bảo tính dễ hiểu – hạn chế xung đột

• Nhưng có thể cài đặt đồng thời nhiều giao

diện

03/06/18 47

Ví dụ

interface Action {

void moveTo(int x, int y); void erase(); void draw();

}

class Circle1 implements Action {

int x, y, r; Circle1(int _x, int _y, int _r) { ... }

public void erase() {...} public void draw() {...} public void moveTo(int x1, int y1) {...}

}

03/06/18 48

Truy xuất hiện thực thông qua tham chiếu interface

• Bạn có thể khai báo 1 biến tham chiếu tới

interface .

• Khi bạn gọi phương thức  phương thức thực thi sẽ tự động tìm đến thể hiện thực sự.

03/06/18 49

Biến trong giao diện

• Có thể dùng các biến trong interface

để import các hằng dùng chung cho nhiều lớp.

• Khi hiện thực các interface này thì các

biến trên có tính chất như 1 hằng.

03/06/18 50

Kế thừa giao diện

• Một interface có thể được kế thừa từ 1 interface khác bằng từ khóa extends.

• Khi một lớp hiện thực 1 interface kế

thừa 1 interface khác, nó phải cài đặt tất cả các phương thức của cả 2 interface này

03/06/18 51

Kế thừa giao diện

• Một lớp trừu tượng cũng có thể kế thừa 1

interface khác.

abstract class Shape implements Action {

protected int x, y;

public Shape() {...} public Shape(int _x, int _y) {...}

public void moveTo(int x1, int y1) {

erase(); x = x1; y = y1; draw();

}

}

03/06/18 52