0978359287
-
0383180086
niithanoi.education@gmail.com
Trang chủ
Giới thiệu
KHÓA HỌC
LẬP TRÌNH WEB FRONT END
LẬP TRÌNH WEB BACK END
LẬP TRÌNH WEB FULL STACK
LẬP TRÌNH MOBILE
LẬP TRÌNH GAME
ĐÀO TẠO DOANH NGHIỆP
KHÓA HỌC KHÁC
Tutorials
JAVA in 7 DAY
PHP in 7 DAY
PYTHON BASIC
JAVASCRIPT
THUẬT TOÁN
Tin tức
NIIT - ICT HÀ NỘI
CÔNG NGHỆ
SỰ KIỆN NỔI BẬT ICT
THỦ THUẬT CÔNG NGHỆ
TUYỂN DỤNG
Cảm nhận
Thư viện
Liên hệ
Đăng ký học
Trang chủ
Tutorials
JAVA OOP
Vòng đời của đối tượng trong JAVA
Ngày đăng: 15/12/2020 -
Cập nhật: 15/12/2020
Cỡ chữ
Chia sẻ
Mục Lục
1. Tìm hiểu về một vòng đời của đối tượng
2. Cách hủy tham chiếu đến một đối tượng
Tổng kết
Là lập trình viên làm việc với đối tượng lâu năm không phải ai cũng dành ra ít chút thời gian để tìm hiểu sâu về
bản chất của một đối tượng
. Phần lớn khi
HỌC JAVA
chúng ta chỉ quan tâm cách code như thế nào để chương trình chạy không gặp bug là được – đây cũng là lý do khiến bạn rơi vào trạng thái
biết làm nhưng không biết tại sao
.
Trong phần này, ta sẽ nói về
vòng đời của đối tượng trong Java
: Đối tượng được tạo ra như thế nào, nó nằm ở đâu, làm thế nào để giữ hoặc vứt bỏ đối tượng một cách có hiệu quả.
Nào, chúng ta hãy cùng nhau tìm hiểu nhé.
1. Tìm hiểu về một vòng đời của đối tượng
Trước khi nói về chuyện gì xảy ra khi ta tạo một đối tượng, ta cần nói về hai vùng bộ nhớ
Stack
và
Heap
và cái gì được lưu trữ ở đâu.
Đối với Java,
Heap
và
Stack
là hai vùng bộ nhớ mà lập trình viên cần quan tâm, trong đó:
Heap
là nơi ở của các đối tượng
Còn
Stack
là chỗ của các phương thức và biến địa phương.
Máy ảo Java
toàn quyền quản lý hai vùng bộ nhớ này. Lập trình viên không thể và không cần can thiệp.
Đầu tiên, ta hãy phân biệt rõ ràng biến thực thể và biến địa phương, chúng là cái gì và sống ở đâu trong
Stack
và
Heap
.
Nắm vững kiến thức này, ta sẽ dễ dàng hiểu rõ những vấn đề như phạm vi của biến, việc tạo đối tượng, quản lý bộ nhớ, luồng, xử lý ngoại lệ... những điều căn bản mà một lập trình viên Java cần nắm được.
Biến thực thể
được khai báo bên trong một lớp chứ không phải bên trong một phương thức. Chúng đại diện cho các trường dữ liệu của mỗi đối tượng (ta có thể điền các dữ liệu khác nhau cho các thực thể khác nhau của lớp đó). Các biến thực thể “sống” bên trong đối tượng chủ của chúng.
public
class
ConBo
() {
double
canNang
;
}
Biến địa phương
, trong đó có các tham số, được khai báo bên trong một phương thức. Chúng là các biến tạm thời, chúng “sống” bên trong khung bộ nhớ của phương thức và chỉ tồn tại khi phương thức còn nằm trong bộ nhớ Stack, nghĩa là khi phương thức đang chạy và chưa chạy đến ngoặc kết thúc (
}
).
public
void
ahihi
(
int
x
) {
int
y
=
x
++;
}
Vậy còn các biến địa phương là các đối tượng?
Nhớ lại rằng trong Java một biến thuộc kiểu không cơ bản thực ra là một tham chiếu tới một đối tượng chứ không phải chính đối tượng đó.
Do đó, biến địa phương đó vẫn nằm trong Stack, còn đối tượng mà nó chiếu tới vẫn nằm trong Heap. Bất kể tham chiếu được khai báo ở đâu, là biến địa phương của một phương thức hay là biến thực thể của một lớp, đối tượng mà nó chiếu tới bao giờ cũng nằm trong heap.
public
void
ahihi
(
int
x
) {
int
y
=
x
++;
ConBo
conBo
=
new
ConBo
();
}
Vậy biến thực thể nằm ở đâu?
Các biến thực thể đi kèm theo từng đối tượng, chúng sống bên trong vùng bộ nhớ của đối tượng chủ tại heap. Mỗi khi ta gọi
new ConBo()
, Java cấp phát bộ nhớ cho đối tượng
ConBo
đó tại heap, lượng bộ nhớ được cấp phát đủ chỗ để lưu giá trị của tất cả các biến thực thể của đối tượng đó.
Nếu biến thực thể thuộc kiểu cơ bản, vùng bộ nhớ được cấp phát cho nó có kích thước tùy theo kích thước của kiểu dữ liệu nó được khai báo. Ví dụ một biến int cần 32 bit.
Còn nếu biến thực thể là đối tượng thì sao?
Chẳng hạn,
TestConBo HAS-A ConBo
(TestConBo có một ConBo), nghĩa là mỗi đối tượng TestConBo có một biến thực thể là tham chiếu kiểu ConBo.
Java cấp phát bộ nhớ bên trong đối tượng
TestConBo
đủ để lưu biến tham chiếu
conBo
. Còn bản thân biến này sẽ chiếu tới một đối tượng
ConBo
nằm bên ngoài, chứ không phải bên trong, đối tượng
TestConBo
.
ConBo
conBo
=
new
ConBo
();
TestConBo
test
=
new
TestConBo
();
Vậy khi nào đối tượng
ConBo
được cấp phát bộ nhớ trong heap?
Khi nào lệnh
new ConBo()
cho nó được chạy - đối tượng
ConBo
được tạo mới để khởi tạo giá trị cho biến thực thể
conBo
, lệnh khởi tạo nằm ngay trong khai báo lớp
TestConBo
.
Cuộc đời của một đối tượng hoàn toàn phụ thuộc vào sự tồn tại của các tham chiếu chiếu tới nó. Nếu vẫn còn một tham chiếu, thì đối tượng vẫn còn sống trong Heap. Nếu không còn một tham chiếu nào chiếu tới nó, đối tượng sẽ chết, hoặc ít ra cũng coi như chết.
Tại sao khi không còn một biến tham chiếu nào chiếu tới thì đối tượng sẽ chết?
Câu trả lời rất đơn giản: Không có tham chiếu, ta không thể với tới đối tượng đó, không thể lấy dữ liệu của nó, không thể yêu cầu nó làm gì. Nói cách khác, nó trở thành một khối bit vô dụng, sự tồn tại của nó không còn có ý nghĩa gì nữa. Garbage collector sẽ phát hiện ra những đối tượng ở tình trạng này và thu dọn vùng bộ nhớ của chúng để tái sử dụng.
Như vậy, để có thể xác định độ dài cuộc đời hữu dụng của đối tượng, ta cần biết được độ dài cuộc đời của các biến tham chiếu. Cái này còn tùy biến đó là biến địa phương hay biến thực thể.
Một biến địa phương chỉ tồn tại bên trong phương thức nơi nó được khai báo, và chỉ sống từ khi phương thức đó được chạy cho đến khi phương thức đó kết thúc.
Một biến thực thể thuộc về một đối tượng và sống cùng với đối tượng đó. Nếu đối tượng vẫn còn sống thì biến thực thể của nó cũng vậy.
Có ba cách hủy tham chiếu tới một đối tượng:
Cách #1: Tham chiếu vĩnh viễn ra ngoài phạm vi tồn tại.
public
void
ahihi
() {
ConBo
conBo
=
new
ConBo
();
}
Trong trường hợp này, biến
conBo
sẽ bị huỷ khi
ahihi
kết thúc.
Tham chiếu được chiếu tới một đối tượng khác
public
void
ahihi
() {
ConBo
conBo
=
new
ConBo
();
conBo
=
new
ConBo
();
}
Trong trường hợp này, biến
conBo
chiếu tới đối tượng thứ 2, bỏ rơi đối tượng thứ nhất.
Tham chiếu được gán giá trị
null
public
void
ahihi
() {
ConBo
conBo
=
new
ConBo
();
conBo
=
null
;
}
Trong trường hợp này, biến
conBo
bị gán bằng
null
, ta mất dấu đối tượng và xem như đối tượng bị huỷ.
2. Cách hủy tham chiếu đến một đối tượng
Trong Java, chúng ta có ba cách hủy tham chiếu tới một đối tượng:
Cách #1: Tham chiếu vĩnh viễn ra ngoài phạm vi tồn tại.
public
void
ahihi
() {
ConBo
conBo
=
new
ConBo
();
}
Trong trường hợp này, biến
conBo
sẽ bị huỷ khi
ahihi
kết thúc.
Cách #2: Tham chiếu được chiếu tới một đối tượng khác
public
void
ahihi
() {
ConBo
conBo
=
new
ConBo
();
conBo
=
new
ConBo
();
}
Trong trường hợp này, biến
conBo
chiếu tới đối tượng thứ 2, bỏ rơi đối tượng thứ nhất.
Cách #3: Tham chiếu được gán giá trị
null
public
void
ahihi
() {
ConBo
conBo
=
new
ConBo
();
conBo
=
null
;
}
Trong trường hợp này, biến
conBo
bị gán bằng
null
, ta mất dấu đối tượng và xem như đối tượng bị huỷ.
Tổng kết
Sự hiểu biết về
vòng đời của một đối tượng
xem qua có vẻ không quan trọng đối với lập trình viên. Tuy nhiên, hiểu biết về nó vừa giúp bạn có kiến thức để né các lỗi không cần thiết trong quá trình code, vừa giúp bạn khác biệt với một số thành phần còn lại – vừa biết làm và biết luôn tại sao.
Đây cũng là một phần kiến thức rất nhỏ, rất cơ bản nhưng nó có thể làm nên sự khác biệt cho bạn ở một khoảnh khắc nào đó. Đừng ngại bỏ ra vài phút cuộc đời để tìm hiểu về nó, bạn sẽ phải cám ơn vài phút này ở một thời điểm nào đấy nếu bạn còn gắn bó với Java!
---
HỌC VIỆN ĐÀO TẠO CNTT NIIT - ICT HÀ NỘI
Học Lập trình chất lượng cao (Since 2002). Học thực tế + Tuyển dụng ngay!
Đc: Tầng 3, 25T2, N05, Nguyễn Thị Thập, Cầu Giấy, Hà Nội
SĐT: 02435574074 - 0914939543
Email: hello@niithanoi.edu.vn
Website:
https://niithanoi.edu.vn
Fanpage: https://facebook.com/NIIT.ICT/
#niit #niithanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp #java #php #python
Về trang trước
Bài tiếp theo
Gửi email
in trang
Chia sẻ
Bình luận Facebook
Cùng danh mục
1
Lớp và Đối tượng trong JAVA
2
Hành vi của đối tượng trong JAVA
3
Vòng đời của đối tượng trong JAVA
4
Quan hệ thừa kế trong JAVA
5
Quan hệ thừa kế trong JAVA (Phần 2)
6
Đa hình và Các mức truy cập
Tutorial
Học PHP trong 7 ngày
Học Lập Trình Python
Học Java trong 7 ngày
JavaScript
HTML
Thuật toán
CSS
JAVA OOP
SQL
Master Bigdata
Đăng ký tư vấn
Nhân viên gọi điện tư vấn miễn phí sau khi đăng ký
Được cập nhật các ưu đãi sớm nhất
Hotline: 0383180086
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Gửi yêu cầu tư vấn thành công!
Tư vấn cho tôi ngay !
Hãy đăng ký để nhận những thông tin mới nhất về học bổng mới nhất tại NIIT - ICT Hà Nội
Gửi cho tôi
Đóng lại
Đăng ký học tại NIIT - ICT Hà Nội
6260+ học viên đã theo học tại NIIT - ICT Hà Nội và có việc làm tốt trong ngành lập trình. Nắm lấy cơ hội ngay hôm nay!
0978 359 287
-
0383 180 086
hello@niithanoi.edu.vn
Chọn khóa học
KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS
KHÓA HỌC LẬP TRÌNH PHP WEB
Khóa học PHP Full stack [2023] cho người mới bắt đầu
Khóa học BIG DATA với Hadoop và Spark
Khóa học Lập trình Android tại Hà Nội
[Tuyển sinh 2023] Lập trình viên Quốc tế DigiNxt
Khóa học Tiền lương & Phúc lợi (C&B Excel) tại Hà Nội
LẬP TRÌNH GAME
Khóa học Lập trình Game Unity
LẬP TRÌNH WEB FRONT END
KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG
KHÓA HỌC ANGULAR & TYPESCRIPT (FRONT END)
LẬP TRÌNH WEB BACK END
LẬP TRÌNH JAVA WEB VỚI FRAME WORK
Lập trình Web với Django
Lập trình PHP với Laravel Framework
CHƯƠNG TRÌNH ĐÀO TẠO ỨNG DỤNG CÔNG NGHỆ
Khóa học Tiền lương & Phúc lợi (C&B Excel) tại TP HCM
LẬP TRÌNH WEB FULL STACK
Khóa học Java Full stack (IJFD)
LẬP TRÌNH MOBILE
FRONT-END VỚI REACTJS VÀ REACT NATIVE
Lập trình Android Nâng cao
ĐÀO TẠO CHO DOANH NGHIỆP
KHÓA HỌC BUSINESS ANALYSIC TỪ CƠ BẢN ĐẾN NÂNG CAO 2023
Khóa học Magento: Làm chủ CMS TMĐT lớn nhất
Khóa học IOT: Xây dựng Sản phẩm IOT với Raspberry Pi
Khóa học Automation Testing Chuyên nghiệp
KHÓA HỌC DỰ ÁN
Học sử dụng bộ Office: Word, Excel, Power Point, Mail chuyên nghiệp
KHÓA HỌC KHÁC
VBA Excel Toàn Tập (Cơ Bản - Nâng Cao)
VBA Excel Nâng cao
Khóa học JMeter: Performance Testing
Khóa học Tester đạt chuẩn Quốc tế ISTQB Foundation Level
Khoá Học Tester đạt chuẩn quốc tế ISTQB Advanced Level
Bạn chưa chọn khóa học cần đăng ký
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Đăng ký ngay
Đăng ký học thành công!
Cảm ơn bạn đã đăng ký học tại NIIT - ICT HÀ NỘI!