Từ khóa Static trong Java | JAVA DEV

Từ khóa static trong Java được sử dụng chủ yếu để quản lý bộ nhớ. Chúng ta có thể áp dụng từ khóa stactic với biến, phương thức, và lớp lồng nhau.

Từ khóa Static trong Java Từ khóa Static trong Java

Từ khóa static thuộc về class chứ không phải thuộc về thể hiện của class.

Static có thể là:

  • Variable (Biến của class)
  • Method (Phương thức của class)
  • Block
  • Nested class

1. Biến static trong Java

Nếu bạn tuyên bố bất kỳ biến nào với từ khóa static, nó là một biến static.

  • Biến static 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 static chỉ nhận được bộ nhớ một lần trong khu vực class tại thời điểm tải lớp (class loading).

1.1. Ưu điểm của biến static

Biến static làm cho bộ nhớ chương trình của bạn hiệu quả hơn (tức là, nó tiết kiệm bộ nhớ).

1.2. Có vấn đề gì không có biến static?

class Student{  
  int id;  
  String name;  
  String college="NIIT";  
}

Giả sử có 500 sinh viên trong trường đại học NIIT, bây giờ tất cả các data member cá thể sẽ nhận được bộ nhớ mỗi khi đối tượng được tạo.

Tất cả các sinh viên có id và name duy nhất của nó, vì vậy data member cá thể là tốt trong trường hợp như vậy.

Ở đây, ‘college” đề cập đến thuộc tính chung của tất cả các đối tượng. Nếu chúng ta làm cho nó thành static, trường này sẽ chỉ nhận được cấp phát bộ nhớ một lần.

Lưu ý: Thuộc tính static chia sẻ cho tất cả các đối tượng, nó có thể gọi khi chưa cần tạo đối tượng nào.

1.3. Ví dụ về biến static

Để hiểu rõ về biến static hơn thì chúng ta sẽ cùng xem ví dụ sau:

File: TestStaticVariable1.java

// Chương trình Java ví dụ về biến static 
class Student{
  int id; //instance variable  
  String name;  
  static String college ="NIIT"; //static variable  
   
  //constructor
  Student(int i, String n){  
    id = i;  
    name = n;  
  }  
  // Phương thức để hiển thị thông tin sin viên
  void display(){
    System.out.println(id+" "+name+" "+college);
  }  
}

// Tạo class khác để thực hiện hiển thị dữ liệu
public class TestStaticVariable1{
  public static void main(String args[]){  
    Student s1 = new Student(17,"Hải");  
    Student s2 = new Student(18,"Doanh");  
    // Chúng ta có thể thay đổi trường đại học của tất cả sv bằng 1 dòng code
    //Student.college="NIIT - ICT Hà Nội";  
    s1.display();
    s2.display();
  }
}

Kết quả:

17 Hải NIIT
18 Doanh NIIT

1.4. Chương trình bộ đếm không có biến static

Trong ví dụ này, chúng ta đã tạo ra một biến thể hiện có tên là count được tăng lên trong hàm tạo.

Do biến đối tượng nhận được 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 thể hiện.

Nếu nó được tăng lên, nó sẽ không phản ánh đến các đối tượng khác. Vì vậy, mỗi đối tượng sẽ có giá trị là 1 trong biến count.

// Chương trình Java sử dụng biến thể hiện (instance variable) 
// lấy bộ nhớ tại mỗi thời điểm tạo đối tượng của class.
class Counter{  
  int count = 0;/* lấy bộ nhớ tại mỗi thời điểm thể hiện được tạo*/
  
  Counter(){  
    count++; // Tăng lên 1 đơn vị
    System.out.println(count);  
  }  
  
  public static void main(String args[]){  
    // Tạo các đối tượng
    Counter c1=new Counter();
    Counter c2=new Counter();
    Counter c3=new Counter();
  }  
}  

Kết quả:

1
1
1

1.5. Chương trình bộ đếm có biến static

Như chúng ta đã đề cập ở trên, biến static sẽ chỉ nhận được bộ nhớ một lần, nếu bất kỳ đối tượng nào thay đổi giá trị của biến tĩnh, nó sẽ giữ lại giá trị của nó.

// Chương trình Java sử dụng biến static
// nó chia sẻ với tất cả các đối tượng.
class Counter{  
  static int count = 0;/* Chỉ nhận bộ nhớ một lần và giữ lại giá trị của nó*/
  
  Counter(){  
    count++; // Tăng lên 1 đơn vị
    System.out.println(count);  
  }  
  
  public static void main(String args[]){  
    // Tạo các đối tượng
    Counter c1=new Counter();
    Counter c2=new Counter();
    Counter c3=new Counter();
  }  
}

Kết quả:

1
2
3

2. Phương thức static trong Java

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

  • Một phương thức static thuộc về class chứ không phải là đối tượng của một class.
  • Một phương thức static có thể được gọi mà không cần tạo một thể hiện của một class.
  • Một phương thức static có thể truy cập static data member và có thể thay đổi giá trị của nó.

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

// Chương trình Java sử dụng phương thức static  
class Student{  
  int id;
  String name;
  static String college = "NIIT";
  
  // Phương thức static thay đổi giá trị của biến static 
  static void change(){
    college = "NIIT - ICT Hà Nội";
  }
  
  // Hàm tạo để khởi tạo biến
  Student(int i, String n){  
    id = i;
    name = n;
  }  
  // Phương thức hiển thị dữ liệu
  void display(){
    System.out.println(id+" "+name+" "+college);
  }
}

// Class tạo và hiển thị dữ liệu của đối tượng 
public class TestStaticMethod{
  public static void main(String args[]){  
    Student.change(); // Gọi phương thức change()
 
    // Tạo đối tượng  
    Student s1 = new Student(17,"Hải");  
    Student s2 = new Student(18,"Doanh");  
    Student s3 = new Student(19,"Việt");  
    
    // Gọi phương thức hiển thị dữ liệu  
    s1.display();  
    s2.display();  
    s3.display();  
  }  
}

Bạn đoán college lúc này là NIIT hay là NIIT – ICT Hà Nội?

Kết quả:

17 Hải NIIT - ICT Hà Nội
18 Doanh NIIT - ICT Hà Nội
19 Việt NIIT - ICT Hà Nội

2.2. Một ví dụ khác sử dụng phương thức static

// Chương trình Java để lập phương của một số đã cho bằng phương thức tĩnh

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);
  }
}

Như bạn thấy đấy, chúng ta có thể gọi phương thức static mà không cần khởi tạo đối tượng nào cả.

Kết quả:

125

Hạn chế của phương thức static là gì?

Có 2 điểm hạn chế của phương thức static:

  • Phương thức static không thể sử dụng data member non-static hoặc không thể gọi phương thức non-static trực tiếp.
  • this và super không thể được sử dụng trong bối cảnh static.

Ví dụ:

class A{  
  int a = 40; //non static  
   
  public static void main(String args[]){  
    System.out.println(a);
  }
}

Kết quả:

Compile Time Error

Tại sao phương thức main của Java là static?

Đó là bởi vì đối tượng không bắt buộc phải gọi một phương thức static.

Nếu đó là một phương thức non-static, trước tiên Máy ảo Java tạo một đối tượng sau đó gọi phương thức main() sẽ dẫn đến vấn đề cấp phát thêm bộ nhớ.

3. Java static block

Java static block:

  • Được sử dụng để khởi tạo static data member.
  • Nó được thực thi trước phương thức static tại thời điểm class loading.

3.1. Ví dụ về static block trong Java

Để hiểu hơn về static block chúng ta hãy xem ví dụ sau:

class A2{
  static{
    System.out.println("static block được gọi");
  }  
  
  public static void main(String args[]){
    System.out.println("Hello main");
  }
}

Kết quả:

static block được gọi
Hello main

3.3. Có thể thực thi một chương trình mà không có phương thức main() không?

Không.

Một trong những cách làm như vậy là sử dụng static block, nhưng chỉ có thể cho đến JDK 1.6. Kể từ JDK 1.7, không thể thực thi một class java mà không có phương thức main.

Bạn thử chạy thì biết:

class A3{  
  static{
    System.out.println("static block được gọi");  
    System.exit(0);  
  }  
}

Kết quả nếu chạy từ phiên bản JDK 1.6 trở về trước:

static block được gọi

Nhưng kể từ phiên bản JDK 1.7 trở đi thì:

Error: Main method not found in class A3, please define the main method as:
   public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

Bạn đã hiểu về từ khóa static trong Java chưa?

Như vậy là trong bài viết này bạn đã được tìm hiểu về từ khóa static, biến static, phương thức staticblock static trong Java.

Hãy thực hiện lại các ví dụ để thực sự hiểu về static trong Java nhé.

>> Nếu muốn học Java từ cơ bản đến nâng cao về Web thì hãy tham khảo ngay Khóa học Java Fullstack: https://niithanoi.edu.vn/khoa-hoc-java-fullstack.html

Chúc bạn học tốt!

JavaDEV