• Chào bạn, hãy đăng ký hoặc đăng nhập để tham gia cùng bọn mình và sử dụng được đầy đủ chức năng của diễn đàn :).
anhcraft

Java Java cơ bản #8: Từ khóa Static

anhcraft

Thành viên BQT
DEVELOPER
THÀNH VIÊN
Tham gia
18/09/2016
Bài viết
3,165
Từ khóa static có thể đặt trước Class con, Variable và Method.
Chú ý: Class ngoài cùng không dùng được static nhé.

Static nested class
Khi đặt từ static đằng trước từ class thì Class đó sẽ gọi là static nested class. Còn nếu không có static thì gọi là non-static nested class (hay inner class).
Tác dụng: Khi một Class con có static thì Class đó độc lập với class cha.

Ví dụ minh họa một class chưa có static:
3n8wra0.png


Trong ảnh trên, TuDienTiengAnh là class con (nhưng chưa có static). Vì nó thuộc class ngoài là TuDien nên nó có thể truy cập vào các trường (Instance variable/Static variable) của class TuDien. Như các bạn thấy, biến a là biến khởi tạo trong class TuDien nhưng mình vẫn có thể truy cập từ class TuDienTiengAnh được.

Để khởi tạo một object từ class TuDienTiengAnh mình sẽ làm như sau:
ItKRlR5.png


Như các bạn thấy, mình phải tạo một object từ class ngoài cùng trước (TuDien) rồi tạo tiếp một object khác từ class mình cần (TuDienTiengAnh)
Nếu còn nhiều class con lồng vào nữa thì vẫn thực hiện quy tắc trên!

Ví dụ minh họa một class có static:
cL6WjZb.png


Bây giờ mình đã thêm từ khóa static trước class TuDienTiengAnh, IDE của các bạn sẽ báo lỗi liền :D
Lý do đó là lúc này TuDienTiengAnh độc lập với class ngoài là TuDien
Biến a Instance variable (biến chỉ truy cập được khi đã có object), mình đã tạo object TuDien đâu mà truy cập được :v
Sửa lại một chút:
eu0K0vP.png

Ok bây giờ thì hết lỗi, vì mình đã tạo một object TuDien rồi truy cập biến a bên trong object đó.

Lúc này, để khởi tạo một object từ class TuDienTiengAnh mình sẽ làm như sau:
dJ4OLkj.png


Vì class TuDienTiengAnh độc lập với TuDien nên mình sẽ viết là TuDien.TuDienTiengAnh
Vì sao nó đã độc lập rồi nhưng mình vẫn phải viết class ngoài ở trước? Vì trong tệp Java nó được sắp xếp như vậy. Ngoài ra TuDienTiengAnh không phải là tên một tệp Java riêng biệt mà nó là class con.
À nhắc lại chút từ #3, đường dẫn đầy đủ của cái class đó là package1.package2.TuDien.TuDienTiengAnh
Nhắc lại từ #4, mình không thể import class con, đó là lý do vì sao cái khúc import đến chỗ TuDien là hết.

Static method
Static method là các hàm thuộc class, để truy cập được thì chỉ cần truy cập Class trước
Method không có static là non-static method là hàm thuộc Object, để truy cập được phải có Object trước
Ví dụ:
xyJkbaW.png

Mình gọi hàm #docTuDien từ hàm khác là #doc()
Nếu sửa lại một chút......
lJBHbMy.png

Bị báo lỗi liền :D Lý do là vì #docTuDien không phải là static Method, mình chưa khởi tạo Object nên không dùng nó được.
Sửa lại để hết lỗi:
qTCAQTY.png


Static variable
Static variable là các trường có từ khóa static, thuộc Class.
Khi không có static, nó gọi là Instance variable/Non-static variable, thuộc Object.
Cũng như Static method, mình có thể dễ dàng truy cập Static variable. Nhưng với Instance variable, mình phải có Object trước.
Ví dụ:
Dk0nTsg.png

Đừng chú ý cái private/public mình sẽ nói sau! Trong ảnh trên mình đang thay đổi giá trị biến ten từ #tinhDiem.
Nếu chỉnh sửa lại:
6o0y0Ec.png

Sẽ thấy IDE báo lỗi :v Lý do như mình đã nói: ten bây giờ là Instance variable, nó thuộc về Object, mình phải có Object trước mới dùng được.
Sửa lại bằng cách tạo thêm Object HocSinh
FiFfhHe.png

OK nhé :D

Ngoài ra còn một cái có thể dùng với static là block code, nhưng mình sẽ nói sau vì nó không quan trọng.

Một cách dễ nhớ về cái static và non-static (không có static)
Cái gì có static sẽ thuộc về Class. Không có static thuộc về Object.
Object cũng thuộc Class -> Cái không có static có thể truy cập cái có static (ngược lại không được :v)
Inner class không thể chứa static class (vì lý do trên)

Khi nào dùng static?
Khi bạn cần dùng chung dữ liệu.
Chẳng hạn bạn cần tạo 100 Object đại diện cho 100 Người chơi trong server gồm 3 biến: Tên server, Tên Người chơi và Cấp độ
Rõ ràng với từng người, tên và cấp độ sẽ khác nhau nên nó phải phụ thuộc vào object -> là Instance variable
Còn 100 người đó đều chơi server bạn, vậy thì tên server sẽ giống nhau -> Tên server là Static variable

Hết #8.
 
Từ khóa static có thể đặt trước Class con, Variable và Method.
Chú ý: Class ngoài cùng không dùng được static nhé.

Static nested class
Khi đặt từ static đằng trước từ class thì Class đó sẽ gọi là static nested class. Còn nếu không có static thì gọi là non-static nested class (hay inner class).
Tác dụng: Khi một Class con có static thì Class đó độc lập với class cha.

Ví dụ minh họa một class chưa có static:
3n8wra0.png


Trong ảnh trên, TuDienTiengAnh là class con (nhưng chưa có static). Vì nó thuộc class ngoài là TuDien nên nó có thể truy cập vào các trường (Instance variable/Static variable) của class TuDien. Như các bạn thấy, biến a là biến khởi tạo trong class TuDien nhưng mình vẫn có thể truy cập từ class TuDienTiengAnh được.

Để khởi tạo một object từ class TuDienTiengAnh mình sẽ làm như sau:
ItKRlR5.png


Như các bạn thấy, mình phải tạo một object từ class ngoài cùng trước (TuDien) rồi tạo tiếp một object khác từ class mình cần (TuDienTiengAnh)
Nếu còn nhiều class con lồng vào nữa thì vẫn thực hiện quy tắc trên!

Ví dụ minh họa một class có static:
cL6WjZb.png


Bây giờ mình đã thêm từ khóa static trước class TuDienTiengAnh, IDE của các bạn sẽ báo lỗi liền :D
Lý do đó là lúc này TuDienTiengAnh độc lập với class ngoài là TuDien
Biến a Instance variable (biến chỉ truy cập được khi đã có object), mình đã tạo object TuDien đâu mà truy cập được :v
Sửa lại một chút:
eu0K0vP.png

Ok bây giờ thì hết lỗi, vì mình đã tạo một object TuDien rồi truy cập biến a bên trong object đó.

Lúc này, để khởi tạo một object từ class TuDienTiengAnh mình sẽ làm như sau:
dJ4OLkj.png


Vì class TuDienTiengAnh độc lập với TuDien nên mình sẽ viết là TuDien.TuDienTiengAnh
Vì sao nó đã độc lập rồi nhưng mình vẫn phải viết class ngoài ở trước? Vì trong tệp Java nó được sắp xếp như vậy. Ngoài ra TuDienTiengAnh không phải là tên một tệp Java riêng biệt mà nó là class con.
À nhắc lại chút từ #3, đường dẫn đầy đủ của cái class đó là package1.package2.TuDien.TuDienTiengAnh
Nhắc lại từ #4, mình không thể import class con, đó là lý do vì sao cái khúc import đến chỗ TuDien là hết.

Static method
Static method là các hàm thuộc class, để truy cập được thì chỉ cần truy cập Class trước
Method không có static là non-static method là hàm thuộc Object, để truy cập được phải có Object trước
Ví dụ:
xyJkbaW.png

Mình gọi hàm #docTuDien từ hàm khác là #doc()
Nếu sửa lại một chút......
lJBHbMy.png

Bị báo lỗi liền :D Lý do là vì #docTuDien không phải là static Method, mình chưa khởi tạo Object nên không dùng nó được.
Sửa lại để hết lỗi:
qTCAQTY.png


Static variable
Static variable là các trường có từ khóa static, thuộc Class.
Khi không có static, nó gọi là Instance variable/Non-static variable, thuộc Object.
Cũng như Static method, mình có thể dễ dàng truy cập Static variable. Nhưng với Instance variable, mình phải có Object trước.
Ví dụ:
Dk0nTsg.png

Đừng chú ý cái private/public mình sẽ nói sau! Trong ảnh trên mình đang thay đổi giá trị biến ten từ #tinhDiem.
Nếu chỉnh sửa lại:
6o0y0Ec.png

Sẽ thấy IDE báo lỗi :v Lý do như mình đã nói: ten bây giờ là Instance variable, nó thuộc về Object, mình phải có Object trước mới dùng được.
Sửa lại bằng cách tạo thêm Object HocSinh
FiFfhHe.png

OK nhé :D

Ngoài ra còn một cái có thể dùng với static là block code, nhưng mình sẽ nói sau vì nó không quan trọng.

Một cách dễ nhớ về cái static và non-static (không có static)
Cái gì có static sẽ thuộc về Class. Không có static thuộc về Object.
Object cũng thuộc Class -> Cái không có static có thể truy cập cái có static (ngược lại không được :v)

Hết #8.
Co ai nhu minh hong! doc hongg hieu gi het :hm4:
 
Similar content Most view Xem thêm
Back
Top Bottom