NỘI DUNG BÀI VIẾT
Từ khóa static được sử dụng nhiều trong lập trình Java. Từ khóa static được sử dụng để tạo một biến level Class trong Java. Các biến và phương thức static là một phần của lớp, không phải là các thể hiện của lớp.
Từ khóa static trong Java
Từ khóa static có thể được sử dụng trong năm trường hợp như thể hiện trong hình ảnh bên dưới.
Java static variable
Chúng ta có thể sử dụng từ khóa static cùng với biến level Class. Một biến static trong class là biến của class và không thuộc object/instance của class.
Vì các biến static được chia sẻ trên tất cả các instance của Object, nó không dược thread safe.
Thông thường, các biến static được sử dụng với từ khóa cuối cùng cho các tài nguyên hoặc hằng số chung có thể được sử dụng bởi tất cả các đối tượng. Nếu biến static không phải là private, chúng ta có thể truy cập nó bằng ClassName.variableName.
//static variable example
private static int count;
public static String str;
public static final String DB_USER = "myuser";
Code language: PHP (php)
Java static method
Giống như biến static, method static thuộc về class chứ không thuộc về instacne của class.
Một phương thức static chỉ có thể truy cập các biến tĩnh của lớp và chỉ gọi các phương thức tĩnh của lớp đó.
Thông thường, các phương thức tĩnh là các phương thức tiện ích mà chúng ta muốn cho các lớp khác sử dụng mà không cần tạo một instance.
Các lớp Java Wrapper và các lớp tiện ích chứa rất nhiều phương thức static. Phương thức main() là điểm vào của chương trình java, bản thân nó là một phương thức static.
//static method example
public static void setCount(int count) {
if(count > 0)
StaticExample.count = count;
}
//static util method
public static int addInts(int i, int...js){
int sum=i;
for(int x : js) sum+=x;
return sum;
}
Code language: PHP (php)
Từ Java 8 trở đi, chúng ta cũng có thể có các phương thức static trong các interface.
Java static block
Khối static Java là nhóm các câu lệnh được thực thi khi lớp được tải vào bộ nhớ bởi Java ClassLoader. Khối static được sử dụng để khởi tạo các biến static của class. Phần lớn nó được sử dụng để tạo tài nguyên tĩnh khi lớp được tải.
Chúng ta không thể truy cập các biến không static trong khối static. Chúng ta có thể có nhiều khối static trong một class, mặc dù điều đó không có nhiều ý nghĩa. Mã khối static chỉ được thực thi một lần khi lớp được tải vào bộ nhớ.
static{
//can be used to initialize resources when class is loaded
System.out.println("StaticExample static block");
//can access only static variables and methods
str="Test";
setCount(2);
}
Code language: JavaScript (javascript)
Java Static Class
Chúng ta có thể sử dụng từ khóa static với các lớp lồng nhau. Từ khóa static không thể được sử dụng với các class cấp cao nhất. Một class lồng nhau tĩnh cũng giống như bất kỳ lớp cấp cao nhất nào khác và được lồng vào nhau chỉ để thuận tiện cho việc đóng gói.
Hãy xem tất cả từ khóa static trong cách sử dụng java trong một chương trình mẫu.
public class StaticExample {
//static block
static{
//can be used to initialize resources when class is loaded
System.out.println("StaticExample static block");
//can access only static variables and methods
str="Test";
setCount(2);
}
//multiple static blocks in same class
static{
System.out.println("StaticExample static block2");
}
//static variable example
private static int count; //kept private to control its value through setter
public static String str;
public int getCount() {
return count;
}
//static method example
public static void setCount(int count) {
if(count > 0)
StaticExample.count = count;
}
//static util method
public static int addInts(int i, int...js){
int sum=i;
for(int x : js) sum+=x;
return sum;
}
//static class example - used for packaging convenience only
public static class MyStaticClass{
public int count;
}
}
Code language: PHP (php)
Hãy xem cách sử dụng biến tĩnh, phương thức và lớp tĩnh trong chương trình thử nghiệm.
public class TestStatic {
public static void main(String[] args) {
StaticExample.setCount(5);
//non-private static variables can be accessed with class name
StaticExample.str = "abc";
StaticExample se = new StaticExample();
System.out.println(se.getCount());
//class and instance static variables are same
System.out.println(StaticExample.str +" is same as "+se.str);
System.out.println(StaticExample.str == se.str);
//static nested classes are like normal top-level classes
StaticExample.MyStaticClass myStaticClass = new StaticExample.MyStaticClass();
myStaticClass.count=10;
StaticExample.MyStaticClass myStaticClass1 = new StaticExample.MyStaticClass();
myStaticClass1.count=20;
System.out.println(myStaticClass.count);
System.out.println(myStaticClass1.count);
}
}
Code language: JavaScript (javascript)
Ouput:
StaticExample static block
StaticExample static block2
5
abc is same as abc
true
10
20
Code language: JavaScript (javascript)
Lưu ý rằng mã khối static được thực thi đầu tiên và chỉ một lần ngay khi lớp được tải vào bộ nhớ. Các kết quả đầu ra khác tự giải thích.
Java static import
Thông thường chúng ta truy cập các thành viên tĩnh bằng cách sử dụng reference class, từ Java 1.5 chúng ta có thể sử dụngJava static import để tránh tham chiếu lớp. Dưới đây là một ví dụ đơn giản về Java static import.
public class A {
public static int MAX = 1000;
public static void foo(){
System.out.println("foo static method");
}
}
Code language: PHP (php)
import static com.hdd.test.A.MAX;
import static com.hdd.test.A.foo;
public class B {
public static void main(String args[]){
System.out.println(MAX); //normally A.MAX
foo(); // normally A.foo()
}
}
Code language: JavaScript (javascript)
Chú ý rằng các câu lệnh import, để import static, chúng ta phải sử dụng import static theo sau là thành viên static được phân loại đầy đủ của một class. Để import tất cả các thành viên static của một class, chúng ta có thể sử dụng * như trong import static com.hdd.test.A.foo; Chúng ta chỉ nên sử dụng nó khi chúng ta đang sử dụng biến static của một lớp nhiều lần, nó không tốt cho khả năng đọc.
Trên đây mình đã liệt kê các trường hợp của từ khóa static. Happy learning!!!