Trong quá trình học Java bạn sẽ bắt gặp rất nhiều lần từ khóa Static.
Tin tôi đi, các kiến thức mà bạn học từ trong bài đọc và silde hay bài giảng chẳng giúp bạn vượt qua Quiz static một cách trót lọt đâu ^^
Vậy Static là gì ?
Static dùng để quản lý, tối ưu hóa bộ nhớ.
Static là một từ khóa được sử dụng chỉ những phần tử thuộc về lớp (class) mà không phải là một thể hiện của lớp.
Đó có thể là:
Biến tĩnh (static variable)
Phương thức tĩnh (static method)
Khối tĩnh (static block)
Class tĩnh (static nested class)
Chúng được gọi là các thành viên dữ liệu tĩnh.
Có phải bạn đang bối rối không biết các khái niệm trên là gì phải không? Đừng lo, qua một vài ví dụ sau chúng ta sẽ làm rõ từng vấn đề.
- Static variable ( một số nơi người ta gọi là static field)
Nếu bạn khai báo bất kỳ biến nào là Static, thì nó được gọi là biến tĩnh.
Cú pháp khai báo: static nameVariable;
Biến tĩnh có thể được sử dụng để chỉ thuộc tính chung của tất cả các đối tượng (không phải là duy nhất cho từng đối tượng), ví dụ: tên công ty của nhân viên, tên trường đại học của sinh viên, v.v.
Biến tĩnh chỉ nhận được bộ nhớ một lần trong vùng lớp tại thời điểm tải lớp làm cho bộ nhớ chương trình đạt hiệu quả (tức là, nó tiết kiệm bộ nhớ).
Đáng lưu ý, vì biến tĩnh chỉ nhận được bộ nhớ một lần duy nhất nên nếu bất kỳ object nào tạo ra từ class thay đổi giá trị của biến tĩnh nó sẽ thay đổi giá trị của biến tĩnh trên mọi object là trên cả class.
Ví dụ: Q2: Sau khi thực hiện đoạn mã sau, màn hình xuất hiện những gì?
public class MyClass {
static public int X = 2;
static {
X = 1;
}
static public void method() {
X = 5;
}
public static void main(String[] args) {
MyClass o = new MyClass();
MyClass.method();
MyClass.X = 10;
System.out.printf(“x=%d, y=%d”, o.X, MyClass.X);
}
}
Đáp án: x=10, y=10
2. Static method
Nếu bạn áp dụng từ khóa Static với bất kỳ phương thức nào, nó được gọi là phương thức tĩnh.
Cú pháp khai báo: static nameMethod () {…};
- Một phương thức tĩnh thuộc về lớp chứ không phải là đối tượng của một lớp.
- Một phương thức tĩnh có thể được gọi mà không cần tạo một thể hiện của một lớp.
- Một phương thức tĩnh có thể truy cập thành viên dữ liệu tĩnh và có thể thay đổi giá trị của nó.
Có 2 hạn chế đối với phương thức tĩnh:
- Không thể gọi đến các trường hoặc phương thức không tĩnh trực tiếp
- Từ khóa this và super không thể dùng được trong phương thức tĩnh
Tại sao psvm lại là phương thức tĩnh ?
Các đối tượng không thể gọi đến phương thức tĩnh. Nếu Main là một phương thức không tĩnh, JVM sẽ tạo một đối tượng sau đó gọi tới phương thức main () sẽ dẫn tới việc phải cấp phát thêm bộ nhớ.
3. Khối tĩnh
Được sử dụng để khởi tạo thành viên dữ liệu tĩnh và được thực thi trước phương thức Main tại thời điểm nạp lớp.
Cú pháp: static {
// Khối lệnh
}
4. Lớp tĩnh
Static nested class là lớp tĩnh được tạo ra trong một lớp.
Lớp tĩnh không thể truy cập đến các thành viên dữ liệu và phương thức không tĩnh. Nó có thể được truy cập bởi tên lớp bên ngoài.
Như đã nói ở trên, các thành viên tĩnh thuộc về lớp, để truy cập đến chúng không cần thiết phải khởi tạo một đối tượng. Do đó đôi khi ta sẽ thấy các cách truy cập như sau:
public class MyClass {
static public int X = 30;
static {
X = 50;
}
static public void method() {
X = 5;
}
static public class A {
void msg1() {
System.out.println(X);
}
static public class B {
static void msg2() {
System.out.println(X);
}
public static void main(String[] args) {
MyClass o = new MyClass();
MyClass.method();
MyClass.X = 10;
MyClass.A obj = new MyClass.A();
obj.msg1(); // msg1 không phải phương thức tĩnh
MyClass.B.msg2(); // msg2 là phương thức tĩnh
}
}
Hy vọng qua bài viết này các bạn đã nắm rõ hơn về khái niệm static trong JAVA.
Cảm ơn đã theo dõi. Nếu có đóng góp gì hãy comment bên dưới bài viết nhé. Tks u !