Java static keyword

Từ khóa static trong java được sử dụng chủ yếu cho vấn đề quản lý bộ nhớ. Chúng ta có thể sử dụng từ khóa static với các biến(variables), phương thức(methods), khối lệnh(blocks) và các lớp lồng nhau(nested class). Từ khóa static thuộc về lớp(class) thay vì thể hiện của lớp đó(class instance).

1. Biến static

  • Biến static có thể được sử dụng để tham chiếu thuộc tính chung của tất cả các đối tượng (không phải là duy nhất cho mỗi đối tượng)
  • Biến tĩnh chỉ sử dụng bộ nhớ một lần vào thời điểm tải lớp.

Lợi ích của biến static là nó làm cho bộ nhớ chương trình của bạn hiệu quả hơn (vd: tiết kiệm bộ nhớ).

Hãy cùng xem xét vấn đề khi chúng ta không sử dụng biến static

class Student{  
     int rollno;  
     String name;  
     String college="ITS";  
}  

Giả sử rằng có 1000 sinh viên trong trường đại học, vậy tất cả các biến(rollno, name, college) sẽ sử dụng bộ nhớ 1 lần khi đối tượng của lớp Student được tạo. Đối với mỗi sinh viên thì rollno là duy nhất và name thì sẽ có thể giống hoặc khác nhau, vì vậy khai báo biến như trên là ổn. Tuy nhiên khi xét về college thì ta sẽ thấy rằng đây là thuộc tính chung của tất cả các đối tượng sinh viên, nếu chúng ta thiết lập nó là biến static thì nó sẽ chỉ chiếm bộ nhớ 1 lần.

Ví dụ về biến static

class Student8{  
   int rollno;  
   String name;  
   static String college ="ITS";  
     
   Student8(int r,String n){  
   rollno = r;  
   name = n;  
   }  
 void display (){System.out.println(rollno+" "+name+" "+college);}  
  
 public static void main(String args[]){  
 Student8 s1 = new Student8(111,"Karan");  
 Student8 s2 = new Student8(222,"Aryan");  
   
 s1.display();  
 s2.display();  
 }  
}  

111 Karan ITS 222 Aryan ITS

Hình minh họa cho ví dụ sử dụng biến static

Xét thêm 1 ví dụ về bộ đếm khi không sử dụng biến static

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

class Counter{  
int count=0;//will get memory when instance is created  
  
Counter(){  
count++;  
System.out.println(count);  
}  
  
public static void main(String args[]){  
  
Counter c1=new Counter();  
Counter c2=new Counter();  
Counter c3=new Counter();  
  
 }  
}  

Output:1 1 1

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

class Counter2{  
static int count=0;//will get memory only once and retain its value  
  
Counter2(){  
count++;  
System.out.println(count);  
}  
  
public static void main(String args[]){  
  
Counter2 c1=new Counter2();  
Counter2 c2=new Counter2();  
Counter2 c3=new Counter2();  
  
 }  
}  

Output:1 2 3

2. Phương thức static

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

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

class Student9{  
     int rollno;  
     String name;  
     static String college = "ITS";  
       
     static void change(){  
     college = "BBDIT";  
     }  
  
     Student9(int r, String n){  
     rollno = r;  
     name = n;  
     }  
  
     void display (){System.out.println(rollno+" "+name+" "+college);}  
  
    public static void main(String args[]){  
    Student9.change();  
  
    Student9 s1 = new Student9 (111,"Karan");  
    Student9 s2 = new Student9 (222,"Aryan");  
    Student9 s3 = new Student9 (333,"Sonoo");  
  
    s1.display();  
    s2.display();  
    s3.display();  
    }  
}  

Output:111 Karan BBDIT 222 Aryan BBDIT 333 Sonoo BBDIT

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

Output:125

Hạn chế đối với phương thức static

  • Phương thức static không thể sử dụng trực tiếp các biến và phương thức không được thiết lập là static.
  • Từ khóa this và super không thể được sử dụng trong ngữ cảnh phương thức được thiết lập là static.
class A{  
 int a=40;//non static  
   
 public static void main(String args[]){  
  System.out.println(a);  
 }  
}   

Output:Compile Time Error

3. Khối lệnh static

  • Được sử dụng để khởi tạo cho các biến static
  • Được thực thi trước phương thức main ở thời điểm classloading.
class A2{  
  static{System.out.println("static block is invoked");}  
  public static void main(String args[]){  
   System.out.println("Hello main");  
  }  
}  

Output:static block is invoked Hello main

Thành phần static là rất cơ bản trong Java, tuy nhiên đối với các bạn mới tiếp xúc với java có thể sẽ hơi khó hình dung về nó. Hy vọng qua bài viết này phần nào giúp ích được cho các bạn 😃.

All Rights Reserved