Quản lý bộ nhớ hiệu quả với static trong java

Từ khoá static có thể sử dụng cho class, biến, method và block. Khi được sử dụng chung với static như các biến, method etc thì nó sẽ trở thành một thành viên của class thay vì một instance xác định(các object được tạo từ class). 

Biến static

Giả sử có 1000 học sinh  thuộc trường Khoa Học Tự Nhiên(KHTN), nhà trường cần quản lý tất cả các sinh viên của mình. Mỗi sinh viên gồm các thông tin: Tên, giới tính, địa chỉ, tên khoa, trường. 

// File Student.java
public class Student {
    String name;
    boolean sex;
    String address;
    String faculty;
    String school;

    public Student(String name, boolean sex, String address, String faculty, String school) {
        this.name = name;
        this.sex = sex;
        this.address = address;
        this.faculty = faculty;
        this.school = school;
    }
}

Với mỗi sinh viên trong tổng số 1000 sinh viên của trường chúng ta sẽ tạo khởi tạo để quản lý như sau: 

// File Main.java
public class Main {

    public static void main(String[] args) {
	    Student student1 = new Student("A", true,"Dong Nai", "Cong nghe thong tin", "KHTN");
        Student student2 = new Student("B", true,"Binh dinh", "Sinh Hoc", "KHTN");
        //...
        Student studentN = new Student("C", false,"Ca mau", "Toan", "KHTN");
    }
}

Chúng ta thấy rằng khi khởi tạo 1000 sinh viên thì tên trường vẫn chỉ là KHTN. Thế nhưng với cách làm trên của chúng ta Java sẽ khởi tạo và cấp phát 1000 vùng nhớ cho các mỗi giá trị “KHTN”. Vậy cách nào để giải quyết vấn đề này?

Static được sinh ra để quản lý bộ nhớ cách hiệu quả. Static có thể áp dụng cho biến, phương thức, block, nested class.

Một biến đi cùng với từ khoá static sẽ chỉ được cấp phát vùng nhớ một lần duy nhất tại thời điểm tải class. Và nó thuộc về class chứ không thuộc về bất kỳ một object nào cụ thể.

Quay trở lại vấn đề được nêu ở trên, chúng ta thấy nên áp dụng static cho biến trường phải không nào.

// File Student.java
public class Student {
    String name;
    boolean sex;
    String address;
    String faculty;
    static String school = "KHTN";

    public Student(String name, boolean sex, String address, String faculty) {
        this.name = name;
        this.sex = sex;
        this.address = address;
        this.faculty = faculty;
    }
}

Xem ví dụ dưới đây nhé:

VD1: Giả sử chúng ta có class CountWithoutStatic chứa biến count không là static biến.

// File CountWithoutStatic.java
public class CountWithoutStatic {
    int count;

    CountWithoutStatic() {
        this.count = 0;
    }
}
// File Main.java
public class Main {

    public static void main(String[] args) {
        CountWithoutStatic countWithoutStatic1 = new CountWithoutStatic();
        countWithoutStatic1.count++;
        CountWithoutStatic countWithoutStatic2 = new CountWithoutStatic();
        countWithoutStatic2.count++;
        CountWithoutStatic countWithoutStatic3 = new CountWithoutStatic();
        countWithoutStatic3.count++;

        System.out.println(countWithoutStatic1.count);
        System.out.println(countWithoutStatic2.count);
        System.out.println(countWithoutStatic3.count);
    }
}
Output: 
1
1
1

VD2: Giả sử chúng ta có class CountWithStatic chứa biến count là static.

// File CountWithStatic.java
public class CountWithStatic {
    static int count = 0;
}
// File Main.java
public class Main {

    public static void main(String[] args) {
        CountWithStatic countWithStatic1 = new CountWithStatic();
        countWithStatic1.count++;
        CountWithStatic countWithStatic2 = new CountWithStatic();
        countWithStatic2.count++;
        CountWithStatic countWithStatic3 = new CountWithStatic();
        countWithStatic3.count++;

        System.out.println(countWithStatic1.count);
        System.out.println(countWithStatic2.count);
        System.out.println(countWithStatic3.count);
    }
}
Output:
3
3
3

Đấy các bạn thấy chưa. Với biến không phải static thì mỗi lần khởi tạo nó đều tạo ra một biến count mới cho nên kết quả là 1 – 1 – 1.

Còn với static 3 lần khởi tạo chỉ tham chiếu đến một biến duy nhất mà thôi, kết quả 3 – 3 – 3.

Truy cập biến static

<Tên class>.<Tên biến>
// File StaticAccess.java
public class StaticAccess {

    static String name = "Deft blog";
}
// File Main.java
public class Main {

    public static void main(String[] args) {
        System.out.println(StaticAccess.name);
    }
}
Output:
Deft blog

Static method

Static method có thể truy cập các biến static của class mà không cần sử dụng object(instance). 

Cú pháp khai báo static method

static return_type method_name () {}

Cách truy cập method static

<Tên class>.<Tên method>(List param){}

Ví dụ

// File StaticExample.java
public class StaticExample {
    static String name = "shareprogramming.net";

    static void staticMethod() {
        System.out.println(name);
    }
}
// File Main.java
public class Main {
    public static void main(String[] args) {
        StaticExample.staticMethod();
    }
}

Output: shareprogramming.net

Chúng ta không cần phải khởi tạo class mà gọi trực tiếp đến method staticMethod() và nó cũng truy cập trực tiếp đến biến static name.

Static class

Một class là static khi nó là một nested class.

  1. Nested class static không cần tham chiếu đến class chứa nó.
  2. Nested class static không thể truy cập đến các thành phần non-static của class chứa nó
  3. Nested class static có thể truy cập đến các thành phần static của class chứa nó.

Ví dụ

// File StaticExample.java
public class StaticExample {
    private static String str = "shareprogramming.net";

    //Static class
    static class MyNestedClass{
        static void disp() {
            System.out.println(str);
        }

    }
}
// File Main.java
public class Main {
    public static void main(String[] args) {
        StaticExample.MyNestedClass.disp();
    }
}

Output: shareprogramming.net

Tóm lược

Static keyword có phải là rất hữu dụng đúng không các bạn. Thế nhưng phải biết cách dùng đúng lúc đó nha. Trước đây, lúc mới bắt đầu lặp trình mình cứ đụng gì là cho nó thành static. Đến hồi “Ủa tao có làm gì mày đâu mà giá trị mày đổi rồi” một hồi sau mới để ý chính là vì static nên bị code chỗ khác thay đổi mà mình không hề hay biết.

Nguồn tham khảo

https://www.geeksforgeeks.org/static-keyword-java/

https://www.edureka.co/blog/static-keyword-in-java/

5 2 votes
Article Rating
Subscribe
Notify of
guest
1 Comment
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
1
0
Would love your thoughts, please comment.x
()
x