Viết class
Tạo các đối tượng và các biến tham chiếu đối tượng
Constructors
Các bổ từ (public, private vàstatic)
Phương thức, biến Class và Instance
Phạm vi hoạt động của biến
Sử dụng từ khóa this
Tính đóng gói
Phương thức nạp chồng
14 trang |
Chia sẻ: haohao89 | Lượt xem: 2272 | Lượt tải: 1
Bạn đang xem nội dung tài liệu Bài giảng Đối tượng và lớp, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
1ĐỐI TƯỢNG VÀ LỚP
(Object & Class)
2
Ôn tập
ADT : Khaí quát hóa một tập đối tượng thành một kiểu dữ liệu.
ADT có thể là một cấu trúc hoặc một class.
Object = các thuộc tính mô tả (thành phần dữ liệu)+ các hành vi (thành
phần hàm)
class: ADT cho một tập các đối tượng tương tự nhau (cùng data, cùng
functions).
Instance: Một mô tả của đối tượng trong bộ nhớ của chương trình.
Ba khái niệm cơ bản trong OOP: Đóng gói, Thừa kế, đa hình.
Đóng gói (encapsulation) : Gói dữ liệu + hành vi (code), bên ngoài chỉ
có thể truy cập một số thuộc tính hoặc hành vi của đối tượng của một
lớp thông qua các phương thức giao tiếp.
Thừa kế: Một lớp có thể thừa hưởng dữ liệu và hành vi của lớp cha. Một
ngôn ngữ OOP có thể hỗ trợ đơn thừa kế hoặc đa thừa kế.
Đa hình: Khả năng cho phép viết lại code của một hành vi được thừa kế
để tạo ra những khác biệt trong ứng xử giữa lớp cha và lớp con cho
cùng một hành vi.
Gửi thông điệp là yêu cầu một đối tượng thực thi một hành vi mà đối
tượng này có.
3
Nội dung
Viết class
Tạo các đối tượng và các biến tham chiếu đối tượng
Constructors
Các bổ từ (public, private và static)
Phương thức, biến Class và Instance
Phạm vi hoạt động của biến
Sử dụng từ khóa this
Tính đóng gói
Phương thức nạp chồng
4
Đối tượng (Objects)
Đối tượng đại diện cho một thực thể trong thế giới thật.
vd: 1 ô tô, 1 con người, 1 hình tròn, 1 khoản tiền
Trong LTHDT, đối tượng là một thực thể hoạt động khi chương
trình đang chạy.
Mỗi đối tượng trong hệ thống đều được xác định bằng 3 yếu tố
duy nhất: định danh của đối tượng (identity), trạng thái (state), và
các hành vi (behavior):
State = tập các data field (properties)
Behavior = tập các method
State xác định đối tượng, behavior xác định đối tượng làm cái gì.
5
Lớp đối tượng( Object Class)
Lớp là một khái niệm trừu tượng, dùng để chỉ một tập hợp các đối
tượng có trong hệ thống.
vd: Nhân Viên, Con Người, Xe Hơi ….
Lớp được dùng để biểu diễn đối tượng cho nên Lớp cũng có thuộc
tính và phương thức :
Thuộc tính của lớp tượng ứng với thuộc tính của các đối tượng
Phương thức của lớp tượng ứng với các hành động của đối
tượng
Một lớp có thể có hoặc không có thuộc tính, phương thức. Nếu
không có thuộc tính và phương thức thì lớp trở thành lớp trừu
tượng -> Lớp này không có đối tượng tương ứng.
6
Lớp và Đối tượng( Class – Object)
Lớp và đối tượng có mối liên quan đến nhau, nhưng bản chất lại khác
nhau:
Lớp là một khái niệm tồn tại khi phát triển hệ thống, mang tính
khái niệm, trừu tượng.
Đối tượng là một thể hiện của lớp. Là một thực thể cụ thể tồn tại
khi hệ thống đang hoạt động.
Tất cả các đối tượng thuộc về cùng 1 lớp sẽ có cùng các thuộc tính
và các phương thức.
7Lập trình hướng đối tượng
Xác định những objects trong bài toán.
Nhân Viên, Công Ty
Sau khi các object được xác định, viết lớp miêu tả các attributes và
behaviors của mỗi đối tượng.
Giả sử công ty muốn viết một chương trình trả lương hàng tuần
cho nhân viên của một công ty. Tính lương nhân viên được dựa
trên số giờ làm việc. Chương trình phải tính phí bảo hiểm xã hội,
bảo hiểm y tế cũng như thuế thu nhập.
8
Lập trình hướng đối tượng
Xác định những objects trong bài toán.
Nhân Viên, Công Ty
Sau khi các object được xác định, viết lớp miêu tả các attributes và
behaviors của mỗi đối tượng.
Những attributes của đối tượng Nhân Viên sẽ là những thuộc tính mà
nhân viên “có”, như tên, địa chỉ, mã nhân viên, số sổ bảo hiểm, số
giờ làm việc ... biến (variables)
Những behaviors của đối tượng Nhân Viên là những cái gì mà đối
tượng nhân viên “làm”, như tính lương của nhân viên, gởi mail nhắc
nhân viên kiểm tra lương 1 lần 1 tuần,… phương thức (methods)
9
Các bài toán ví dụ
Viết chương trình tính diện tích, chu vi hình chữ nhật
Viết chương trình tính diện tích, chu vi hình tròn
Viết chương trình tính điểm trung bình của sinh viên, điểm trung
bình= (điểm lý thuyết + điểm thực hành)/2. Chương trình cho
phép nhập thông tin sv, tính điểm trung bình, in điểm sv
10
Các bài toán ví dụ
Viết chương trình tính diện tích, chu vi hình chữ nhật
Viết chương trình tính diện tích, chu vi hình tròn.
Viết chương trình tính điểm trung bình của sinh viên, điểm trung
bình= (điểm lý thuyết + điểm thực hành)/2. Chương trình cho phép
nhập thông tin sv, tính điểm trung bình, xuất thông tin sv.
Object: Hình chữ nhật Class
Attributes: Chiều dài, chiều rộng Variables
Behaviors: Tính diện tích, tính ch vi Methods
11
Các bài toán ví dụ
Viết chương trình tính diện tích, chu vi hình chữ nhật
Viết chương trình tính diện tích, chu vi hình tròn
Viết chương trình tính điểm trung bình của sinh viên, điểm trung
bình= (điểm lý thuyết + điểm thực hành)/2. Chương trình cho phép
nhập thông tin sv, tính điểm trung bình, xuất thông tin sv
Object: Hình tròn Class
Attributes: Bá kính Variables
Behaviors: Tính diện tích, tính chu vi Methods
12
Các bài toán ví dụ
Viết chương trình tính diện tích, chu vi hình chữ nhật
Viết chương trình tính diện tích, chu vi hình tròn
Viết chương trình tính điểm trung bình của sinh viên, điểm trung
bình= (điểm lý thuyết + điểm thực hành)/2. Chương trình cho phép
nhập thông tin sv, tính điểm trung bình, in điểm
Object: Sinh viên Class
Attributes: Mã sv, họ tên, ngày sinh, nơi sinh, lớp, môn học, điểm lý thuyết,
điểm thực hành, điểm trung bình Variables
Behaviors: Nhập thông tin sinh viên, tính điểm trung bình, in điểm
Methods
13
Mô hình hóa đối tượng
ClassName
- Attributes
+ Behaviors
Properties
Data
Fields
Variables
Instance Data
Methods
14
Mô hình hóa đối tượng
Object: Hình chữ nhật Class
Attributes: Chiều dài, chiều rộng Variables
Behaviors: Tính diện tích, tính chu vi Methods
Hình chữ nhật
- Chiều dài
- Chiều rộng
+ Tính diện tích
+ Tính chu vi
15
Mô hình hóa đối tượng
Hình tròn
- Bán kính
+ Tính diện tích
+ Tính chu vi
Object: Hình tròn Class
Attributes: Bán kính Variables
Behaviors: Tính diện tích, tính chu vi Methods
16
Mô hình hóa đối tượng
Object: Sinh viên Class
Attributes: Mã sv, họ tên, ngày sinh, nơi sinh, lớp, môn học, điểm lý
thuyết, điểm thực hành, điểm trung bình Variables
Behaviors: Nhập thông tin sinh viên, tính điểm trung bình, in điểm
Methods
Sinh viên
- Mã sv
- Họ tên
- Ngày sinh
- Nơi sinh
- Lớp
- Môn học
- Điểm lý thuyết
- Điểm thực hành
- Điểm trung bình
+ Nhập thông tin sinh viên
+ Tính điểm trung bình
+ In điểm
17
Cấu trúc 1 lớp và access modifiers
Lớp: Thực hiện chung cho một tập các đối tượng có cùng đặc
điểm và hành vi.
Một lớp có thể là lớp con của một lớp đã có.
Thực hiện lớp:
Khai báo mức cho phép sử dụng.
Khai báo lớp cha
Khai báo các thành phần thuộc tính.
Hiện thực code các hành vi.
Lớp và mỗi thành phần cần phải chỉ định mức độ cho phép
truy cập (tính bảo mật) access modifier
Mỗi ngôn ngữ OOP quy định cú pháp riêng cho việc thực hiện
lớp.
18
Cấu trúc một lớp
Field_1
Field_2
.......
Method_1()
Method_2()
..........
class BCác giới hạn truy cập
1. Cho phép truy cập tự do (public)
2. Chỉ cho phép trong cùng một gói
truy cập
3. Không cho bên ngoài truy cập
(private).
4. Chỉ cho lớp con truy cập
(protected).
5. Không cho phép lớp con hiệu
chỉnh (final).
Access Modifiers
class A
là con
19
Cú pháp khai báo class trong Java
[Access Modifier] class CLASSNAME extends FATHERCLASSNAME
{
[Access Modifier] DataType1 Property1 [=Value];
[Access Modifier] DataType2 Property2 [=Value];
[Access Modifier] CLASSNAME( DataType Arg,…)
{
}
[Access Modifier] DataType MethodName( DataType Arg,…)
{
}
}
Không có modifier : Mặc định là friendly, cho phép các đối tượng
thuộc các class cùng package ( cùng thư mục)truy cập
Cú pháp khai báo 1 phương thức
Modifier
static
abstract
final…..
20
Access_modifier Modifier Datatype Method_name (Parameter_list)
{
//body of method
}
21
Access_modifier (Bổ từ truy xuất)
public: Cho phép các đối tượng khác truy xuất tự do.
private: Không cho phép các lớp bên ngoài truy xuất, đây là
một bổ từ truy xuất giới hạn nhất.
protected: Cho phép các lớp con hoặc các lớp cùng
package truy xuất.
Default access(package access): Cho phép các lớp trong
cùng package truy xuất.
22
Đặc tính truy xuất
Modifier private friendly protected public
Cùng class YES YES YES YES
Cùng gói, khác
class
NO YES YES YES
lớp con trong cùng
gói với lớp cha
NO YES YES YES
Khác gói, khác lớp NO NO NO YES
Lớp con khác gói
với lớp cha
NO NO YES YES
23
Viết lớp HinhChuNhat
class HinhChuNhat
{
double cdai, crong;
public double DienTich()
{
return cdai * crong;
}
public double ChuVi()
{
return (cdai + crong)*2;
}
}
Hình chữ nhật
- Chiều dài
- Chiều rộng
+ Tính diện tích
+ Tính chu vi
24
Viết lớp HinhTron
class HinhTron
{
double bkinh;
public double DienTich()
{
return Math.PI * bkinh * bkinh;
}
public double ChuVi()
{
return 2 * Math.PI * bkinh;
}
}
HinhTron
- bkinh : double
+ DienTich() : double
+ ChuVi() : double
25
Viết lớp SinhVien
class SinhVien
{
String MaSV, HoTen, NoiSinh;
Date NgaySinh;
String Lop, MonHoc;
double diemlt, diemth;
public double DiemTB()
{
return (diemlt+diemth)/2;
}
public void InDiem () {
System.out.println(MaSV+ “\t”+ HoTen+
”\t”+ NgaySinh+ ”\t”+ NoiSinh+ ”\t”+ Lop+ ”\t”+
MonHoc+ ”\t”+ DiemTB());
}
}
SinhVien
- MaSV : String
- HoTen : String
- NgaySinh : Date
- NoiSinh : String
- Lop : String
- MonHoc : String
- DiemLT : double
- DiemTH : double
+ DiemTB() : double
+ InDiem() : void
26
Constructor
Constructor là một dạng phương thức đặc biệt, được gọi để xây dựng đối tượng.
Constructor thỏa 2 đặc tính sau:
Constructor phải cùng tên với tên class của nó
Constructor không có kiểu dữ liệu trả về, kể cả kiểu void
Một class có thể có nhiều constructor
Một constructor không có tham số được gọi là default constructor.
Nếu một lớp không có constructor nào được viết, thì trình biên dịch sẽ phát sinh
một constructor trong lớp đó. Default constructor này là public, không có tham số,
và không làm bất kỳ gì.
Các Constructor được gọi sử dụng toán tử new khi tạo một đối tượng. Nó đóng vai
trò khởi tạo đối tượng.
Nếu là constructor tự tạo thì việc khởi tạo giá trị ban đầu được ấn định bởi code
trong constructor.
Nếu một lớp có constructor thì constructor mặc định của ngôn ngữ không được sử
dụng nữa.
public ClassName (parameterList)
{
}
27
Constructor – Ví dụ
public class Mushroom
{
public Mushroom(int size) { }
public Mushroom() { }
public Mushroom(boolean isMagic) { }
public Mushroom(boolean isMagic, int size) { }
public Mushroom(int size, boolean isMagic) { }
}
28
Ví dụ: lớp có nhiều constructor
Viết lại default constructor
constructor tự tạo
Copy constructor
29
Viết lớp HinhChuNhat
class HinhChuNhat
{
double cdai, crong;
public HinhChuNhat (double cd, double cr)
{
cdai = cd;
crong = cr;
}
public double DienTich()
{
return cdai * crong;
}
public double ChuVi()
{
return (cdai + crong)*2;
}
} 30
Viết lớp HinhTron
class HinhTron
{
double bkinh;
public HinhTron (double bk)
{
bkinh = bk;
}
public HinhTron ()
{
bkinh = 0.0;
}
public double DienTich()
{
return Math.PI * bkinh * bkinh;
}
public double ChuVi()
{
return 2 * Math.PI * bkinh;
}
}
31
Viết lớp SinhVien
public double DiemTB()
{
return (diemlt+diemth)/2;
}
public void InDiem ()
{
System.out.println(MaSV+ “\t”+
HoTen+ ”\t”+ NgaySinh+ ”\t”+ NoiSinh+
”\t”+ Lop+ ”\t”+ MonHoc+ ”\t”+ DiemTB);
}
}
class SinhVien
{
String MaSV, HoTen, NoiSinh
Date NgaySinh;
String Lop, MonHoc;
double diemlt, diemth, diemtb;
public SinhVien (String ma, String
ht, Date ngs, String ns, String l, String
mh, double lt, double th )
{
MaSV = ma; HoTen = ht;
NoiSinh = ns; NgaySinh = ngs;
Lop = l; MonHoc = mh;
diemlt = lt;
diemth = th;
}
32
Gợi ý khi xây dựng constructor
Việc thường làm là gán giá trị cho các thành phần dữ liệu của
đối tượng.
Số constructor có trong một lớp thường là những dạng dữ liệu
của đối tượng mà ta muốn có ngay lúc ban đầu.
33
Sử dụng một lớp
Định nghĩa biến đối tượng.
Biến đối tượng trong Java là tham chiếu (địa chỉ) của vùng
nhớ chứa dữ liệu của đối tượng.
obj 1000
data
1000
ClassName obj ; obj= new ClassName();
34
Sử dụng Constructor
Một constructor được sử dụng để tạo mới 1 đối tượng, bằng cách sử
dụng từ khóa new
Nếu một class có nhiều constructor, chúng ta xác định constructor
nào được gọi với các đối số sử dụng cùng với toán tử new.
Ví dụ:
HinhChuNhat n;
n = new HinhChuNhat(3,6);
HinhChuNhat x = new HinhChuNhat(5,8);
HinhTron t1 = new HinhTron();
HinhTron t2 = new HinhTron(5.0);
35
Sử dụng Constructor của lớp HinhTron
class HinhTron
{
double bkinh;
public HinhTron (double bk)
{
bkinh = bk;
}
public HinhTron ()
{
bkinh = 0.0;
}
public double DienTich()
{
return Math.PI * bkinh * bkinh;
}
public double ChuVi()
{
return 2 * Math.PI * bkinh;
}
}
Example:
HinhTron t1 = new HinhTron(8.9);
HinhTron t2 = new HinhTron();
36
Sử dụng Constructor mặc định
class HinhChuNhat
{
double cdai, crong;
public HinhChuNhat (double cd, double cr)
{
cdai = cd;
crong = cr;
}
public double DienTich()
{
return cdai * crong;
}
public double ChuVi()
{
return (cdai + crong)*2;
}
}
Example:
HinhChuNhat n1= new HinhChuNhat(8,10);
HinhChuNhat n2= new HinhChuNhat();
37
Sử dụng Constructor mặc định
class HinhChuNhat
{
double cdai, crong;
public HinhChuNhat (double cd, double cr)
{
cdai = cd;
crong = cr;
}
public double DienTich()
{
return cdai * crong;
}
public double ChuVi()
{
return (cdai + crong)*2;
}
}
Example:
HinhChuNhat n1= new HinhChuNhat(8,10);
HinhChuNhat n2= new HinhChuNhat(); X
38
Sử dụng Constructor mặc định
class HinhChuNhat
{
double cdai, crong;
public HinhChuNhat()
{
cdai = 0;
crong = 0;
}
public HinhChuNhat (double cd, double cr)
{
cdai = cd;
crong = cr;
}
public double DienTich()
{
return cdai * crong;
}
public double ChuVi()
{
return (cdai + crong)*2;
}
}
Example:
HinhChuNhat n1= new HinhChuNhat(8,10);
HinhChuNhat n2= new HinhChuNhat();
39
Chỉ thị this
Khi hiện thực hành vi của 1 lớp. Truy xuất một thành phần bằng
chính tên của thành phần này hoặc this.tênThànhPhần.
Khi tham số trùng với tên thuộc tính thì nhờ từ khóa this chúng ta
phân biệt rõ thuộc tính với tham số.
Các môi trường lập trình Java hiện nay hầu hết đều có trợ giúp ngữ
cảnh. Do vậy, qua từ khóa this, người lập trình dễ truy cập 1 thành
phần của lớp.
40
Ví dụ
41
Ví dụ: gọi hành vi trong constructor
42
Ví dụ: truy xuất thành phần
Truy xuất thành phần
qua từ khóa this
Truy xuất thành phần
không qua từ khóa this
43
this trong constructor
Để tránh code bị lặp lại, một constructor có thể sử dụng từ khóa this
để gọi một constructor khác trong cùng lớp.
Nếu một constructor sử dụng từ khóa this để gọi một constructor
khác trong lớp thì câu lệnh this phải xuất hiện ở dòng đầu tiên
trong constructor, ngược lại trình biên dịch sẽ báo lỗi.
44
Ví dụ: this trong constructor
class HinhChuNhat
{
double cdai, crong;
public HinhChuNhat()
{
this(0,0);
}
public HinhChuNhat (double cd, double cr)
{
cdai = cd;
crong = cr;
}
public double DienTich()
{
return cdai * crong;
}
public double ChuVi()
{
return (cdai + crong)*2;
}
}
45
Hành vi hủy (Destructor)
Là quá trình xóa một đối tượng
Một Destructor:
Giải phóng bộ nhớ được cấp phát
Không cho phép truy xuất các thuộc tính và phương thức
46
Hành vi hủy (destructor)
Đối tượng sống kể từ khi ta khởi tạo đối tượng (bằng toán tử new)
cho đến hết khối chứa nó.
Khi ra khỏi khối chứa đối tượng, ta nói đối tượng đã chết.
{ .....
.......
ClassName obj = new ClassName();
......
.....
.....
}
Góc nhìn thời gian:
Thời gian sống của
đối tượng
Góc nhìn nội dung
văn bản chương trình:
Tầm vực (scope)
của đối tượng
Một số ngôn ngữ OOP ( C++, C#) cho phép ta viết code sẽ được thực
thi vào lúc đối tượng chết nhằm trả tài nguyên đã cấp phát động.
Java chỉ dùng cách cấp phát đối tượng động, có trình gom rác riêng
và không hỗ trợ hành vi hủy.
47
Tạo một Object
Trong Java, sử dụng từ khóa new để khởi tạo một đối tượng.
Ví dụ:
HinhChuNhat n1 = new HinhChuNhat();
HinhChuNhat n2 = new HinhChuNhat(8,10);
HinhTron t;
t = new HinhTron(5.5);
Tham chiếu đối tượng sẽ được gán cho n1, n2, t
ClassName object = new ClassName (…);
ClassName object;
object = new ClassName (…);
48
Truy xuất đối tượng
Tham chiếu dữ liệu của đối tượng:
objectReference.data
vd: n1.cdai hoặc t.crong
Gọi phương thức của đối tượng:
objectReference.method
vd: n1.DienTich()
49
Phương thức (method)
Cấu trúc của phương thức:
Một phương thức là một tập các câu lệnh được nhóm lại với nhau
nhằm thực hiện một công việc.
50
Phương thức (tiếp)
parameter profile gồm kiểu, thứ tự, và số tham số của một phương
thức.
method signature (header) gồm tên phương thức và parameter
profiles.
Các tham số khai báo trong method header được gọi là tham số
hình thức (formal parameters).
Khi phương thức được gọi, các tham số hình thức được thay thế
bởi các biến hoặc dữ liệu, được gọi là các tham số thực sự (actual
parameters).
51
Phương thức (tiếp)
Một phương thức có thể trả về một giá trị. Kiểu của giá trị đó là kiểu
dữ liệu của phương thức trả về.
Nếu phương thức không trả về một giá trị, kiểu trả về của phương
thức dùng từ khóa void.
Ví dụ, kiểu giá trị trả về trong phương thức main là void.
52
myMethod();
myMethodcompute
Gọi phương thức
Gọi phương thức ở trong cùng một class, thì chỉ cần dùng tên
phương thức.
53
doIt helpMe
helpMe();obj.doIt();
main
Gọi phương thức
Gọi phương thức ở trong một lớp khác (đối tượng khác). Gọi thông
qua đối tượng của nó.
54
Phạm vi các biến
Phạm vi của các biến static và instance là toàn bộ lớp. Chúng có
thể được khai báo bất kỳ nơi nào trong lớp.
Phạm vi của biến cục bộ bắt đầu từ khi khai báo đến hết block
chứa biến đó. Một biến cục bộ phải được khai báo trước khi sử
dụng.
Một biến được khai báo bên trong một phương thức được gọi là
biến cục bộ.
55
Biến cục bộ (Local Data)
Những biến cục bộ có thể được khai báo bên trong một phương thức.
Những tham số hình thức của một phương thức tự động tạo những
biến cục bộ khi phương thức được gọi
Khi phương thức kết thúc, tất cả những biến cục bộ bị hủy (bao gồm
cả những tham số hình thức)
Những biến thể hiện được khai báo tại mức class sẽ tồn tại với điều
kiện đối tượng (object) tồn tại.
56
Biến thể hiện (Instance Data)
Biến cdai, crong trong class HinhChuNhat được gọi là instance
data.
Biến instance thuộc một instance xác định, nó không được chia sẻ
giữa các đối tượng trong cùng 1 class.
Mỗi khi đối tượng HinhChuNhat được tạo, biến cdai, crong mới
cũng được tạo.
Một lớp khai báo kiểu dữ liệu cho biến nhưng nó không cấp phát
bất kỳ bộ nhớ nào cho nó.
Các đối tượng của 1 lớp chia sẻ các định nghĩa phương thức,
nhưng mỗi đối tượng có bộ nhớ riêng do đó hai đối tượng có thể
có những trạng thái khác nhau.
n1 5,7Cdai,crong
n2 8,10Cdai,crong
57
Ví dụ
class HinhChuNhat
{
double cdai, crong;
public HinhChuNhat()
{
this(0,0);
}
public HinhChuNhat (double cd, double cr)
{
cdai = cd;
crong = cr;
}
public double DienTich()
{
return cdai * crong;
}
public double ChuVi()
{
return (cdai + crong)*2;
}
}
…
public static void main(String[] agrs)
{
double dt1, dt2, cv1, cv2;
HinhChuNhat n1 = new HinhChuNhat();
dt1 = n1.DienTich();
cv1 = n1.ChuVi();
// xuat ket qua tinh n1…
HinhChuNhat n2 = new HinhChuNhat(8,10);
dt2 = n2.DienTich();
cv2 = n2.ChuVi();
// xuat ket qua tinh n2…
}
58
Encapsulation là một trong 4 khái niệm cơ bản về lập trình hướng
đối tượng. (inheritance, polymorphism, và abstraction)
Encapsulation là kỹ thuật làm cho cá