Tìm hiểu từ khóa Static trong Java. (Java Static Keyword.)

Bài viết này chúng ta sẽ tìm hiểu về từ khóa Static trong Java, ở Việt Nam chúng ta thường dùng biến Static (biến tĩnh) hoặc hàm Static (hàm tĩnh hoặc phương thức tĩnh) để nói về từ khóa Static này, tuy nhiên chúng chỉ là thành viên của từ khóa Static thôi (Static Keyword).


Từ khóa Static trong Java công dụng chính là để quản trị bộ nhớ, nếu bạn nào từ biết qua về Static thì có thể nhận thấy điều này qua việc biến static (static variable) được lưu trữ cố định tại một vùng nhớ nào đó trên RAM máy tính. Chúng ta có thể sử dụng từ khóa static trên variable (biến), method (phương thức), block (khối), nested class (lớp lồng nhau). Một điều cần lưu ý là từ khó static thuộc về lớp chú không thuộc về các đối tượng được tạo ra từ lớp trong tiếng anh nó dùng câu "The static keyword belongs to the class than instance of the class." Bây giờ ta tìm hiểu sơ qua về một số đặc điểm của Static Variable và Static Method.

Một Số Đặc Điểm Của Static Variable (Biến tĩnh):

  • Chỉ phụ thuộc và lớp mà không phụ thuộc vào đối tượng
  • Biến static chỉ khởi tạo một lần khi chương trình bắt đầu thực thi
  • Biến static có thể truy cập trực tiếp bằng tên class mà không cần bất kỳ đối tượng nào.
    • Cú pháp: Tên_class.Tên_biến _static

Một Số Đặc Điểm Của Static Method (phương thức tĩnh):

  • Chỉ phụ thuộc và lớp mà không phụ thuộc vào đối tượng
  • Chỉ phụ thuộc và lớp mà không phụ thuộc vào đối tượng
  • Phương thức static chỉ có thể truy cập vào các thành phần static mà không thể truy cập vào các thành phần không static
  • Phương thức static có thể truy cập trực tiếp bằng tên class mà không cần bất kỳ đối tượng nào.
    • Cú pháp: Tên_lớp.Tên_phương_thức_static

Vì sao? khi nào? chúng ta cần sử dụng Static Keyword (ví dụ cụ thể):

Để giải thích vì sao chúng ta cần dùng Static Keyword (mình dùng theo tiếng anh cho chuẩn :)) thì chúng ta cần quay lại với CLASS, như chúng ta đã biết khi tạo một CLASS thì trên thực tế CLASS chưa được khởi tạo nếu ta chưa khởi tạo bất kỳ một đối tượng thuộc lớp này, và khi ta tạo một Object thì cácVariable hoặc Method là của Object chứ không phải của Class.

Để giải thích cho điều trên ta thấy rằng khi ta muốn sử dụng một biến được khai báo trong CLASS là điều hoàn không thể, mà bắt buộc phải thông qua thông qua một Object được tạo từ CLASS, lấy ví dụ thể này ta có CLASS là BOOK trong đó ta có NAME là một biến thuộc class như sau:
package test;
/**
 * @author bnson
 * @webiste vnlives.net
 */
public class Book {

    public String name;

    public Book() {
       
    }   
}

Và giả dụ trong CLASS MAIN JAVA của chương trình gọi là TEST khi ta dùng lớp CLASS BOOK để lấy biến name theo cú pháp giống bên dưới:
Book.name (error)

Và tất nhiên là ta không thể lấy được, muốn lấy được variable name ta phải khai báo một Object và lấy biến name thông qua nó.
Book book1 = new Book();
book1.name = "ABC" (correct).

Tuy nhiên lúc này ta hiểu rằng variable name là của book1 chứ không phải của CLASS Book. Vây câu hỏi đặt ra là khi ta cần một variable (biến), hay một Method (phương thức) mà chúng chỉ thuộc về class để cho toàn bộ các Object (đối tượng) được tạo ra đều phải có, ta phải làm như thế nào? Câu trả lời là dùng Static Keyword cho Variable và Method.

Ta lại đặt tiếp câu hỏi làm vậy để làm cái quái gì? ta có thể dùng Object để làm điều đó mờ? Câu trả lời là để tiết kiệm bộ nhớ như trong định nghĩa về Static đã trình bày ở trên. Mình sẽ lấy ví dụ về Variable Static để minh họa vấn đề này.

Như ở trên mình đã có một CLASS BOOK, và mình cần thêm thông tin về tên của CLASS để khi mình kiểm tra OBJECT thuộc CLASS nào giữa một đống OBJECT và đống CLASS mình đã tạo ví như CLASS CAR, CLASS PERSON, CLASS ANIMAL,...

Giả sử mình làm theo cách cũ tạo thêm một variable tên nameClass để lưu thông tin tên của CLASS BOOK như sau:
package test;
/**
 * @author bnson
 * @webiste vnlives.net
 */
public class Book {

    public String nameClass = "Book";
    public String name;

    public Book() {
      
    }
  
    public String getNameClass() {
        return nameClass;
    }
  
}

Nhưng điều này đồng nghĩa với việc khi bạn tạo ra 100 Object thì tương với 100 biến nameClass được tạo ra, và điều này thật sự không tốt cho bộ nhớ chút nào, trong khi ta biết chắc rằng dù tạo ra một 100 hay 1.000 Object từ CLASS BOOK thì tên nameClass của nó chỉ có 1 là "BOOK".

Để giải quyết trường hợp này thì Java đã cung cấp cho chúng ta từ khóa STATIC và ta chỉ viết thế từ PUBLIC thành STATIC trong ví dụ trên là được, các mà nó thực hiện là cung cấp cho variable namClass của CLASS BOOK một vùng nhớ cố định (local) trên Heap, bạn có thể xem hình minh họa dưới để để hiểu hơn về cách mà static keyword được xử lý trên vùng nhớ.


Như bạn thấy trong vùng trên các Object sử dụng biến author của CLASS trên một vùng nhớ duy nhất, điều này giúp bạn tối ưu hóa vùng nhớ của máy tính, tương tự với trường hợp của STATIC METHOD cũng vậy. Thông qua ví dụ ta nắm được tại sao lại cần dùng STATIC và khi nào nên dùng STATIC.



Writer: +Bui Ngoc Son












No comments:

Post a Comment