Java: Từ khóa static


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

Từ khóa static trong Java được sử dụng với mục đích chính là để quản trị bộ nhớ. Ta có thể áp dụng từ khóa static với thuộc tính (cũng được gọi là biến lớp, biến class, thuộc tính thể hiện), phương thức (cũng được gọi là phương thức lớp, phương thức thể hiện), khối, lớp. Từ khóa static thuộc về lớp chứ không thuộc về đối tượng (thể hiện) của lớp.

Thuộc tính static trong Java

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

Thuộc tính static được sử dụng làm thuộc tính chung cho tất cả đối tượng, ví dụ như tên công ty của nhân viên là chung, tên trường học của các sinh viên là chung, …

Lợi thế của thuộc tính static

Thuộc tính static giúp bộ nhớ chương trình của bạn được sử dụng hiệu quả hơn (tiết kiệm bộ nhớ) vì chỉ có 1 vùng nhớ duy nhất được tạo cho mỗi thuộc tính static.

Tìm hiểu vấn đề xảy ra khi không có thuộc tính static

public class Student{
  int rollno; //mã sinh viên
  String name; //tên sinh viên
  String college="V1Study"; //tên trường
}

Giả sử có 5000 sinh viên trong trường đại học, thì mỗi sinh viên có rollno và name riêng. Tuy nhiên ở đây, college là thuộc tính chứa tên trường của các đối tượng sinh viên, mà trong ví dụ trên nó chứa "V1Study", thì nếu như khai báo thuộc tính college như ở trên thì sẽ có 5000 vùng nhớ được tạo cho thuộc tính college của 5000 sinh viên, và 5000 vùng nhớ này đều chứa "V1Study", điều này dẫn đến rất lãng phí bộ nhớ. Nhưng nếu như ta thiết lập cho thuộc tính college là static, thì chỉ có duy nhất 1 vùng nhớ được tạo ra và 5000 sinh viên sẽ đều sử dụng chung vùng nhớ này và vì vậy 5000 sinh viên đều có college là "V1Study".

Ghi chú: Các thuộc tính static trong Java được chia sẻ tới tất cả các đối tượng, tức tất cả các đối tượng của một lớp sẽ dùng chung các thuộc tính static.

Ví dụ về thuộc tính static trong Java

Đổi tên trường (college)

//Ví dụ về biến static trong Java
public class Student {
  int rollno;
  String name;
  static String college = "V1Study";

  Student(){
  }

  Student(int rollno, String name) {
    this.rollno = rollno;
    this.name = name;
  }

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

}

class TestStudent {
  public static void main(String args[]) {
    Student s1 = new Student(111, "Hoang");
    Student s2 = new Student(222, "Thanh");
    System.out.println("Tên trường ban đầu:");
    s1.display(); //Cả s1
    s2.display(); //và s2 đều có tên trường là V1Study
    System.out.println("Đổi tên trường:");
    s1.college = "V1Study Academy"; //Tiến hành đổi tên trường cho s1
    s1.display(); //thì cả s1
    s2.display(); //và s2 đều vẫn có cùng tên trường.
  }
}

Kết quả:

Tên trường ban đầu:
111-Hoang-V1Study
222-Thanh-V1Study
Đổi tên trường:
111-Hoang-V1Study Academy
222-Thanh-V1Study Academy

Chương trình counter không sử dụng biến static

Trong ví dụ sau, ta tạo một thuộc tính có tên count và giá trị của nó tăng 1 đơn vị trong hàm tạo. Khi ta tạo các đối tượng thì mỗi đối tượng sẽ có thuộc tính count này và các thuộc tính count này đều chứa giá trị là 1.

public class Counter {
  int count = 0;

  Counter() {
    count++;
  }

  public static void main(String args[]) {
    Counter c1 = new Counter();
    System.out.println("count của c1: "+c1.count);
    Counter c2 = new Counter();
    System.out.println("count của c2: "+c2.count);
    Counter c3 = new Counter();
    System.out.println("count của c3: "+c3.count);
  }
}

Kết quả:

count của c1: 1
count của c2: 1
count của c3: 1

Chương trình counter dùng static

Giờ bạn sửa ví dụ trên bằng cách đặt từ khóa static cho thuộc tính count thì khi ta tạo các đối tượng thì các đối tượng này sẽ dùng chung thuộc tính count.

public class Counter {
  static int count = 0;//biến count sẽ là biến dùng chung vì được khai báo là static

  Counter() {
    count++;
  }

  public static void main(String args[]) {
    Counter c1 = new Counter();
    System.out.println("count của c1: "+c1.count);
    Counter c2 = new Counter();
    System.out.println("count của c2: "+c2.count);
    Counter c3 = new Counter();
    System.out.println("count của c3: "+c3.count);
  }
}

Kết quả:

count của c1: 1
count của c2: 2
count của c3: 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.

  • Một phương thức static sẽ thuộc về lớp chứ không thuộc đối tượng của lớp.
  • Phương thức static có thể được gọi mà không cần phải thông qua đối tượng của lớp.
  • Phương thức static có thể truy cập các thành phần (thuộc tính, phương thức) static một cách trực tiếp.

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

//Ví dụ về phương thức static trong Java
public class Student {
  int rollno;
  String name;
  static String college = "V1Study";

  static void changeCollege() {//phương thức static
    college = "V1Study Academy";
  }

  Student(int rollno, String name) {
    this.rollno = rollno;
    this.name = name;
  }

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

  public static void main(String args[]) {
    Student.changeCollege();
    Student s1 = new Student(111, "Hoang");
    Student s2 = new Student(222, "Thanh");
    s1.display();
    s2.display();
  }
}

Kết quả:

111-Hoang-V1Study Academy
222-Thanh-V1Study Academy

Ví dụ khác về phương thức static thực hiện phép tính toán thông thường

//Chương trình lấy cube (giá trị lập phương) của số đã cho bằng phương thức static
class Calculate{
  static int cube(int x){
    return x*x*x;
  }
  public static void main(String args[]){
    int result=Calculate.cube(5);
    System.out.println(result);
  }
}

Kết quả:

125

Một số hạn chế đối với phương thức static

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

  • Phương thức static không thể sử dụng được thuộc tính non-static hoặc gọi trực tiếp phương thức non-static.
  • Từ khóa this và super không thể được sử dụng trong ngữ cảnh static.

Ví dụ:

public class A {
  int a = 40; //non-static

  public static void main(String args[]) {
    System.out.println(a);//xảy ra lỗi ở đây
  }
}

Chạy chương trình trên sẽ cho kết quả là Compile Time Error.

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

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

Khối static trong Java

Khối static được sử dụng để khởi tạo các thành phần dữ liệu static. Nó được thực thi trước phương thức main() tại thời gian tải lớp và trước cả hàm tạo khi tạo đối tượng mới.

Dưới đây là ví dụ về khối static trong Java trong đó khối static được gọi trước cả phương thức main():

public class KhoiStatic{
  static{
    System.out.println("Khối static được gọi trước khi gọi phương thức main().");
  }

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

Kết quả:

Khối static được gọi trước khi gọi phương thức main().
Hello main() method.

Còn đây là ví dụ về khối static trong Java trong đó khối static được gọi trước cả hàm tạo (constructor):

public class StaticBlock {
  static{
    System.out.println("You are in static block");
  }

  public StaticBlock() {
    System.out.println("You are in parameterless constructor of the StaticBlock class");
  }

}

class TestStaticBlock{
  public static void main(String[] args) {
    StaticBlock sb = new StaticBlock();
  }
}

Kết quả:

You are in static block
You are in parameterless constructor of the StaticBlock class

Câu hỏi: 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 JDK từ 1.8.

public class KhoiStatic{
  static{
    System.out.println("Khối static được gọi trước khi gọi phương thức main().");
  }
}
» Tiếp: Thừa kế (Inheritant)
« Trước: Bài tập phần Class
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!