You are on page 1of 149

IS216 - LẬP TRÌNH JAVA

Chương 2
LẬP TRÌNH HĐT
OOP
Nội dung
1. Giới thiệu
2. Lớp và đối tượng
3. Đặc điểm hướng đối tượng trong Java

2
GIỚI THIỆU

3
Lập trình hướng đối tượng

LÀ GÌ ?
4
Giới thiệu
● Object-Oriented Programming (OOP)
● Lập trình hướng đối tượng là phương pháp (bao gồm cả thiết kế
và phát triển) lập trình dựa trên kiến trúc lớp (class) và đối tượng
(object)

5
Giới thiệu
● Đặc điểm:
● Chương trình được chia thành các đối tượng.
● Các cấu trúc dữ liệu được thiết kế sao cho đặc tả được đối tượng.
● Các hàm thao tác trên các vùng dữ liệu của đối tượng được gắn với cấu trúc dữ
liệu đó.
● Dữ liệu được đóng gói lại, được che giấu và không cho phép các hàm ngoại lai
truy nhập tự do.
● Các đối tượng tác động và trao đổi thông tin với nhau qua các hàm
● Có thể dễ dàng bổ sung dữ liệu và các hàm mới vào đối tượng nào đó khi cần
thiết
● Chương trình được thiết kế theo cách tiếp cận từ dưới lên (bottom-up)

6
Giới thiệu
● Phương pháp giải quyết ‘top-down’ (từ trên xuống) cũng còn được gọi là ‘lập
trình hướng cấu trúc’ (structured programming). Nó xác định những chức năng
chính của một chương trình và những chức năng này được phân thành những
đơn vị nhỏ hơn cho đến mức độ thấp nhất.
● Phương pháp OOP cố gắng quản lý việc thừa kế phức tạp trong những vấn
đề đời thực. Để làm được việc này, phương thức OOP che giấu một vài thông
tin bên trong các đối tượng. OOP tập trung trước hết trên dữ liệu. Rồi gắn kết
các phương thức thao tác trên dữ liệu, việc này được xem như là phần thừa
kế của việc định nghĩa dữ liệu.

7
Giới thiệu
Phương pháp Top-Down OOP
Chúng ta sẽ xây dựng một
tòa nhà 10 tầng với những
Chúng ta sẽ xây dựng một dãy có các phòng trung
khách sạn. bình, có các phòng sang
trọng, và một phòng họp
lớn.
Chúng ta sẽ thiết kế các Chúng ta sẽ xây dựng một
tầng lầu, các phòng và khách sạn với những thành
phòng họp. phần trên.

8
Giới thiệu
● 4 basic pillars (nguyên tắc trụ cột) of OOP
● Abstraction: Trừu tượng hóa
● Encapsulation: Đóng gói
● Inheritance: Kế thừa
● Polymorphism: Đa hình

9
Giới thiệu

10
Các khái niệm cơ bản
➢Lớp (class): Là khuôn mẫu (template), là bản mô tả những tính
chất và hành vi chung của những sự vật, hiện tượng tồn tại trong
thực tế.
Ví dụ: các lớp: Con người, Sinh viên, Lớp học, Môn học, Phòng
học….
➢Lớp là cách phân loại (classify) các đối tượng dựa trên đặc điểm
chung của các đối tượng đó.

11
Các khái niệm cơ bản
➢Đối tượng (object): trong thế giới thực khái niệm đối tượng có thể
xem như một thực thể: người, vật, bảng dữ liệu,… Đối tượng trong thế
giới thực: là một thực thể cụ thể mà ta có thể sờ, nhìn thấy hay cảm
nhận được.
○ Đối tượng giúp hiểu rõ thế giới thực
○ Cơ sở cho việc cài đặt trên máy tính
○ Mỗi đối tượng có định danh, thuộc tính, hành vi
○ Ví dụ: đối tượng sinh viên
MSSV: “TH0701001”; Tên sinh viên: “Nguyễn Văn A”

12
Các khái niệm cơ bản
➢Đối tượng (object) của lớp: một đối tượng cụ thể thuộc 1 lớp là 1
thể hiện cụ thể của 1 lớp đó. Một lớp có thể có nhiều thể hiện cụ thể
(nhiều đối tượng)
Ví dụ: Sinh viên A, Sinh viên B là đối tượng của lớp Sinh viên.
➢Quan hệ giữa Class và Object là quan hệ giữa mô tả (khuôn mẫu)
và sự vật, hiện tượng cụ thể được sinh ra từ mô tả đó.

13
Các khái niệm cơ bản
➢Lớp (class): là khuôn mẫu (template) để sinh ra đối tượng. Lớp là
sự trừu tượng hóa của tập các đối tượng có các thuộc tính, hành vi
tương tự nhau, và được gom chung lại thành 1 lớp.
Ví dụ: lớp các đối tượng Sinhviên
○ Sinh viên “Nguyễn Văn A”, mã số TH0701001 → 1 đối tượng thuộc lớp
Sinhviên
○ Sinh viên “Nguyễn Văn B”, mã số TH0701002 → là 1 đối tượng thuộc lớp Sinhviên

14
Các khái niệm cơ bản
➢ Hệ thống các đối tượng: là 1 tập hợp các đối tượng
○ Mỗi đối tượng đảm trách 1 công việc
○ Các đối tượng có thể quan hệ với nhau
○ Các đối tượng có thể trao đổi thông tin với nhau
○ Các đối tượng có thể xử lý song song, hay phân tán

15
LỚP VÀ ĐỐI TƯỢNG
TRONG JAVA
Lớp và đối tượng trong Java
➢ Là một kiểu dữ liệu để chứa định nghĩa những thuộc tính và phương
thức (hành vi) dùng để mô tả một nhóm những đối tượng cùng loại.
➢ Mỗi class có thể có các thành phần:
○ Thuộc tính.
○ Phương thức

17
Lớp và đối tượng trong Java
● Thuộc tính
■ Một thuộc tính của một lớp là một trạng thái chung được đặt tên của tất
cả các thể hiện của lớp đó có thể có.
■ Là các thông tin, trạng thái mà đối tượng của lớp đó có thể mang
■ Ví dụ: Lớp Ô tô có các thuộc tính
○ Màu sắc
○ Vận tốc
■ Bản chất của các thuộc tính là các thành phần dữ liệu của đối tượng

18
Lớp và đối tượng trong Java
● Thuộc tính
■ Các thuộc tính của cũng là các giá trị trừu tượng. Mỗi đối tượng có bản
sao các thuộc tính của riêng nó
■ Ví dụ: một chiếc Ô tô đang đi có thể có màu đen, vận tốc 60 km/h
■ Các thuộc tính phải được khai báo bên trong lớp

19
Lớp và đối tượng trong Java
● Phương thức
■ Xác định các hoạt động chung mà tất cả các thể hiện của lớp có thể thực
hiện được.
■ Xác định cách một đối tượng đáp ứng lại một thông điệp
■ Thông thường các phương thức sẽ hoạt động trên các thuộc tính và
thường làm thay đổi các trạng thái của lớp.
■ Bất kỳ phương thức nào cũng phải thuộc về một lớp nào đó
■ Ví dụ: Lớp Ô tô có các phương thức
● Tăng tốc
● Giảm tốc

20
Lớp và đối tượng trong Java
➢ Class là một kiểu dữ liệu nên object của class chính là biến thuộc
kiểu dữ liệu đó.
● Class có các tính chất sau:
○ Đóng gói: chứa đựng dữ liệu và các hàm/thủ tục liên quan
○ Che giấu dữ liệu: các thực thể phần mềm khác không can thiệp trực
tiếp vào dữ liệu bên trong được mà phải thông qua các phương thức
cho phép
○ Trừu tượng: Lớp chính là kết quả của quá trình trừu tượng hóa dữ liệu:
Lớp định nghĩa một kiểu dữ liệu mới, trừu tượng hóa một tập các đối
tượng

21
Lớp và đối tượng trong Java
➢Khai báo lớp (class):
class <ClassName>
{
<danh sách thuộc tính>
<các khởi tạo>
<danh sách các phương thức>
}

22
Lớp và đối tượng trong Java
➢Thuộc tính: các đặc điểm mang giá trị của đối tượng, là vùng dữ
liệu được khai báo bên trong lớp
class <ClassName> {
<Tiền tố> <kiểu dữ liệu> <tên thuộc tính>;
}

<Tiền tố> (access modifier) Kiểm soát truy cập đối với thuộc tính
Còn gọi là phạm vi

23
Lớp và đối tượng trong Java
➢Phương thức: chức năng xử lý, hành vi của các đối tượng. Phương
thức xác định các hoạt động của lớp

class <ClassName> {

<Tiền tố> <kiểu trả về> <tên phương thức>(<các đối số>){

}
}

24
Lớp và đối tượng trong Java
o <kiểu trả về>: có thể là kiểu void, kiểu cơ sở hay một lớp.
o <Tên phương thức>: đặt theo qui ước giống tên biến.

o <các đối số>: có thể rỗng

25
Các mức truy cập trong Java
➢Có 2 loại là Access Modifier và Non-access Modifier
● Access Modifer trong Java xác định phạm vi có thể truy cập của
biến, phương thức, constructor hoặc lớp. Trong java, có 4 phạm vi
truy cập của Access Modifier như sau:
1. private
2. default
3. protected
4. public
● Ngoài ra, còn có nhiều Non-access Modifier như static, abstract,
synchronized, native, volatile, transient,...
26
Các mức truy cập trong Java
➢ Để bảo vệ dữ liệu tránh bị truy nhập tự do từ bên ngoài, Java sử dụng các
từ khoá quy định phạm vi truy nhập các thuộc tính và phương thức của lớp:
● public: Thành phần công khai, truy nhập tự do từ bên ngoài.
● protected: Thành phần được bảo vệ, được hạn chế truy nhập.
● default (không viết gì): Truy nhập trong nội bộ gói.
● private: Truy nhập trong nội bộ lớp.

27
Các mức truy cập trong Java

28
Các mức truy cập trong Java

29
Các mức truy cập trong Java

30
Các mức truy cập trong Java

31
Các mức truy cập trong Java
● Đặc tính truy xuất của 4 loại modifier được thể hiện như sau:

Private Default Protected Public


Cùng class Yes Yes Yes Yes

Cùng package, khác class No Yes Yes Yes


Class con trong cùng No Yes Yes Yes
package với class cha
Khác package, khác class No No No Yes

Class con khác package với No No Yes Yes


class cha

● Lưu ý: Đối với class thì chỉ có 2 Access modifier đó là public và default. 32
Lớp và đối tượng trong Java
➢Tiền tố:
○ public: có thể truy cập được từ bên ngoài lớp khai báo.
○ protected: có thể truy cập được từ lớp khai báo và các lớp dẫn xuất (lớp con).
○ private: chỉ được truy cập bên trong lớp khai báo.
○ static: phương thức lớp dùng chung cho tất cả các thể hiện của lớp, có thể được
thực hiện kể cả khi không có đối tượng của lớp
○ final: không được khai báo nạp chồng ớ các lớp dẫn xuất.
○ abstract: không có phần source code, sẽ được cài đặt trong các lớp dẫn xuất.
○ synchoronized: dùng để ngăn những tác động của các đối tượngkhác lên đối
tượng đang xét trong khi đang đồng bộ hóa. Dùng trong lập trình multithreads.

33
Lớp và đối tượng trong Java
Ví dụ 1: class Sinhvien {
// Danh sách thuộc tính
String maSv, tenSv, dcLienlac;
int tuoi;

// Danh sách các khởi tạo
Sinhvien(){}
Sinhvien (…) { …}

// Danh sách các phương thức
public void capnhatSV (…) {…}
public void xemThongTinSV() {…}

}
34
Lớp và đối tượng trong Java

// Tạo đối tượng mới thuộc lớp Sinhvien
Sinhvien sv = new Sinhvien();

// Gán giá trị cho thuộc tính của đối tượng
sv.maSv = “TH0601001” ;
sv.tenSv = “Nguyen Van A”;
sv.tuoi = 20;
sv.dcLienlac = “KP6, Linh Trung, Thu Duc”;

// Gọi thực hiện phương thức
sv.xemThongTinSV();
35
Lớp và đối tượng trong Java
Ví dụ 2: class Sinhvien {
// Danh sách thuộc tính
private String maSv; String tenSv, dcLienlac; int
tuoi;

}

Sinhvien sv = new Sinhvien();
sv.maSv = “TH0601001”; /* Lỗi truy cập thuộc tính private từ bên ngoài lớp khai
báo */
Sv.tenSv = “Nguyen Van A”;
36
Lớp và đối tượng trong Java
➢ Hàm khởi tạo (hàm dựng hoặc constructor): là một loại phương
thức đặc biệt của lớp, dùng để khởi tạo một đối tượng.
o Dùng để khởi tạo giá trị cho các thuộc tính của đối tượng.
o Cùng tên với lớp.
o Không có giá trị trả về.
o Tự động thi hành khi tạo ra đối tượng (new)
o Có thể có tham số hoặc không.
➢ Lưu ý: Mỗi lớp sẽ có 1 constructor mặc định (nếu ta không khai
báo constructor nào). Ngược lại nếu ta có khai báo 1 constructor
khác thì constructor mặc định chỉ dùng được khi khai báo tường
minh.
37
Khai báo Constructor
Ví dụ 1
class Sinhvien
{

// Không có định nghĩa constructor nào
}

// Dùng constructor mặc định
Sinhvien sv = new Sinhvien();

38
Khai báo Constructor
Ví dụ 2: class Sinhvien{
class Sinhvien{ …
… // khai báo constructor mặc định
// không có constructor mặc định Sinhvien(){}
// constructor có đối số // constructor có đối số
Sinhvien(<các đối số>) {…} Sinhvien(<các đối số>) {…}
} }
… …
Sinhvien sv = new Sinhvien(); Sinhvien sv = new Sinhvien();
// lỗi biên dịch //Hoặc
Sinhvien sv = new Sinhvien (<các đối số>);

39
Khai báo Constructor
package constructor; package constructor;
class SinhVien { public class Constructor {
private String Ten; public static void main(String[]
args) {
public void In()
SinhVien s= new SinhVien();
{
s.In();
System.out.println("Ten:"+Ten);
} }
} }

Ten:null

40
Khai báo Constructor

package constructor;
package constructor;
class SinhVien { public class Constructor {
private String Ten; public public static void main(String[]
SinhVien() args) {
{ SinhVien s= new SinhVien();
Ten="Nguyen Van Tung"; s.In();
}
public void In() }
{ }
System.out.println("Ten:"+Ten);
}
}
Ten:Nguyen Van Tung

41
Khai báo Constructor
package constructor;
class SinhVien { package constructor;
private String MSSV; public class Constructor {
private String Ten; public static void main(String[] args) {
public SinhVien(){
SinhVien s= new SinhVien(“Anh
Ten="Nguyen Van Tung"; Thu”);
}
public SinhVien(String str){ s.In();
Ten=str; }
} }
public void In(){
System.out.println("Ten:"+Ten);
Ten: Anh Thu
}
}
42
Lớp và đối tượng trong Java
● Overloading method: Việc khai báo trong một lớp nhiều phương
thức có cùng tên nhưng khác tham số (khác kiểu dữ liệu, khác
số lượng tham số) gọi là khai báo chồng phương thức (nạp
chồng phương thức)

43
Lớp và đối tượng trong Java
● Overloading method:

public class OverloadingExample {


static int add(int a, int b) {
return a + b;
}

static int add(int a, int b, int c) {


return a + b + c;
}
}

44
Lớp và đối tượng trong Java
● Overriding method: Là lớp con định nghĩa một phương thức mới
trùng tên và trùng tham số với một phương thức của lớp cha gọi là
ghi đè phương thức.

45
Lớp và đối tượng trong Java
● Overriding method:

class Animal {
void eat() {
System.out.println("eating...");
}
}

class Dog extends Animal {


void eat() {
System.out.println("eating bread...");
}
}
46
Lớp và đối tượng trong Java
Override Overload

Hành vi Thay đổi hành vi hiện tại của phương Thêm hoặc mở rộng cho
thức. hành vi của phương
thức.
Đa hình Thể hiện tính đa hình tại run time. Thể hiện tính đa hình tại
compile time.
Danh sách Danh sách tham số phải giống nhau. Danh sách tham số có
tham số thể khác nhau.
Quyền truy Phương thức ghi đè ở lớp con phải có Các phương thức nạp
cập quyền truy cập bằng hoặc lớn hơn chồng có thể có quyền
phương thức được ghi đè ở lớp cha. truy cập khác nhau.

Giá trị trả về Kiểu trả về bắt buộc phải giống nhau. Kiểu trả về có thể khác
nhau.
Phạm vi Xảy ra giữa 2 class có quan hệ kế Xảy ra trong phạm vi
thừa cùng 1 class. 47
Lớp và đối tượng trong Java
Ví dụ:
class Sinhvien {

public void xemThongTinSV() {

}
public void xemThongTinSV(String psMaSv) {

}
}
48
Lớp và đối tượng trong Java
● Tham chiếu this: là một biến ẩn tồn tại trong tất cả các lớp, this
được sử dụng trong khi chạy và tham khảo đến bản thân lớp chứa
nó.
● Cho phép truy cập vào đối tượng hiện tại của lớp
● Không dùng bên trong các khối lệnh static

49
Lớp và đối tượng trong Java
class Sinhvien {
private String maSv, tenSv, dcLienlac;
int tuoi;

// Mutator Methods
public void setmaSV(String maSv){ this.maSv = maSv;
}
// Accessor Methods
public String getmaSV(String (){ return maSv;
}
}

50
Lớp và đối tượng trong Java
public class Account {
// instance variable
String owner; // Account name long balance; // Balance
//...
// value setting method
void setAccountInfo(String owner, long balance) {
this.owner = owner; this.balance = balance;
} //...
}
51
Lớp và đối tượng trong Java

52
Lớp và đối tượng trong Java
● Truy cập đến các thuộc tính
public class Account {
String name; //Account name
long balance; //Balance
void display(){ System.out.println(…);
}
void deposit (long money){ balance += money;
}}

Account acc1 = new Account(); acc1.name = “Vu T Huong Giang”; acc1.balance = “2000000”;
Account acc2 = new Account(); acc2.name = “Nguyen Manh Tuan”; acc2.balance = “1000000”;
53
Lớp và đối tượng trong Java
● Truy cập đến các phương thức
public class Account {
String name; //Account name
long balance; //Balance
void display(){ System.out.println(…);
}
void deposit (long money){ balance += money;
}}
// Class that uses methods of Account object
Account obj = new Account();
obj.display();
obj.deposit(1000000);

54
Lớp và đối tượng trong Java

55
Bài tập
Vào trang
https://introcs.cs.princeton.edu/java/30oop/
Chọn 1 bài. Đọc và giải thích ý nghĩa các dòng code cũng như chức
năng của các lớp.

56
CÁC ĐẶC ĐIỂM
Đặc điểm hướng đối tượng trong java
1. Tính đóng gói (Encapsulation)

2. Tính kế thừa (Inheritance)

3. Tính đa hình (Polymorphism)

4. Tính trừu tượng (Abstract)

58
1. Tính đóng gói
● Encapsulation
● Đóng gói:
○ Nhóm những gì có liên quan với nhau vào thành một và có thể
sử dụng một cái tên để gọi.
○ Dùng để che giấu một phần hoặc tất cả thông tin, chi tiết cài đặt
bên trong với bên ngoài.
○ Trong Java, tính đóng gói được thể hiện thông qua phạm vi truy
cập (access modifier). Ngoài ra, các lớp liên quan đến nhau có
thể được gom chung lại thành package

59
1. Tính đóng gói
● Ví dụ:
○ Các phương thức đóng gói các câu lệnh.
○ Đối tượng đóng gói dữ liệu và các hành vi / Phương thức liên quan.
(Đối tượng = Dữ liệu + Hành vi/Phương thức)

package <tên gói>; // khai báo trước khi khai báo lớp
class <tên lớp> {

}
60
1. Tính đóng gói
package VD1; package VD2;
public class SinhVien { import VD1.SinhVien;
public void In(){ class VD{
System.out.println("Ten:"); public static void
main(String[] args) {
}
SinhVien sv= new
}
SinhVien();
sv.In();
}
}

61
2. Tính kế thừa
● Inheritance
● Bản chất kế thừa (inheritance) là phát triển lớp mới dựa trên các
lớp đã có. Xây dựng các lớp mới có sẵn các đặc tính của lớp cũ,
đồng thời lớp mới có thể mở rộng các đặc tính của nó.
● Lớp kế thừa gọi là lớp con (child, subclass), lớp dẫn xuất (derived
class). Lớp được kế thừa gọi là lớp cha (parent, superclass), lớp cơ
sở (base class).
● Mối quan hệ kế thừa: Lớp con là một loại (is-a-kind-of) của lớp
cha, kế thừa các thành phần dữ liệu và các hành vi của lớp cha. Có
thể khai báo thêm thuộc tính, phương thức cho phù hợp với mục
đích sử dụng mới.
62
2. Tính kế thừa
Đối tượng hình học

Hình 2d Hình 3d

Tròn E-líp Vuông Chữ nhật Cầu Lập phương … Trụ

o Thừa hưởng các thuộc tính và phương thức đã có


o Bổ sung, chi tiết hóa cho phù hợp với mục đích sử dụng mới
✓ Thuộc tính: thêm mới
✓ Phương thức: thêm mới hay hiệu chỉnh
63
2. Tính kế thừa
● Lớp dẫn xuất hay lớp con (SubClass)
● Lớp cơ sở hay lớp cha (SuperClass)
● Lớp con có thể kế thừa tất cả hay một phần các thành phần dữ liệu
(thuộc tính), phương thức của lớp cha (public, protected, default)
● Dùng từ khóa extends.
Ví dụ:
class nguoi { …
}
class sinhvien extends nguoi { …
}

64
2. Tính kế thừa
➢ Overriding Method
o Được định nghĩa trong lớp con
o Có tên, kiểu trả về & các đối số giống với phương thức của lớp cha
o Có kiểu, phạm vi truy cập không “nhỏ hơn” phương thức trong lớp cha

private default protected public

65
2. Tính kế thừa
•Ví dụ:
class Hinhhoc { …
public float tinhdientich() {
return 0;
}

}

class HinhVuong extends Hinhhoc {


private int canh;
public float tinhdientich() { return canh*canh;
}

}

Chỉ có thể public do phương thức


tinhdientich() của lớp cha là public
66
2. Tính kế thừa
class HinhChuNhat extends HinhVuong {
private int cd;
private int cr;
public float tinhdientich() { return cd*cr;
}

}

Chỉ có thể public do phương


thức tinhdientich() của lớp cha
là public

67
2.1. Từ khóa super
● Gọi constructor của lớp cha
● Nếu gọi tường minh thì phải là câu lệnh đầu tiên
class Nguoi {
public Nguoi(String ten, int tuoi){

}
}
class SinhVien extends nguoi {
public void show(){
System.out.println(“....”);
super(‘A’,20);
} Lỗi do super phải là
}
câu lệnh đầu tiên

68
2.2. Constructor Inheritance
● Sự thừa kế trong hàm khởi tạo
○ Khai báo về thừa kế trong hàm khởi tạo
○ Chuỗi các hàm khởi tạo (Constructor Chaining)
○ Các nguyên tắc của hàm khởi tạo (Rules)
○ Triệu hồi tường minh hàm khởi tạo của lớp cha

69
2.2. Constructor Inheritance
● Trong Java, hàm khởi tạo không thể thừa kế từ lớp cha như các
loại phương thức khác.
● Khi tạo một thể hiện của lớp dẫn xuất, trước hết phải gọi đến hàm
khởi tạo của lớp cha, tiếp đó mới là hàm khởi tạo của lớp con.
● Có thể triệu hồi hàm khởi tạo của lớp cha bằng cách sử dụng từ
khóa super trong phần khai báo hàm khởi tạo của lớp con.

70
2.3. Constructor Chaining
● Chuỗi hàm khởi tạo Parent
class Parent{
public Parent(){
System.out.println("This is constructor of Parent class"); F1
}
}
class F1 extends Parent{
F2
public F1() {
System.out.println("This is constructor of F1 class");
}
}
class F2 extends F1{
public F2(){
System.out.println("This is constructor of F2 class");
}
}
71
2.3. Constructor Chaining
public static void main(String[]
args) { F2 f1=new F2();
}

This is constructor of Parent class


This is constructor of F1 class
This is constructor of F2 class

Khi tạo một thể hiện của lớp dẫn xuất, trước hết
phải gọi đến hàm khởi tạo của lớp cha, tiếp đó là
hàm khởi tạo của lớp con.

72
2.4. Các nguyên tắc của hàm khởi tạo
● Hàm khởi tạo mặc nhiên (default constructor) sẽ tự động sinh ra
bởi trình biên dịch nếu lớp không khai báo hàm khởi tạo.
● Hàm khởi tạo mặc nhiên luôn luôn không có tham số (no-arg)
● Nếu trong lớp có định nghĩa hàm khởi tạo, hàm khởi tạo mặc nhiên
sẽ không còn được sử dụng.
● Nếu không có lời gọi tường minh đến hàm khởi tạo của lớp cha tại
lớp con, trình biên dịch sẽ tự động chèn lời gọi tới hàm khởi tạo
mặc nhiên (implicity) hoặc hàm khởi tạo không tham số (explicity)
của lớp cha trước khi thực thi đoạn code khác trong hàm khởi tạo
lớp con.
73
2.4. Các nguyên tắc của hàm khởi tạo
● Có 1 vấn đề?

Lỗi: Không tìm hàm khởi tạo


của lớp Parent không có tham số

74
2.4. Các nguyên tắc của hàm khởi tạo
● Sửa như thế nào?
Sửa: Thêm hàm khởi
tạo lớp Parent

75
2.4. Các nguyên tắc của hàm khởi tạo
● Triệu hồi tường minh hàm khởi tạo lớp cha

76
2.4. Các nguyên tắc của hàm khởi tạo
● Không gọi tường minh hàm khởi tạo lớp cha ở lớp con

77
2.4. Các nguyên tắc của hàm khởi tạo
public static void main(String[] args) { F1
f1=new F1();
}

Kết quả:
Invoke parent default constructor
Invoke F1default constructor

78
2.5. Ví dụ
class Person {
private String CMND;
private String Name;
private int age;
public Person(String cm, String na, int a){
CMND=cm;
Name=na;
age=a;
}
public void Print(){
System.out.println("Chung minh"+"\t"+"Tên"+"\t"+"Tuoi");
System.out.print(CMND+"\t"+Name+"\t"+age);
}
}45

79
2.5. Ví dụ
class Employee extends Person {
private double salary;
public Employee(String cm, String na, int a, double sa){
super(cm,na,a);
salary=sa;
}
public void Print(){
super.Print();
System.out.print("Luong thang:"+salary);
}
}

80
2.5. Ví dụ
class Maneger extends Employee {
private double allowance;
public Maneger(String cm,String na,int a,double sa,double allow){
super(cm,na,a,sa);
allowance=allow;
}
public void Print(){
super.Print();
System.out.print("Phu cap:"+allowance);
}
}

81
2.5. Ví dụ
class Maneger extends Employee {
private double allowance;
public Maneger(String cm, String na, int a, double sa, double
allow){ super(cm,na,a,sa);
allowance=allow;
}
public void
Print(){
super.Print();
System.out.print("Phu cap:"+allowance);
}
}

82
2.5. Ví dụ
public class Nhanvien {
public static void main(String[] args) {
Person p=new Person("1234", "NGuyen Huu Đat",23);
Employee e=new Employee("2345","Tran Ngoc Tuan", 24,10000000);
Maneger mng= new Maneger("3456", "Lê Văn
Toàn",25,10000000,2000000);
System.out.println("Thong tin nguoi:");
p.Print();
System.out.println();
System.out.println("Thong nhan vien:");
e.Print();
System.out.println();
System.out.print("Thong tin quan ly");
mng.Print();
}
}
83
Kết quả
Thong tin nguoi:
Chung minh Tên Tuoi
1234 Nguyen Huu Đat 23 Thong nhan
vien:

Chung minh Tên Tuoi


2345 Tran Ngoc Tuan 24Luong thang:1.0E7 Thong tin
quan lyChung minh Tên Tuoi

3456 Lê Văn Toàn 25Luong thang:1.0E7Phu cap:2000000.0

84
2.6. Từ khóa Final
➢ Biến Final - Final Variables
➢ Phương thức Final - Final Methods
➢ Lớp Final - Final Classes

85
2.6.1. Biến final
➢ Từ khóa “final” được sử dụng với biến để chỉ rằng giá trị của biến là hằng
số.
➢ Hằng số là giá trị được gán cho biến vào thời điểm khai báo và sẽ không
thay đổi về sau.

86
2.6.2. Phương thức final
● Phương thức hằng
➢ Được sử dụng để ngăn chặn việc ghi đè (override) hoặc che lấp (hidden)
trong các lớp Java.
➢ Phương thức được khai báo là private hoặc là một thành phần của lớp
final thì được xem là phương thức hằng.
➢ Phương thức hằng không thể khai báo là trừu tượng (abstract).

87
2.6.3. Lớp Final
● Lớp hằng
➢ Là lớp không có lớp con (lớp vô sinh)
➢ Hay: là lớp không có kế thừa
➢ Được sử dụng để hạn chế việc thừa kế và ngăn chặn việc sửa đổi một lớp.

88
3. Tính đa hình
➢ Đa hình: Cùng một phương thức có thể có những cách thi hành khác nhau
tại những thời điểm khác nhau.
➢ Trong Java, chúng ta sử dụng nạp chồng phương thức (method
overloading) và ghi đè phương thức (method overriding) để có tính đa hình

89
3. Tính đa hình
package tronvuong; package tronvuong;
class Hinh { class HinhTron extends Hinh {
public void Ve(){ public void Ve(){
System.out.println("Ve hinh"); System.out.println("Ve tron");
} }
} }
package tronvuong;
class HinhVuong extends Hinh{
public void Ve(){
System.out.println("Ve vuong");
}
}
90
3. Tính đa hình
package tronvuong; Kết quả xuất ra màn hình:
public class TronVuong { o Ve hinh
public static void main(String[] args) {
o Ve vuong
Hinh h=new Hinh();
o Ve tron
h.Ve();
Hinh h1 = new HinhVuong();
h1.Ve();
Hinh h2 = new HinhTron();
h2.Ve(); }
}

91
4. Tính trừu tượng
● Tính trừu tượng trong Java là tính chất không thể hiện cụ thể mà
chỉ nêu tên vấn đề. Đó là một quá trình che giấu các hoạt động bên
trong và chỉ hiển thị những tính năng thiết yếu của đối tượng tới
người dùng
● Có 2 cách (cơ bản) để đạt được sự trừu tượng hóa trong java
■ Sử dụng lớp abstract
■ Sử dụng interface

92
4.1. Lớp trừu tượng (Abstract)
➢ Là lớp đặc biệt, các phương thức chỉ được khai báo ở dạng khuôn mẫu
(template) mà không được cài đặt chi tiết.
➢ Dùng để định nghĩa các phương thức và thuộc tính chung cho các lớp con
của nó.
➢ Dùng từ khóa abstract để khai báo một lớp trừu tượng
➢ Lớp abstract không thể tạo ra đối tượng.

93
4.1. Lớp trừu tượng (Abstract)
➢ Có thể khai báo 1 hoặc nhiều phương thức trừu tượng bên trong
lớp. Có thể khai báo các thuộc tính trong lớp trừu tượng. Lớp trừu
tượng có cả phương thức bình thường (regular method) và phương
thức trừu tượng (abstract method).
➢ Không thể tạo ra một đối tượng thuộc lớp trừu tượng, nhưng có thể
khai báo biến thuộclớp trừu tượng để tham chiếu đến các đối tượng
thuộc lớp con của nó.
➢ Nếu lớp abstract có bất kỳ phương thức abstract nào, thì tất cả
những lớp con kế thừa lớp abstract này đều phải định nghĩa lại
những phương thức abstract của lớp đó.

94
4.2. Khai báo lớp trừu tượng
➢Khai báo:
[public] abstract class Tênlớp{
<các thuộc tính>
<các phương thức trừu tượng>
}
➢Tính chất: mặc định là public, bắt buộc phải có từ khoá
abstract để xác định đây là một lớp trừu tượng.
➢Lưu ý: Lớp trừu tượng cũng có thể kế thừa một lớp khác,
nhưng lớp cha cũng phải là một lớp trừu tượng
95
4.3. Khai báo phương thức trừu tượng
➢ Khai báo:
[public] abstract <kiểu dữ liệu trả về> <tên phương thức>([<các tham số>])
[throws <danh sách ngoại lệ>];
➢ Không khai báo tường minh mặc định là public.
➢ Tính chất của phương thức trừu tượng không được là private hay static
➢ Phương thức trừu tượng chỉ được khai báo dưới dạng khuôn mẫu nên
không có phần dấu móc, ngoặc nhọn “{}” mà kết thúc bằng dấu chấm phẩy
“;”.
➢Nếu một lớp bao gồm abstract method nhưng không được khai báo
là lớp abstract thì sẽ gây ra lỗi
96
4.4. Ví dụ lớp trừu tượng
package tronvalapphuong;
astract class Hinh
{
static final double PI=3.1415;
public abstract double DienTich();
public abstract double TheTich();
}

97
4.4. Ví dụ lớp trừu tượng
package tronvalapphuong;
class HinhTron extends Hinh {
private double R;
public HinhTron(double r) {
R=r;
}
@Override
public double DienTich() {return PI*R*R; }
@Override
public double TheTich() {
return 0; }
}
62
98
4.4. Ví dụ lớp trừu tượng
package tronvalapphuong;
class HinhLapPhuong extends Hinh {
private double a;private double b;private double c;
public HinhLapPhuong(double aa, double bb, double cc) {
a=aa;b=bb;c=cc;
}
@Override
public double DienTich() {return(2*(a*b+b*c+a*c)); }
@Override
public double TheTich() {
return a*b*c;
}
}
99
4.4. Ví dụ lớp trừu tượng
package tronvalapphuong;
public class TronVaLapPhuong {
public static void main(String[] args) {
Hinh hr= new HinhTron(5.5);
System.out.println("Hinh tron");
System.out.println("Dien Tich: "+hr.DienTich());
System.out.println("The Tich: "+hr.TheTich());
Hinh hlp=new HinhLapPhuong(2,3,4);
System.out.println("Hinh lap phuong: ");
System.out.println("Dien Tich: "+hlp.DienTich());
System.out.println("The Tich: "+hlp.TheTich());
}
}

100
Kết quả
Hinh tron
DienTich: 95.03037499999999
TheTich: 0.0
Hinh lap phuong:
DienTich: 52.0
TheTich: 24.0

101
4.5. Giao tiếp (giao diện)
● Interfaces: giao tiếp của một lớp, là phần đặc tả (không có phần cài
đặt cụ thể) của lớp, nó chứa các khai báo phương thức và thuộc
tính để bên ngoài có thể truy xuất được.
o Lớp sẽ cài đặt các phương thức trong interface.
o Trong lập trình hiện đại các đối tượng không đưa ra cách truy cập cho một lớp,
thay vào đó cung cấp các interface. Người lập trình dựa vào interface để gọi các
dịch vụ mà lớp cung cấp.
o Thuộc tính của interface là các hằng (final) và các phương thức là trừu tượng
(mặc dù không có từ khóa abstract).
o Một lớp implements nhiều interface

102
4.5. Giao tiếp (giao diện)
● Không thể dẫn xuất từ lớp khác, nhưng có thể dẫn xuất từ những
interface khác
● Nếu một lớp dẫn xuất từ một interface mà interface đó dẫn xuất từ
các interface khác thì lớp đó phải định nghĩa tất cả các phương
thức có trong các interface đó
● Khi định nghĩa một interface mới thì một kiểu dữ liệu tham chiếu
cũng được tạo ra.
○ Tất cả phương thức trong interface phải là public.
○ Các phương thức phải được định nghĩa trong lớp dẫn xuất giao diện đó.

103
4.5. Giao tiếp (giao diện)
● Khai báo:
[public] interface <tên giao tiếp> [extends <danh sách giao tiếp>]

● Tính chất:
o Luôn luôn là public, không khai báo tường minh thì mặc định là public.
o Danh sách các giao tiếp: danh sách các giao tiếp cha đã được định nghĩa
để kế thừa, các giao tiếp cha được phân cách nhau bởi dấu phẩy.
o Lưu ý: Một giao tiếp chỉ có thể kế thừa từ các giao tiếp khác mà
không thể được kế thừa từ các lớp sẵn có.

104
4.5. Giao tiếp (giao diện)
● Phương thức của Interfaces
● Khai báo:
[public] <kiểu giá trị trả về> <tên phương thức> ([<các tham số>]) [throws <danh sách ngoại
lệ>];

105
4.5. Giao tiếp (giao diện)
● Phương thức của Interfaces
● Tính chất:
o Thuộc tính hay phương thức luôn luôn là public, không khai báo tường minh thì mặc
định là public.
o Phương thức được khai báo dưới dạng mẫu, không có cài đặt chi tiết, không có phần dấu
móc “{}” mà kết thúc bằng dấu chấm phẩy “;”. Phần cài đặt chi tiết được thực hiện
trong lớp sử dụng giao tiếp.
o Thuộc tính luôn phải thêm từ khóa là hằng (final) và tĩnh (static)
o Thuộc tính luôn có tính chất là hằng (final), tĩnh (static) và public. Do đó, cần gán giá trị
khởi đầu ngay khi khai báo thuộc tính.

106
4.5. Giao tiếp (giao diện)
● Sử dụng
● Khai báo:
<tính chất> class <tên lớp> implements <các giao tiếp>{…}
o Tính chất và tên lớp được sử dụng như trong khai báo lớp thông thường.
o Các giao tiếp: một lớp có thể cài đặt nhiều giao tiếp. Khi đó, lớp phải cài đặt cụ
thể tất cả các phương thức của tất cả các giao tiếp mà nó sử dụng.
o Lưu ý: Một phương thức được khai báo trong giao tiếp phải được cài đặt cụ thể
trong lớp có cài đặt giao tiếp nhưng không được phép khai báo chồng.

107
4.5. Giao tiếp (giao diện)
● Quan hệ giữa các lớp interface

108
4.5. Giao tiếp (giao diện)
● Đa thừa kế trong Java

109
4.5. Giao tiếp (giao diện)
● Ví dụ:
// Định nghĩa một interface “Hinh” trong tập tin
package vidu1;
public interface Hinh { final double PI=3.1415;
public double DienTich(); public double ChuVi(); public String
LayTenHinh(); public void Nhap();
}

110
4.5. Giao tiếp (giao diện)
● Định nghĩa lớp “HinhTron” implement từ lớp “Hinh”
package vidu1; @Override
import java.util.Scanner; public String LayTenHinh() {
class HinhTron implements Hinh{ return ("Hình tròn");
private double R; }
@Override @Override
public double DienTich() { public void Nhap(){
return PI*R*R; System.out.print("Nhap R=");
} Scanner scan = new
@Override Scanner(System.in);
public double ChuVi() { R=scan.nextDouble();
return 2*PI*R; }
} }

111
4.5. Giao tiếp (giao diện)
● Định nghĩa lớp “HinhVuong” implement từ lớp “Hinh”
package vidu1; @Override
import java.util.Scanner; public String LayTenHinh() {
class HinhVuong implements Hinh{ return ("Hình vuông");
private double canh; }
@Override @Override
public double DienTich() { public void Nhap()
return canh*canh; {
} System.out.print("Nhap canh=");
@Override Scanner scan = new
public double ChuVi() { Scanner(System.in);
return canh*4; canh=scan.nextDouble();
} }
}
112
4.5. Giao tiếp (giao diện)
● Sử dụng các lớp
package vidu1; public class Vidu1 {
public static void main(String[] args) { Hinh h=new HinhTron();
h.Nhap();
System.out.println("Dien tich hình tron:"+h.DienTich()); System.out.println("Chu vi hình
tron:"+h.ChuVi());
h= new HinhVuong();
h.Nhap();
System.out.println("Dien tich hình vuong:"+h.DienTich()); System.out.println("Chu vi hình
:"+h.ChuVi());
}
} 113
4.5. Giao tiếp (giao diện)
● Kết quả
Nhap R=2
Dien tich hình tron:12.566 Chu vi hình tron:12.566
Nhap canh=4
Dien tich hình vuong:16.0 Chu vi hình :16.0

114
4.5. Giao tiếp (giao diện)
● Default methods
● Static methods

115
4.5.1. Default methods
● Khai báo:
default <kiểu giá trị trả về> <tên phương thức> ([<các tham số>]) {.....}

● Tính chất:
o Phương thức default giúp mở rộng interface mà không phải lo ngại phá vỡ các class
được implements từ nó
o Phương thức default giúp tháo gỡ các class cơ sở (base class), có thể tạo
phương thức default và trong class được implement có thể chọn phương thức để
override
o Phương thức default cũng có thể được gọi là phương thức Defender (Defender
Methods) hay là phương thức Virtual mở rộng (Virtual extension methods)

116
4.5.1. Default methods
public interface Interface1 {
void method1(String str);
default void log(String str){
System.out.println("I1 logging::"+str); print(str);
}
}

117
4.5.2. Static methods
● Khai báo:
static <kiểu giá trị trả về> <tên phương thức> ([<các tham số>]) {.....}

118
4.5.2. Static methods
● Tính chất:
o Cũng giống phương thức default ngoại trừ việc nó không thể được override
chúng trong class được implements.
o Phương thức static chỉ hiển thị trong phương thức của interface, nếu xóa phương
thức static trong class được implements, chúng ta sẽ không thể sử dụng nó cho
đối tượng (object) của class được implements
o Phương thức static rất hữu ích trong việc cung cấp các phương thức tiện ích, ví
dụ như là kiểm tra null, sắp xếp tập hợp, v.v…
o Phương thức static giúp chúng ta bảo mật, không cho phép class implements từ nó
có thể override

119
4.5.2. Static methods
● Ví dụ:

static boolean isNull(String str) { System.out.println("Interface Null


Check");
return str == null ? true : "".equals(str) ? true : false;
}

120
4.5.2. Static methods

121
4.5.2. Static methods

1 // Fig. 10.11: Payable.java


2 // Payable interface declaration.
3 Declare interface Payable
4 public interface Payable
5 {
6 double getPaymentAmount(); // calculate payment; no implementation
7 } // end interface Payable

Declare getPaymentAmount method which


is implicitly public and abstract

122
4.5.3. Ví dụ
1 // Fig. 10.12: Invoice.java
2 // Invoice class implements
Payable.
3
4 public class Invoice implements
Payable Class Invoice
5 {
implements
6 private String partNumber;
private String
7
8 partDescription; private int
interface Payable
9 quantity;
10 private double pricePerItem;
11 // four-argument constructor
12 public Invoice( String part, String description, int
13 count, double price )
14 {
15 partNumber = part;
16 partDescription =
17 description;
18 setQuantity( count ); // validate and store quantity
19 setPricePerItem( price ); // validate and store price per
20 item
21 } // end four-argument Invoice constructor
// set part number
22
public void setPartNumber( String part
23 )
24 {
25 partNumber = part;
26 } // end method setPartNumber
123
27 // get part number
28 public String getPartNumber()
29 {
30 return partNumber;
31 } // end method getPartNumber
32
33 // set description
34 public void setPartDescription( String description
35 )
36 {
37 partDescription = description;
38 } // end method setPartDescription
39 // get description
40 public String
41 getPartDescription()
42 {
43 return partDescription;
44 } // end method getPartDescription
45 // set quantity
46 public void setQuantity( int count )
47 {
48 quantity = ( count < 0 ) ? 0 : count; // quantity cannot be
49 negative
50 } // end method setQuantity
51
// get quantity
52
public int getQuantity()
53
{
54
return quantity;
55
} // end method getQuantity
56
124
57 // set price per item
58 public void setPricePerItem( double price )
59 {
60 pricePerItem = ( price < 0.0 ) ? 0.0 : price; // validate price
61 } // end method setPricePerItem
62
63 // get price per item
64 public double getPricePerItem()
65 {
66 return pricePerItem;
67 } // end method getPricePerItem
68
// return String representation of Invoice object
69
public String toString()
70
{
71
return String.format( "%s: \n%s: %s (%s) \n%s: %d \n%s: $%,.2f",
72
"invoice", "part number", getPartNumber(), getPartDescription(),
73
"quantity", getQuantity(), "price per item", getPricePerItem()
74
);
75
} // end method toString
76
// method required to carry out contract with interface
77 Payable
public double
78 getPaymentAmount()
{
79
return getQuantity() * getPricePerItem(); // calculate total cost
80
} // end method
81 getPaymentAmount
82 } // end class Invoice
Declare getPaymentAmount
to fulfill contract with
interface Payable 125
1 // Fig. 10.13: Employee.java
2 // Employee abstract superclass implements
Payable.
3 public abstract class Employee implements
4 Payable
5 { private String Class Employee
6 firstName; private
implements
7 String lastName;
8 private String
interface Payable
9 socialSecurityNumber;
// three-argument constructor
10 public Employee( String first, String last, String ssn
11 )

12 {
firstName = first;
13
lastName = last;
14
socialSecurityNumber = ssn;
15
} // end three-argument Employee constructor
16
17

126
18 // set first name
19 public void setFirstName( String first
20 )
21 {
22 firstName = first;
23 } // end method setFirstName
24 // return first name
25 public String getFirstName()
26 {
27 return firstName;
28 } // end method getFirstName
29
30 // set last name
31 public void setLastName( String last
32 )
33 {
34 lastName = last;
35 } // end method setLastName
36
// return last name
37
public String getLastName()
38
{
39
return lastName;
40
} // end method getLastName
41
127
42 // set social security number
43 public void setSocialSecurityNumber( String ssn
44 )
45 {
46 socialSecurityNumber = ssn; // should
validate
47
} // end method setSocialSecurityNumber
48 // return social security number
49 public String
50 getSocialSecurityNumber()
51 {
52 return socialSecurityNumber;
53 } // end method
54 getSocialSecurityNumber
// return String representation of Employee
55 object public String toString()
56 {
57 return String.format( "%s %s\nsocial security number: %s",
58
getFirstName(), getLastName(), getSocialSecurityNumber()
59
);
60
} // end method toString
61
// Note: We do not implement Payable method getPaymentAmount here
62
so
// this class must be declared abstract to avoid a compilation
error.
63 } // end abstract class Employee

getPaymentAmount
method is not
implemented here 128
1 // Fig. 10.14: SalariedEmployee.java
2 // SalariedEmployee class extends Employee, which implements
Payable.
3 Class SalariedEmployee extends class
public class SalariedEmployee extends Employee
4
5 { private double weeklySalary;
Employee (which implements interface
6 Payable)
7 // four-argument constructor
8 public SalariedEmployee( String first, String last, String
9 ssn, double salary )
10
{
11
super( first, last, ssn ); // pass to Employee
12
constructor setWeeklySalary( salary ); // validate and
13
store salary
14
} // end four-argument SalariedEmployee constructor
15
16 // set salary
17 public void setWeeklySalary( double salary )
18 {
19 weeklySalary = salary < 0.0 ? 0.0 :
20 salary;
21 } // end method setWeeklySalary

129
91
22 // return salary
23 public double getWeeklySalary()
24 {
25 return weeklySalary;
26 } // end method getWeeklySalary
27
28 // calculate earnings; implement interface Payable method that was
29 // abstract in superclass Employee
30 public double getPaymentAmount()
Declare getPaymentAmount
31 {
method instead of earnings
32 return getWeeklySalary();
method
33 } // end method getPaymentAmount
34
35 // return String representation of SalariedEmployee object
36 public String toString()
37 {
38 return String.format( "salaried employee: %s\n%s: $%,.2f",
39 super.toString(), "weekly salary", getWeeklySalary() );
40 } // end method toString
41 } // end class SalariedEmployee 9 130
1 // Fig. 10.15:
PayableInterfaceTest.java
2 // Tests interface Payable.
3
4 public class PayableInterfaceTest Declare array of Payable
5 {
6 public static void main( String args[] variables
7 )
{
8 // create four-element Payable array
9 Payable payableObjects[] = new Payable[ 4
10 ];
11 // populate array with objects that implement Payable
12 payableObjects[ 0 ] = new Invoice( "01234", "seat", 2, 375.00 Assigning
);
13
payableObjects[ 1 ] = new Invoice( "56789", "tire", 4, 79.95
references to
14
15 ); payableObjects[ 2 ] =
Invoice objects to
new SalariedEmployee( "John", "Smith", "111-11-1111", 800.00 ); Payable variables
16
17 payableObjects[ 3 ] =
18 new SalariedEmployee( "Lisa", "Barnes", "888-88-8888", 1200.00
);
System.out.println(
19
20 "Invoices and Employees processed polymorphically:\n" Assigning references to
);
21
SalariedEmployee
objects to Payable
variables
131
22 // generically process each element in array
23 payableObjects for ( Payable currentPayable :
24 payableObjects )
25 {
26 // output currentPayable and its appropriate payment
27 amount System.out.printf( "%s \n%s: $%,.2f\n\n",
28 currentPayable.toString(),
29 } // en
"dpaf
yomr
ent due", currentPayable.getPaymentAmount() );
30 } // end main
31 } // end class PayableInterfaceTest Call toString and
Invoices and Employees processed getPaymentAmount
p o l y m o r p hi c a l ly methods
:
invoice: polymorphically
part number: 01234 (seat)
quantity: 2
price per item: $375.00
payment due: $750.00

invoice:
part number: 56789 (tire)
quantity: 4
price per item: $79.95
payment due: $319.80

salaried employee: John Smith


social security number: 111-11-1111
weekly salary: $800.00
payment due: $800.00

salaried employee: Lisa Barnes


social security number: 888-88-
8888 weekly salary: $1,200.00
payment due: $1,200.00

132
Quan hệ giữa Class và Interfaces

Class Interface

Class extends implements

Interface extends

133
PACKAGES (GÓI)
Giới thiệu
● Những phần của một chương trình Java:
○ Lệnh khai báo gói(package )
○ Lệnh chỉ định gói được dùng (Lệnh import)
○ Khai báo lớp public (một file java chỉ chứa 1 lớp public class)
○ Các lớp khác (classes private to the package)
● Tập tin nguồn Java có thể chứa tất cả hoặc một vài trong số các phần
trên.

135
Gói (Packages)
● Gói (Packages) có thể xem như là thư mục lưu trữ những lớp,
interface và các gói con khác. Đó là những thành phần của gói.
● Là một cơ chế nhóm các loại lớp, giao diện và các lớp con tương tự
nhau dựa trên chức năng.

136
Gói (Packages)
● Những ưu điểm khi dùng gói:
○ Cho phép tổ chức các lớp vào những đơn vị nhỏ hơn
○ Khả năng sử dụng lại: Các lớp có trong các gói package của chương
trình khác có thể dễ dàng sử dụng lại
○ Giúp tránh được tình trạng trùng lặp khi đặt tên.
○ Cho phép bảo vệ các lớp đối tượng
○ Tên gói (Package) có thể được dùng để nhận dạng chức năng của các
lớp.
○ Đóng gói dữ liệu : Chúng cung cấp một cách để ẩn các lớp, ngăn các
chương trình khác truy cập các lớp chỉ dành cho sử dụng nội bộ

137
Gói (Packages)
● Những lưu ý khi tạo gói:
○ Mã nguồn phải bắt đầu bằng lệnh ‘package’
○ Mã nguồn phải nằm trong cùng thư mục mang tên của gói
○ Tên gói nên bắt đầu bằng ký tự thường (lower case) để phân biệt giữa
lớp đối tượng và gói
○ Những lệnh khác phải viết phía dưới dòng khai báo gói là mệnh đề
import, kế đến là các mệnh đề định nghĩa lớp đối tượng
○ Những lớp đối tượng trong gói cần phải được biên dịch
○ Để chương trình Java có thể sử dụng những gói này, ta phải import gói
vào trong mã nguồn

138
Gói (Packages)
● Các gói package được chia thành hai loại:
○ Gói package được xây dựng sẵn (buit-in)
○ Gói package do người dùng xác định (defined)
● Import gói (Importing packages):
○ Xác định tập tin cần được import trong gói
○ Hoặc có thể import toàn bộ gói

139
Gói (Packages)
● Gói package được xây dựng sẵn
○ Được xác định trước là các gói package đi kèm như một phần
của JDK để đơn giản hóa nhiệm vụ của lập trình viên Java.
○ Một số gói package tích hợp thường được sử dụng là java.lang,
java.io,java.util, java.applet…

140
Gói (Packages)
● Gói package được xây dựng sẵn: Ví dụ

141
Gói (Packages)
import java.util.ArrayList;
public class BuiltInPackage {
public static void main(String[] args){
ArrayList<Integer> myList = new
ArrayList<>(3);
myList.add(3);
myList.add(2);
myList.add(1);
System.out.println("Cac thanh phan cua danh
sach la: " + myList);
}
}

142
Các bước tạo ra gói (Package)
● Khai báo gói
package MyPackage;
● Import những gói chuẩn (xây dựng sẵn) cần thiết
● Khai báo và định nghĩa các lớp đối tượng có trong gói
● Lưu các định nghĩa trên thành tập tin .java, và biên dịch những lớp
đối tượng đã được định nghĩa trong gói.
package mypackage;
public class Simple {
public static void main(String args[]) {
System.out.println("Learn java package");
}
}
143
Sử dụng những gói do người dùng định nghĩa (user-defined packages)

● Mã nguồn của những chương trình này phải ở cùng thư mục của gói
do người dùng định nghĩa.
● Để những chương trình Java khác sử dụng những gói này, import gói
vào trong mã nguồn

144
Sử dụng những gói do người dùng định nghĩa (user-defined packages)
package pack; Sử dụng packagename.*
public class A {
public void msg() {
System.out.println("Hello");
}
}

package mypack;
Hello
import pack.*;
class B {
public static void main(String args[]) {
A obj = new A();
obj.msg();
}
}
145
Sử dụng những gói do người dùng định nghĩa (user-defined packages)
package pack; Sử dụng packagename.classname
public class A {
public void msg() {
System.out.println("Hello");
}
}
package mypack;
import pack.A; Hello
class B {
public static void main(String args[]) {
A obj = new A();
obj.msg();
}
}
146
Sử dụng những gói do người dùng định nghĩa (user-defined packages)
package pack; Sử dụng tên đầy đủ
public class A {
public void msg() {
System.out.println("Hello");
}
}
package mypack;
Hello
class B {
public static void main(String args[]) {
pack.A obj = new pack.A();
obj.msg();
}
} 147
Gói và điều khiển truy xuất (Packages & Access Control)

148
Q&A
Giảng viên: Tạ Việt Phương
E-mail: phuongtv@uit.edu.vn
149

You might also like