Tìm hiểu về static trong Java

I, static keyword

  • static keyword có thể được dùng với:
    • block: static block.
    • variable: static variable.
    • method: static method.
    • nested class: static nested class.
  • static member sẽ gắn với class của nó (không phải gắn với instance). Do đó, bạn có thể truy cập chúng mà không cần instance.

II, static block

  • Khi static variable chưa được gán giá trị, bạn có thể gán giá trị của nó ở trong static block.
  • Static block chỉ xử lý 1 lần khi class load lần đầu.
  • Ví dụ 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class TestBlock {

static int a = 10;
static int b;

static {
System.out.println("Static block initialized.");
b = a * 4;
}

public static void main(String[] args) {
System.out.println("from main");
System.out.println("Value of a : "+ a);
System.out.println("Value of b : "+ b);
}
}
  • kết quả là:
1
2
3
4
Static block initialized.
from main
Value of a : 10
Value of b : 40

III, static variable

  • Static variable gắn với class của nó (không phải là instance).
  • Điều này có nghĩa nếu bạn định nghĩa static variable, tất cả các instance của class dùng chung 1 static member (thay vì mỗi instance có 1 static member).
  • Khi bạn thay đổi giá trị của static variable thì những lời gọi sau này tới static member đó cũng sẽ nhận được gía trị mới nhất đó.

IV, static method

  • Static method được gọi mà không cần phải khỏi tạo object.
  • Nó giúp tối ưu hoá performance thường được sử dụng cho các util method.
  • Nếu method của bạn không liên quan tới member variable của class thì nên sử dụng static method.
  • Tuy nhiên, static method cũng có một số nhược điểm sau:
    • 1, Chỉ có thể gọi static method khác.
    • 2, Chỉ có gọi những static variable (class variable).
    • 3, Không cho phép this() hay super(). Đây cũng là lý do class con không thực sự override static method của class cha.
  • Ví dụ 2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class TestMethod { 

int b = 20; // instance variable

static int a = 10; // static variable

// static method
static void test() {
a = 20;

// Cannot make a static reference to the non-static field b
b = 10; // compilation error

// Cannot make a static reference to the
// non-static method m2() from the type Test
m2(); // compilation error

// Cannot use super in a static context
System.out.println(super.a); // compiler error
}
}

V, static nested class

  • Bạn có thể tham khảo ở bài viết về nested class