NỘI DUNG BÀI HỌC

✳️ Giới thiệu trạng thái Static trong Java
✳️ Khai báo biến và hàm static
✳️ Đặc điểm của hàm static

✅ Static trong Java

Trong java, Static có thể là:

  1. Biến static: Khi bạn khai báo một biến là static, thì biến đó được gọi là biến tĩnh, hay biến static.
  2. Phương thức static: Khi bạn khai báo một phương thức là static, thì phương thức đó gọi là phương thức static.
  3. Khối static: Được sử dụng để khởi tạo thành viên dữ liệu static.

 

🔆 Biến static trong Java

Khi bạn khai báo một biến là static, thì biến đó được gọi là biến tĩnh, hay biến static.

  1. Biến static có thể được sử dụng để tham chiếu thuộc tính chung của tất cả đối tượng (mà không là duy nhất cho mỗi đối tượng), ví dụ như tên công ty của nhân viên, tên trường học của các sinh viên, ...
  2. Biến static lấy bộ nhớ chỉ một lần trong Class tại thời gian tải lớp đó. Và tồn tại giá trị đến cuối chương trình.
  3. Có thể gọi biến static thông qua tên class (không cần khởi tạo đối tượng class)
  4. Biến có từ khoá "static" phía trước
  5. Phải là biến toàn cục
  6. Biến static thường dùng trong Automation Test để tạo biến toàn cục cho toàn hệ thống project auto test để nó chỉ cần khởi tạo 1 lần mà dùng cho đến khi kết thúc chứ không tạo đi tạo lại nhiều lần.


Lợi thế của biến static

Sử dụng biến static giúp chương trình của bạn sử dụng bộ nhớ hiệu quả hơn (tiết kiệm bộ nhớ).

Vấn đề khi không sử dụng biến static:

class Student{ 
     int rollno; 
     String name; 
     String college="Bưu Chính Viễn Thông"; 
}


Giả sử có 1000 sinh viên trong trường đại học, bây giờ instance của các dữ liệu thành viên sẽ sự dụng bộ nhớ mỗi khi đối tượng được tạo. Tất cả sinh viên có rollno và name là thuộc tính riêng. Tuy nhiên, college là thuộc tính chung của tất cả đối tượng. Nếu chúng ta tạo nó là static, thì trường này sẽ chỉ sử dụng bộ nhớ một lần để lưu biến này.

Ghi chú: Thuộc tính static trong Java được chia sẻ tới tất cả đối tượng.

Ví dụ về biến static trong java
public class Student {
    int rollno;
    String name;
    static String college = "Bưu Chính Viễn Thông";


    Student(int r, String n) {
        rollno = r;
        name = n;
    }


    void display() {
        System.out.println(rollno + " - " + name + " - " + college);
    }


    public static void main(String args[]) {
        Student s1 = new Student(111, "Thông");
        Student s2 = new Student(222, "Minh");


        s1.display();
        s2.display();
    }
}​

 

Kết quả:

111 - Thông - Bưu Chính Viễn Thông
222 - Minh - Bưu Chính Viễn Thông


Ví dụ: Chương trình đếm số KHÔNG sử dụng biến static trong java

Trong ví dụ dưới đây, chúng ta tạo một biến instance có tên count mà được tăng lên trong constructor. Khi biến instance này lấy bộ nhớ tại thời điểm tạo đối tượng, mỗi đối tượng sẽ có bản sao của biến instance đó, nếu nó được tăng lên, nó sẽ không ảnh hướng đến các đối tượng khác. Vì thế mỗi đối tượng sẽ có giá trị 1 trong biến count.

public class Counter1 {
    int count = 0; // sẽ lấy bộ nhớ khi instance được tạo ra

    Counter1() {
        count++;
        System.out.println(count);
    }


    public static void main(String args[]) {

        Counter1 c1 = new Counter1();
        Counter1 c2 = new Counter1();
        Counter1 c3 = new Counter1();

    }
}

Kết quả:

1
1
1


Ví dụ: Chương trình đếm số có sử dụng biến static trong java

Như bạn đã thấy ở trên, biến static sẽ lấy bộ nhớ chỉ một lần, nếu bất cứ đối tượng nào thay đổi giá trị của biến static, nó sẽ vẫn ghi nhớ giá trị của nó.

 
public class Counter2 {
    static int count = 0; // sẽ lấy bộ nhớ chỉ một lần

    Counter2() {
        count++;
        System.out.println(count);
    }


    public static void main(String args[]) {

        Counter2 c1 = new Counter2();
        Counter2 c2 = new Counter2();
        Counter2 c3 = new Counter2();

    }
}​

Kết quả:

1
2
3


🔆 Phương thức static trong Java

Nếu bạn áp dụng từ khóa static với bất cứ phương thức nào, thì phương thức đó được gọi là phương thức static.

  1. Một phương thức static thuộc lớp chứ không phải đối tượng của lớp. Nên chúng ta lấy luôn tên class để gọi chúng không cần lấy tên đối tượng class để gọi. (khi đó lấy tên đối tượng class gọi nó sẽ không hiển thị gợi ý, nhưng vẫn gọi được)
  2. Một phương thức static có thể gọi dùng mà không cần tạo một đối tượng của một lớp. (thông qua tên class)
  3. Phương thức static có thể truy cập biến static trực tiếp mà không cần khởi tạo đối tượng class. (nếu khác class thì lấy tên class chấm gọi)


Ví dụ về phương thức static trong Java

public class Student2 {
    int rollno;
    String name;
    static String college = "Bưu Chính Viễn Thông";


    static void change() {
        // Thay đổi thuộc tính static (thuộc tính chung của tất cả các đối tượng)
        college = "Đại Học Công Nghệ";
    }


    Student2(int r, String n) {
        rollno = r;
        name = n;
    }


    void display() {
        System.out.println(rollno + " - " + name + " - " + college);
    }


    public static void main(String args[]) {
        Student2.change();


        Student2 s1 = new Student2(111, "Thông");
        Student2 s2 = new Student2(222, "Minh");
        Student2 s3 = new Student2(333, "Anh");


        s1.display();
        s2.display();
        s3.display();
    }
}​

Kết quả:

111 - Thông - Đại Học Công Nghệ 
222 - Minh - Đại Học Công Nghệ 
333 - Anh - Đại Học Công Nghệ


Sự hạn chế của phương thức static

Có hai hạn chế chính đối với phương thức static. Đó là:

  1. Phương thức static không thể sử dụng biến non-static hoặc gọi trực tiếp phương thức non-static.
  2. Từ khóa thissuper không thể được sử dụng trong ngữ cảnh static.


Ví dụ:

class A1 {
    int a = 40; // non static


    public static void main(String args[]) {
        System.out.println(a);
    }
}

Kết quả:

Compile Time Error

 

🔆 Khối static trong Java

  1. Được sử dụng để khởi tạo giá trị dữ liệu dạng static. (tĩnh, không thay đổi giá trị)
  2. Nó được thực thi trước phương thức main tại lúc tải lớp.

Ví dụ về khối static trong Java

public class A2 {
    static {
        System.out.println("Khối static: hello !");
    }


    public static void main(String args[]) {
        System.out.println("Main: hello !");
    }
}

Kết quả:

Khối static: hello ! 
Main: hello !

 

Câu hỏi: Tại sao phương thức main trong Java là static?

Bởi vì không cần thiết phải tạo đối tượng để gọi phương thức static. Nếu nó là phương thức non-static, JVM đầu tiên tạo đối tượng và sau đó gọi phương thức main() mà có thể gây ra vấn đề về cấp phát bộ nhớ bộ nhớ phụ.


Câu hỏi: Chúng ta có thể thực thi một chương trình mà không có phương thức main()?

Có, một trong các cách đó là khối static trong phiên bản trước của JDK. Không phải là JDK <= 1.7 là được

Ví dụ:

public class A3 {
    static {
        System.out.println("static block is invoked");
        System.exit(0);
    }
}

Teacher

Teacher

Anh Tester

Software Quality Engineer

Đường dẫu khó chân vẫn cần bước đi
Đời dẫu khổ tâm vẫn cần nghĩ thấu

Cộng đồng Automation Testing Việt Nam:

🌱 Telegram Automation Testing:   Cộng đồng Automation Testing
🌱 
Facebook Group Automation: Cộng đồng Automation Testing Việt Nam
🌱 
Facebook Fanpage: Cộng đồng Automation Testing Việt Nam - Selenium
🌱 Telegram
Manual Testing:   Cộng đồng Manual Testing
🌱 
Facebook Group Manual: Cộng đồng Manual Testing Việt Nam

Chia sẻ khóa học lên trang

Bạn có thể đăng khóa học của chính bạn lên trang Anh Tester để kiếm tiền

Danh sách bài học