static
Nội dung bài · 5 mục
- 1.Khái niệm
- 2.Ví dụ
- 3.Thử ngay
- 4.Lỗi hay gặp
- 5.Tóm tắt
Mỗi sản phẩm có tên và giá riêng. Nhưng thuế suất 10% thì chung cho mọi sản
phẩm, không thuộc về riêng cái nào. Những thứ dùng chung như vậy được khai báo
bằng static.
Khái niệm
📌 static: từ khoá đánh dấu thành viên thuộc về chính class chứ không thuộc về object nào, gọi qua tên class.
Bạn đã dùng static từ bài ép kiểu mà không để ý. Integer.parseInt là một
static method: gọi thẳng qua tên class Integer, không cần new Integer().
Ví dụ
// Main.java
void main() {
long price = Tax.apply(100000);
System.out.println(price); // 110000
System.out.println(Tax.rate); // 10
}
// Tax.java
class Tax {
public static int rate = 10; // phần trăm
public static long apply(long price) {
return price + price * rate / 100;
}
}Tax.ratevàTax.apply(...)gọi qua tên class, không tạo object.- Static field chỉ có một bản, dùng chung cho cả chương trình.
- Static method không dùng trực tiếp được field hay method thường của class, vì nó không thuộc object nào.
So sánh nhanh:
| Thành viên thường | Thành viên static | |
|---|---|---|
| Thuộc về | từng object | class |
| Gọi qua | object: pen.getPrice() |
tên class: Tax.rate |
| Số bản | mỗi object một bản | một bản duy nhất |
Thử ngay
Tạo Product.java và Main.java như dưới, rồi chạy java Main.java:
// Main.java
void main() {
var a = new Product("Bút bi");
var b = new Product("Vở");
var c = new Product("Thước");
System.out.println(Product.count);
}
// Product.java
class Product {
public static int count;
private String name;
public Product(String name) {
this.name = name;
count++;
}
}Đoán trước khi chạy: mỗi lần tạo object, count tăng thêm 1.
Product.count in ra 1 hay 3?
Xem kết quả
3Là 3. count là static nên cả ba object dùng chung một biến đếm. Nếu bỏ
static, mỗi object sẽ có count riêng, cái nào cũng bằng 1.
Lỗi hay gặp
Static method dùng thành viên thường. Compiler không biết lấy price của
object nào.
// SAI — lỗi compile: price thuộc về từng object
// Item.java
class Item {
private long price;
public static long withTax() {
return price * 110 / 100;
}
}// ĐÚNG — truyền giá trị vào qua tham số
// Item.java
class Item {
private long price;
public static long withTax(long price) {
return price * 110 / 100;
}
}Khai báo static cho dữ liệu riêng. Mọi object dùng chung một bản, nên
object tạo sau ghi đè object tạo trước. Tạo new Product("Bút bi") rồi
new Product("Vở"), cả hai getName() đều trả về "Vở".
// SAI — static: mọi sản phẩm chung một tên
// Product.java
class Product {
private static String name;
public Product(String name) {
Product.name = name;
}
public String getName() { return name; }
}// ĐÚNG — mỗi sản phẩm một tên riêng
// Product.java
class Product {
private String name;
public Product(String name) {
this.name = name;
}
public String getName() { return name; }
}Tóm tắt
staticgắn thành viên với class, không với object.- Gọi qua tên class:
Tax.rate,Integer.parseInt. - Static field chỉ có một bản dùng chung.
- Static method không dùng trực tiếp được field và method thường.
Tự kiểm tra
0/3 câuMath.max(3, 7) được gọi mà không cần new Math(). Điều đó cho biết gì về max?
Class Order có public static int nextId = 1; Tạo 5 object Order, mỗi constructor tăng nextId thêm 1. nextId cuối cùng là bao nhiêu?
Thứ nào nên khai báo static?