Bài giảng Lập trình Java - Chương 3: Lập trình hướng đối tượng trong Java, cung cấp cho người học những kiến thức như: Một số khái niệm; Thiết kế lớp (class); Thuộc tính; Phương thức; Phương thức khởi tạo; Thành viên static; Sự đóng gói; Từ khóa this; Kế thừa; Đa hình; Lớp trừu tượng; Packages & Interfaces.
Trang 1Interfaces
Trang 2Trang 3
Object-Oriented Programming
• Chương trình bao gồm các đối tượng
• Các đối tượng tương tác với nhau thông
qua các phương thức của chúng
Trang 4Vấn đề bài toán (*)
• Cho một tập tin lưu tọa độ (x,y) của các thành phố,
bắt đầu là số lượng thành phố như sau:
• Viết một chương trình hiển thị tọa độ các thành phố
trên một DrawingPanel, sau đó đặt một “quả bom” với
bán kính cho trước và tô màu đỏ các thành phố trong
int cityCount = input.nextInt();
int[] xCoords = new int [cityCount];
int[] yCoords = new int [cityCount];
for (int i = 0; i < cityCount; i++) {
• Sử dụng song song 2 mảng để lưu tọa độ x
và y cho mỗi thành phố với cùng một chỉ số
Trang 5• Dữ liệu trong bài toán này là tập hợp các
điểm (Point) cần lưu trữ các đối tượng
Point
– Mỗi Point chứa hai tọa độ x và y
– So sánh khoảng cách giữa các điểm để xem
một điểm có nằm trong phạm vi nổ bom hay
• Lớp (class): là một kiểu dữ liệu mở rộng
được định nghĩa, bao gồm:
• Danh sách các thuộc tính (dữ liệu)
• Các phương thức mô tả hành vi của một
nhóm đối tượng nào đó
• Đối tượng (object):
• Là một thể hiện cụ thể của lớp, các thuộc tính
có giá trị xác định.
• Là một biến có kiểu dữ liệu là lớp.
Trang 6song = "Letting You"
volume = 9 battery life = 3.41 hrs
behavior:
power on/off change station/song change volume choose random song
iPod #3 state:
song = "Discipline"
volume = 24 battery life = 1.8 hrs
behavior:
power on/off change station/song change volume choose random song creates
Tính trừu tượng (Abstraction)
• abstraction: chúng ta sử dụng đối tượng
nhưng không cần biết chi tiết thiết kế bên
trong đối tượng
Trang 73 Thiết kế lớp (class)
• Từ bài toán (*) ở mục 1, ta thiết kế class
Point
– Định nghĩa một kiểu dữ liệu có tên là Point.
– Mỗi đối tượng Point object có hai trường
Point objects (desired)
– Point p1 = new Point(5, -2);
– Point p2 = new Point(); // origin, (0, 0)
setLocation(x, y) Thiết lập tọa độ x, y cho điểm
translate(dx, dy) Dịch chuyển tọa độ x và y theo độ dời dx, dy
distance(p) Tính khoảng cách từ điểm hiện tại đến điểm p
draw(g) Hiển thị tọa độ điểm
Field name Description
x the point's x-coordinate
y the point's y-coordinate
Trang 8setLocation(int x, int y) translate(int dx, int dy) distance(Point p) draw(Graphics g)
setLocation(int x, int y) translate(int dx, int dy) distance(Point p) draw(Graphics g)
Point object #3
state:
x = 18, y = 42 behavior:
setLocation(int x, int y) translate(int dx, int dy) distance(Point p) draw(Graphics g)
Khai báo lớp
• Cú pháp:
• pack.name: tên gói (nếu cần thiết)
• modifier: chỉ định truy cập (public hoặc
modifier class ClassName {
Khai báo thuộc tính;
Khai báo và định nghĩa phương thức }
Trang 9– Lưu ý: lưu code này trong tập tin Point.java.
– Khai báo trên chưa có phương thức
• public: có thể truy cập từ mọi nơi
• protected: có thể truy cập từ trong gói hoặc từ các lớp
con
• private: chỉ có thể truy cập từ chính lớp đó
• Không chỉ định: có thể truy cập từ trong gói
– Ví dụ:
public class Student {
public String name; //name double gpa; // Grade Point Average }
Trang 10• Từ lớp khác có thể truy cập các field theo
cú pháp:
– Lấy giá trị field: variable.field
– Cập nhật giá trị field: variable.field = value;
• Ví dụ:
Point p1 = new Point();
Point p2 = new Point();
System.out.println ("the x-coord is " + p1.x);
PointMain.java (client program)
public class PointMain {
int y;
}
Trang 11Truy cập dữ liệu đối tượng Point
public class PointMain {
public static void main(String[] args) {
// create two Point objects
Point p1 = new Point();
Trang 136 Phương thức khởi tạo (constructor)
• Là phương thức được gọi tự động khi một
đối tượng được tạo
• Phương thức khởi tạo được dùng để:
– Gán giá trị ban đầu cho các thuộc tính
– Thực hiện một số thao tác xử lý ban đầu
Trang 14Các loại phương thức khởi tạo
• Phương thức khởi tạo mặc định (default
constructor)
public ClassName ()
• Phương thức khởi tạo có tham số:
• Phương thức khởi tạo sao chép:
public ClassName (ClassName object)
Phương thức khởi tạo mặc định
• Là phương thức khởi tạo không có tham
số
• Mỗi lớp có duy nhất một default
constructor
Trang 15Phương thức khởi tạo có tham số
• Được sử dụng để tạo ra một đối tượng
mới với giá trị các thuộc tính được truyền
Trang 16Phương thức khởi tạo sao chép
• Là phương thức được sử dụng để tạo một
đối tượng mới từ một đối tượng đã tồn tại
• Phương thức này có một tham số là một
Trang 177 Thành viên static
• Là các biến, phương thức được khai báo sau
từ khóa static
• Các thành viên này có thể được truy cập mà
không cần thông qua một đối tượng
• Các phương thức static chỉ truy cập được
các thành viên static trong lớp
• Cú pháp khai báo:
Trang 188 Đóng gói (Encapsulation)
• Encapsulation: che dấu chi tiết cài đặt bên
trong bảo vệ tính toàn vẹn dữ liệu của
đối tượng
Thuộc tính private
• Để che dấu một thuộc tính không cho truy
cập từ bên ngoài lớp, ta cần khai báo biến
sau từ khóa private theo cú pháp:
private type name;
private <type> <name> = <value>;
• Ví dụ:
private int id;
private String name;
Trang 19Truy cập thuộc tính private
• Cần cung cấp phương thức cho phép truy cập
đến các thuộc tính private.
• Ví dụ:
– Chỉ cho phép lấy giá trị của x
public int getX() {
return x;
}
– Cho phép thay đổi giá trị của x
public void setX (int newX) {
Lợi ích của sự đóng gói
• Trừu tượng hóa giữa đối tượng và người
Trang 20Tránh xung đột tên biến
• Tránh xung đột khi tham số của phương thức
trùng với biến thành viên:
public class Point {
Trang 21Gọi phương thức khởi tạo khác
public class Point {
Trang 22– Lớp cha (lớp cơ sở): superclass (base class)
– Lớp con (lớp dẫn xuất): subclass (drived class)
• Xây dựng thêm các thuộc tính và các
phương thức riêng của lớp đó
• Lớp dẫn xuất có hầu hết các thành phần
giống như lớp cơ sở (các phương thức và
biến thành viên của lớp cơ sở), ngoại trừ:
– Các thành phần private
– Phương thức khởi tạo
– Phương thức tĩnh
Trang 23Lợi ích của kế thừa
• Phản ánh mối quan hệ giữa các lớp
Biết ăn Biết ngủ
Biết sủa Biết chạy
Biết hót Biết bay
Trang 24• Xây dựng lớp Động vật chứa các trường
và phương thức mô tả đặc điểm và hành
động giống nhau giữa Chó và Chim
• Xây dựng hai lớp Chó và Chim kế thừa từ
lớp Động vật
• Bổ sung vào mỗi lớp các trường và
phương thức mô tả đặc điểm riêng của
Trang 25Khai báo lớp kế thừa
• Một lớp chỉ có thể kế thừa từ một lớp khác
• Khai báo: sử dụng từ khóa extends
• Để gọi phương thức khởi tạo từ lớp cha,
public class Hinhtron {
protected int bankinh;
public Hinhtron ( int bankinh ) {
this bankinh = bankinh;
}
public int layBankinh () {
return bankinh;
}
public double tinhDientich() {
return Math PI * bankinh * bankinh;
}
public double tinhChuvi() {
return 2 * Math PI * bankinh;
}
Trang 26public class Hinhcau extends Hinhtron {
public Hinhcau( int bankinh ) {
super (bankinh); // Goi phương thức khởi tạo cua lop cha
}
public double tinhDientich() {
return 4* Math PI*bankinh*bankinh;
}
public double tinhThetich() {
return (4.0/3) * Math PI * bankinh * bankinh * bankinh;
public class KethuaVd {
public static void main( String [] args) {
Hinhtron ht = new Hinhtron (10);
Hinhcau hc = new Hinhcau (2);
System out.println( “Ban kinh hinh tron: " + ht.layBankinh ());
System out.println( “Ban kinh hinh cau: " + hc.layBankinh ());
System out.println( “Dien tich hinh tron: " + ht.tinhDientich ());
System out.println( “Dien tich hinh cau: " + hc.tinhDientich ());
System out.println( “The tich hinh cau: " + hc.tinhThetich ());
}
Trang 2711 Đa hình (Polymorphism)
• Thể hiện: cùng một phương thức nhưng
có nội dung thực hiện khác nhau trên các
đối tượng khác nhau
• Phương thức gọi được xác định thông
qua đối tượng được tham chiếu, không
thông qua kiểu khai báo của tham chiếu
• Trong Java, các phương thức luôn mang
public void method () {
System out.println ( “method of A” );
}
}
class B extends A {
public void method () {
System out.println( “method of B” );
}
}
class C extends A {
public void method () {
System out.println( “method of C” );
Trang 2812 Lớp trừu tượng (abstract class)
• Là lớp chỉ được sử dụng làm lớp cha cho
các lớp khác, không có các thể hiện
(instance)
• Lớp trừu tượng có thể định nghĩa các thuộc
tính chung cho các lớp con của nó
• Ví dụ
– Lớp Dagiac có các phương thức tinhDientich,
tinhChuvi
– Lớp HinhTamgiac, HinhChunhat kế thừa từ
lớp trừu tượng Dagiac.
• Khai báo lớp trừu tượng:
public abstract class ClassName {…}
12 Lớp trừu tượng (abstract class)
• Lớp trừu tượng thường có ít nhất một
phương thức trừu tượng (phương thức
không được định nghĩa)
– public abstract void tinhDientich();
– public abstract void tinhChuvi();
• Các lớp con của một lớp cha trừu tượng phải
định nghĩa tất cả các phương thức trừu
tượng
• Không thể tạo các đối tượng của một lớp
trừu tượng nhưng có thể khai báo biến thuộc
kiểu lớp trừu tượng để tham chiếu đến các
đối tượng thuộc lớp con của nó
Trang 29static final double PI = 3.14159;
13 Packages & Interfaces
• Những thành phần cơ bản của một chương
trình Java:
– Gói (Packages)
– Giao diện (Interfaces)
• Một chương trình Java có thể có các phần:
– Lệnh khai báo gói (package )
– Lệnh chỉ định gói được dùng (import)
– Khai báo lớp public (một file java chỉ chứa một
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
Trang 30Interfaces
• Chương trình Java chỉ có thể kế thừa từ một lớp
duy nhất trong cùng một thời điểm, nhưng có thể
thực thi (implements) cùng lúc nhiều Interfaces
• interface cần phải được hiện thực (implements).
• Khai báo:
interface InterfaceName { }
• Một Interface thường chỉ chứa các hằng static và
các phương thức public chưa cài đặt.
• Một Interface có thể kế thừa từ một Interface
– Các phương thức phải được định nghĩa trong
lớp dẫn xuất giao diện đó.
Trang 31Interfaces (tt)
• Sử dụng interfacse
– Một lớp có thể dẫn xuất từ nhiều interface
– 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.
public void answer ();
public boolean forward (int extension);
public void takeMessage (String message, String
recipient);
}
Trang 32public void answer() { }
public boolean forward (int extension) { }
public void takeMessage (String message, String
recipient) { }
}
Packages (gói)
• Tương tự như thư mục lưu trữ những lớp,
interface và các gói con khác thành
viên của gói
• Ưu điểm của Package:
– Cho phép tổ chức các lớp vào những đơn vị
nhỏ hơn
– 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
Trang 33Packages (tt)
• 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à “import”, kế đến là phần định nghĩa lớp
• Các bước tạo gói (Package)
– Khai báo gói
– Import những gói chuẩ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.
Trang 34Packages (tt)
• Gói do người dùng định nghĩa
– Mã nguồn của những chương trình này phải
ở cùng thư mục của gói
– Để 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
• Import những lớp đối tượng cần dùng
• Import toàn bộ gói
– Tạo tham chiếu đến những thành viên của