VieTopik
Tiếng HànTiếng Anh.NET (C#)Java
  • Góc học tập
Tải app
  • Thư viện
  • Luyện thi
  • Cẩm nang
  • Góc học tập
Java CoreClass cơ bản
Bài 14/19
5 phút

static

Nội dung bài · 5 mục
  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 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.rate và 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ả
3

Là 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

  • static gắ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âu
Câu 1

Math.max(3, 7) được gọi mà không cần new Math(). Điều đó cho biết gì về max?

Câu 2

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?

Câu 3

Thứ nào nên khai báo static?

null và Optionalenum

Nội dung bài

  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt