You are on page 1of 33

Đối tượng và lớp

Objects and Classes

Object-Oriented Programming

(Dựa trên bài giảng của TS. Trần Minh Châu)


Nội dung

 Lớp vs. đối tượng


 Thiết kế lớp
 Biến phương thức và biến thể hiện
 Đóng gói và che dấu thông tin (encapsulation &
information hiding)

 Readings:
 HFJ: Ch. 2, 3, 4.

 GT: Ch. 3, 4.

Đại học Công nghệ - ĐHQG HN Objects and Classes 2


Chương trình Java
public class TestGreeting {
public class Greeting { public static void main(String[] args) {
public void greet() { Greeting gr = new Greeting();
System.out.print("Hi there!"); gr.greet();
} }
} }

 Khi viết, chương trình Java là một tập các classes


 Mỗi lớp được mô tả trong một tệp: tăng tính độc lập, dễ sửa đổi
 Khi thực thi, chương trình Java là tập các đối tượng
 Chúng làm một số thứ (gọi các phương thức của chúng)

 Chúng yêu cầu các đối tượng khác làm một số thứ (gọi đến

phương thức của các đối tượng khác)


 Thư viện Java chứa các lớp được định nghĩa trước để chúng ta có
thể sử dụng trong chương trình của chúng ta.

Đại học Công nghệ - ĐHQG HN Objects and Classes 33


Lớp vs. đối tượng

 Lớp là khuôn mẫu (blueprint/template) được sử


dụng để tạo đối tượng.
 Mỗi đối tượng là một thể hiện của một lớp.

Đại học Công nghệ - ĐHQG HN Objects and Classes 4


Thiết kế lớp

 Khi thiết kế một lớp nên nghĩ đến các đối tượng mà sẽ
được tạo từ lớp đó
 Những thứ mà đối tượng biết (knows) về chính nó

 Những thứ mà đối tượng làm (does)

Đại học Công nghệ - ĐHQG HN Objects and Classes 5


Thiết kế lớp

 Thứ mà đối tượng biết về chính nó


 Biến thể hiện (instance variables)
Biến thể hiện của một đối tượng thể hiện trạng thái của đối
tượng đó
 Thứ mà đối tượng làm
 Phương thức (methods)
Phương thức của đối tượng thể hiện hành vi của đối tượng đó

Đại học Công nghệ - ĐHQG HN Objects and Classes 6


Định nghĩa lớp

Biến thể hiện


class Dog {
DOG
int size;
size
String breed; Phương thức
String name; breed
name
void bark() {
bark()
System.out.println("Ruff! Ruff!");
}
}

Đại học Công nghệ - ĐHQG HN Objects and Classes 7


Thử nghiệm lớp

Viết một lớp thử nghiệm (tester class – test drive) với
các câu lệnh để thử nghiệm lớp đã định nghĩa

Dấu chấm (.): public class DogTestDrive {


truy nhập biến public static void main(String [] args) {
thể hiện hoặc Dog d = new Dog();
Tạo một đối tượng Dog
phương thức d.name = "Bruno";
của đối tượng d.bark();
gán giá trị cho biến name
} của đối tượng Dog
}
Gọi phương thức
bark() của đối tượng
Chưa che dấu thông tin

Đại học Công nghệ - ĐHQG HN Objects and Classes 8


Tham chiếu đối tượng

3 bước:

1. Mô tả biến tham chiếu


Dog myDog = new Dog();
2. Tạo một đối tượng
Dog myDog = new Dog();
3. Liên kết đối tượng với tham chiếu
Dog myDog = new Dog();

Đại học Công nghệ - ĐHQG HN Objects and Classes 9


Tham chiếu đối tượng
Dog myDog = new Dog();

Ghi nhớ: Tham chiếu không phải đối tượng!

 Đối tượng được thao tác thông qua tham chiếu


Tham chiếu đóng vai trò gần giống như một con trỏ
 Đối tượng phải được tạo ra một cách tường minh bằng toán tử new

Đại học Công nghệ - ĐHQG HN 10


Objects and Classes
Truyền thông điệp giữa các đối tượng

 Gửi một thông điệp tới một đối tượng thực tế là gọi
một phương thức của đối tượng.
d.bark()
 Cú pháp:

<tham chiếu đối tượng>.<tên phương thức>(<danh sách tham số>)

Đối tượng nhận nội dung thông điệp thông tin thêm
thông điệp

Đại học Công nghệ - ĐHQG HN Objects and Classes 11


Trạng thái và hành vi của đối tượng

 Đối tượng có
 Trạng thái (state) được thể hiện bởi biến thể hiện

 Hành vi (behavior) được thể hiển bởi phương thức

 Phương thức có thể sử dụng giá trị của các biến thể
hiện và thay đổi trạng thái của đối tượng

Đại học Công nghệ - ĐHQG HN Objects and Classes 12


Trạng thái ảnh hưởng hành vi và hành vi
ảnh hưởng trạng thái
class Dog { DOG
1. Write the class Trạng thái ảnh hưởng size
int size;
hành vi. breed
String breed;
String name; name
Dogs có kích cỡ khác
nhau cư xử theo cách bark()
void bark() { khác nhau. getBigger()
if (size > 14)
System.out.println("Ruff! Ruff!"); Các đối tượng của cùng kiểu
else có thể cư xử theo cách khác
System.out.println("Yip! Yip!"); nhau.
}
Hành vi làm thay
void getBigger() { đổi trạng thái
size += 5;
}
}
Đại học Công nghệ - ĐHQG HN Objects and Classes 13
Trạng thái ảnh hưởng hành vi và hành vi
ảnh hưởng trạng thái
class DogTestDrive {
1. Write the class
public static void main (String[] args) {

Dog one = new Dog();


one.size = 7;
Dog two = new Dog();
two.size = 13;

two.bark();
two.getBigger();
two.bark () ;

one.bark();
}
}

Đại học Công nghệ - ĐHQG HN Objects and Classes 14


Trạng thái ảnh hưởng hành vi và hành vi
ảnh hưởng trạng thái Dog object 1
class DogTestDrive { name:null
1. Write the class one
size:0
public static void main (String[] args) { breed:null

Dog one = new Dog();


one.size = 7;
Dog two = new Dog();
two.size = 13;

two.bark();
two.getBigger(); %> java DogTestDrive
two.bark () ;

one.bark();
}
}

Đại học Công nghệ - ĐHQG HN Objects and Classes 15


Trạng thái ảnh hưởng hành vi và hành vi
ảnh hưởng trạng thái Dog object 1
class DogTestDrive { name:null
1. Write the class one
size: 7
public static void main (String[] args) { breed:null

Dog one = new Dog();


one.size = 7;
Dog two = new Dog();
two.size = 13;

two.bark();
two.getBigger(); %> java DogTestDrive
two.bark () ;

one.bark();
}
}

Đại học Công nghệ - ĐHQG HN Objects and Classes 16


Trạng thái ảnh hưởng hành vi và hành vi
ảnh hưởng trạng thái Dog object 1
class DogTestDrive { name:null
1. Write the class one
size: 7
public static void main (String[] args) { breed:null

Dog one = new Dog();


Dog object 2
one.size = 7;
Dog two = new Dog(); two name:null
two.size = 13; size:13
breed:null
two.bark();
two.getBigger(); %> java DogTestDrive
two.bark () ;

one.bark();
}
}

Đại học Công nghệ - ĐHQG HN Objects and Classes 17


Trạng thái ảnh hưởng hành vi và hành vi
ảnh hưởng trạng thái Dog object 1
class DogTestDrive { name:null
1. Write the class one
size: 7
public static void main (String[] args) { breed:null

Dog one = new Dog();


Dog object 2
one.size = 7;
Dog two = new Dog(); two name:null
two.size = 13; size:13
breed:null
two.bark();
two.getBigger(); %> java DogTestDrive
two.bark () ;
Yip! Yip!
one.bark();
}
}

Đại học Công nghệ - ĐHQG HN Objects and Classes 18


Trạng thái ảnh hưởng hành vi và hành vi
ảnh hưởng trạng thái Dog object 1
class DogTestDrive { name:null
1. Write the class one
size: 7
public static void main (String[] args) { breed:null

Dog one = new Dog();


Dog object 2
one.size = 7;
Dog two = new Dog(); two name:null
two.size = 13; size:18
breed:null
two.bark();
two.getBigger(); %> java DogTestDrive
two.bark () ;
Yip! Yip!
one.bark();
}
}

Đại học Công nghệ - ĐHQG HN Objects and Classes 19


Trạng thái ảnh hưởng hành vi và hành vi
ảnh hưởng trạng thái Dog object 1
class DogTestDrive { name:null
1. Write the class one
size: 7
public static void main (String[] args) { breed:null

Dog one = new Dog();


Dog object 2
one.size = 7;
Dog two = new Dog(); two name:null
two.size = 13; size:18
breed:null
two.bark();
two.getBigger(); %> java DogTestDrive
two.bark () ;
Yip! Yip!
one.bark(); Ruff! Ruff!
}
}

Đại học Công nghệ - ĐHQG HN Objects and Classes 20


Trạng thái ảnh hưởng hành vi và hành vi
ảnh hưởng trạng thái Dog object 1
class DogTestDrive { name:null
1. Write the class one
size: 7
public static void main (String[] args) { breed:null

Dog one = new Dog();


Dog object 2
one.size = 7;
Dog two = new Dog(); two name:null
two.size = 13; size:18
breed:null
two.bark();
two.getBigger(); %> java DogTestDrive
two.bark () ;
Yip! Yip!
one.bark(); Ruff! Ruff!
}
} Yip! Yip!
%>

Đại học Công nghệ - ĐHQG HN Objects and Classes 21


Biến thể hiện vs. biến cục bộ
Instance variables vs. local variables
Biến thể hiện Biến cục bộ
 Của object  Của method

 Được mô tả trong class,  Được mô tả trong method


không trong method  PHẢI được khởi tạo trước
 Có giá trị mặc định (0, 0.0, khi sử dụng
false, null…)
class Dog { public class DogTestDrive {
int size; public static void main(String [] args)
String breed; Dog dog = new Dog();
... dog.name = "Bruno";
void getBigger() { dog.bark();
size += 5; }
} }
}

Đại học Công nghệ - ĐHQG HN Objects and Classes 22


Đóng gói / che dấu thông tin
class Dog {
int size;
 Có vấn đề gì ở đoạn mã? String breed;
 Size ? String name;
...
 Object's data is exposed. Dog d = }new Dog();
d.size = -1;

 Exposed instance variables can lead to invalid states of object

 Nên làm gì?


 Viết các phương thức set (setters) cho các biến thể hiện

 Che dấu các biến thể hiện để buộc mã của lập trình khách
phải dùng các phương thức set thay cho truy nhập vào
biến thể hiện theo cách trực tiếp.

Đại học Công nghệ - ĐHQG HN Objects and Classes 23


Che dấu thông tin
 Thiết lập mức truy nhập tới các biến thể hiện là private.
 Định nghĩa các phương thức getters and setters and
thiết lập mức truy nhập tới chúng là public.
 Trong setters: không quên kiểm tra tính đúng đắn của

dữ liệu. class Dog {


private int size;

public void setSize(int s) {


if (s > 0) size = s;
}

public int getSize() {


return size;
}
...
Đại học Công nghệ - ĐHQG HN Objects and Classes 24
Kiểm soát truy nhập đến lớp

 public : Accessible anywhere by anyone


 private : Only accessible within the current
class
 protected : Accessible only to the class itself
and to its subclasses or other classes in the same
“package”
 default (no keyword): accessible within the current
package

Đại học Công nghệ - ĐHQG HN Objects and Classes 25


Encapsulation / information hiding
“Don’t expose internal data structures!”
 Objects hold data and code
 Neither is exposed to

the end user or "client" modules.


 Complexity is hidden inside the object
 Make life easier for clients

 More modular approach

 Implementation changes in one component doesn’t affect others


 Less error-prone

Đại học Công nghệ - ĐHQG HN Objects and Classes 26


Phương thức khởi tạo
(constructor)
 Dữ liệu nên được khởi tạo trước khi sử dụng
 lỗi khởi tạo là một trong các lỗi phổ biến

 Phương thức khởi tạo


 là phương thức đặc biệt được gọi tự động ngay

sau khi đối tượng được tạo ra


 nhằm mục đích chính là khởi tạo cho các thuộc
tính của đối tượng

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


Phương thức khởi tạo

 Có tên trùng với tên lớp


 Không nhận giá trị trả lại
 Mỗi khi đối tượng được tạo ra bởi toán tử new, hệ
thống sẽ tự động gọi phương thức khởi tạo.
 nếu không khai báo, hệ thống sẽ gọi constructor

mặc định là một phương thức rỗng

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


Ví dụ: Constructor rỗng

Không khai báo constructor tường minh

class MyDate {
}

MyDate date = new MyDate();

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


Ví dụ: Constructor mặc định

Constructor không nhận tham số


class MyDate {
private int day, month, year;
public MyDate() {
day=1;
month=1;
year=2014;
System.out.println(”A new date created”);
}
}
...
MyDate msg = new MyDate();

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


Ví dụ: Nhiều constructor
class MyDate {
private int day, month, year;
public MyDate() {
day=1;month=1;year=2014;
System.out.println(”A new date created”);
}
public MyDate(int d,m,y) {
day=d;
month=m;
year=y;
}
}
...
MyDate d1 = new MyDate();
MyDate d2 = new MyDate(19,9,2014);

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


Phương thức trùng tên (overload)
 Có thể định nghĩa các phương thức trùng tên, tuy nhiên phải phân
biệt bởi danh sách tham số

class MyDate {

public boolean setMonth(int m) { …}
public boolean setMonth(String s) { …}
}

d.setMonth(9);
d.setMonth(”September”);

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


Tổng kết

 Lớp
 Đối tượng
 Trạng thái, hành vi
 Biến thể hiện vs biến phương thức
 Đóng gói và che dấu thông tin
 Phương thức khởi tạo

Đại học Công nghệ - ĐHQG HN Objects and Classes 33

You might also like