Chuyển đến nội dung chính

static trong Java

Biến và hàm class hay còn gọi là static được sử dụng chung cho mọi đối tượng tạo từ class đó.
Khi bạn khai báo một biến là static, thì biến đó được gọi là biến tĩnh, hay 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ả đối tượng (mà không là duy nhất cho mỗi đối tượng), ví dụ như tên công ty của nhân viên, tên trường học của các sinh viên, …

Tìm hiểu vấn đề xảy ra khi không có biến static

class Student{  
     int rollno;  
     String name;  
     String college="BachKhoa";  
}  
Giả sử có 500 sinh viên trong trường đại học, bây giờ instance của các thành viên dữ liệu sẽ lấy bộ nhớ mỗi khi đối tượng được tạo. Tất cả sinh viên có rollno và name duy nhất vì thế instance của thành viên dữ liệu là tốt. Ở đây, college là thuộc tính chung của tất cả đối tượng. Nếu chúng ta tạo nó là static, thì trường này sẽ chỉ lấy bộ nhớ một lần.
Ghi chú: Thuộc tính static trong Java được chia sẻ tới tất cả đối tượng.

Phương thức static trong Java

Nếu bạn áp dụng từ khóa static với bất cứ phương thức nào, thì phương thức đó được gọi là phương thức static.
  • Một phương thức static thuộc lớp chứ không phải đối tượng của lớp.
  • Một phương thức static có thể được triệu hồi mà không cần tạo một instance của một lớp.
  • Phương thức static có thể truy cập thành viên dữ liệu static và có thể thay đổi giá trị của nó.
Một số hạn chế cho phương thức static
  • Có hai hạn chế chính cho phương thức static. Đó là:
    • Phương thức static không thể sử dụng thành viên dữ liệu non-static hoặc gọi trực tiếp phương thức non-static.
    • Từ khóa this và super không thể được sử dụng trong ngữ cảnh static.
    class A{  
     int a=40;//non static  
       
     public static void main(String args[]){  
      System.out.println(a);  
     }  
    }        
    Chạy chương trình trên sẽ cho kết quả là Compile Time Error.
    Câu hỏi: Tại sao phương thức main trong Java là static?
    Bởi vì đối tượng là không cần thiết để gọi phương thức static nếu nó là phương thức non-static, JVM đầu tiên tạo đối tượng và sau đó gọi phương thức main() mà có thể gây ra vấn đề về cấp phát bộ nhớ bộ nhớ phụ.

Hàm và biến Static trong Java

Hôm nay mình sẽ hướng dẫn các bạn cách sử dụng từ khóa static trong Java. Trong Java từ khóa static có thể dùng cho biến hoặc phương thức, vì thế mình sẽ trình bày 2 mục là biến static và phương thức static.

1. Biến Static

  • 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

Ví dụ bổ sung về static

Khi bạn new nhiều đối tượng A thì biến static trong các đối tượng A có giá trị giống nhau. Trong khi biến non static bị trả về 0 mỗi khi new đối tượng mới.

Ví dụ:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class StaticSample {
    public static int count = 0;
    public int a = 0;
    public StaticSample() {
        count++;
        a++;
    }
    public static void main(String[] args) {
        StaticSample aClass = new StaticSample();
        StaticSample bClass = new StaticSample();
        // Đếm số đối tượng đã được tạo (biến static ko bị gán lại)
        System.out.println(StaticSample.count);
        // Các Biến non static bị gán lại ứng với mỗi đối tượng
        System.out.println(aClass.getA());
        System.out.println(bClass.getA());
    }
    public int getA() {
        return a;
    }
}


Kết quả:

1
2
3
4
2
1
1


2. Đặc điểm của hàm Static

  • 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


Hàm static trong Java

Hàm static được sử dụng khi cần có một lớp tiện ích dùng chung (Util) trong chương trình. Việc tạo một lớp Util rồi trực tiếp tham chiếu đến hàm cần dùng thông qua class làm cho thiết kế tốt hơn so với việc phải khởi tạo một đối tượng rồi dùng hàm tham chiếu từ đối tượng đó. Vì đôi khi việc khởi tạo đối tượng lại tốn chi phí lớn, ảnh hưởng tới performance.

Tóm lại

Theo kinh nghiệm của mình thì biến static chỉ là một biến không phụ thuộc vào một đối tượng nào cả, tức là mình có thể truy vấn trực tiếp mà không cần phải khời tạo đối tượng(biến mức Class).

VD: Mình có một class tên là A trong class A có một biến static tên là abc=10;

Khi mình gọi biến này mình bằng cách: A obj = new A(); và truy vấn đến biến đó bằng cách thông thường làobj.abc. Điều đó là dư thừa, mà thay vì vậy mình có thể truy vấn một cách trực tiếp mà không cần khởi tạo đối tượngnhư mình đã đề cập, bạn có thể truy vấn trực tiếp tới biến đó bằng cách A.abc.

Tương tự cho hàm static, mình cũng chỉ cần gọi <tên lớp>.<tên hàm>

Vậy cũng có thể dễ dàng đoán được rằng khi chạy ứng dụng thì thằng static đã được tạo ra mà không cần phải khởi tạo.

Nhận xét

Bài đăng phổ biến từ blog này

Entry Test của FPT

IQ - Kiểm tra tư duy logic (8/20) - GMAT- Kiểm tra khả năng tính toán trong thời gian ngắn (8/20) - Tiếng Anh (18-> 25/50) - Các bài thi chuyên môn - FE (8/20) IQ: lên mạng tìm "IQ test" là ra đầy. + GMAT: Những câu trắc nghiệm tính toán đơn giản kiểu như sau:  1 . Một shop thời trang sale off quần jeans 15 %, quần jeans giá 450 $, người mua đưa 500 $, hỏi cashier trả lại bao nhiêu $ tiền thừa.? 2 . 100 % là 180 , vậy 150 là bao nhiêu %? Tiếng anh: Cỡ như thi TOEIC thôi. Chuyên môn: Mobile thì trắc nghiệm Java. Qúa trình tuyển như sau :v Lần 1: Test IQ, Tiếng Anh( mình làm í ẹ khoảng 50% mà vẫn được) , Java Lân 2: được gọi điện lên :)) + Gioi thiệu bản thân + Họ chỉ hỏi các câu căn bản như: -. OOP: là gì, 4 tính chất, ví dụ, khác nhau giữa interface và abstract - CODE: hầu toàn các bài toán vòng for :)) , cẩn thận mấy câu kế thừa. SQL (distinct, view, function, cursor, store procedure, ...v.v.), nhớ có câu cộng 2 số int không dùng biến đệm hơi khoai haha + Nói ch...

Java: Java Package-Thư viện trong Java

Giới thiệu về Package Các bạn mới học lập trình Java thường không dể ý tới package vì các bạn toàn tạo file .java vào cùng 1 chỗ, không cần sắp xếp, không cần quản lý truy nhập. Nhưng để tăng kỹ năng lập trình với Java, các bạn cần phải tìm hiểu về package trong Java. Các bạn có thể tham khảo định nghĩa sau: Package được dùng để đóng gói các lớp trong chương trình lại với nhau thành một khối. Đây là cách tốt nhất để lưu trữ các lớp gần giống nhau hoặc có cùng một module thành một khối thống nhất – để đáp ứng 1 khối chức năng. Từ đây mình sẽ giới thiệu thêm với các bạn các câu lệnh nhâp khẩu,nó có định dạng như sau : Định dạng :  import javaPackageNameImport;    Nó giống như khai báo thư viện ở các ngôn ngữ lập trình khác.Như vậy,chỉ khi các bạn nhập khẩu chúng,các bạn mới có thể sử dụng thư viện mà chúng cung cấp cho ta. VD :    import java.util.Date;   import java.text.SimpleDateFormat; Lưu ý : -Các câu lệnh nhập khẩu rất nhiều và...

Khác nhau giữa Array và ArrayList và HashMap

Collection bản chất là tập các lớp dùng để lưu trữ danh sách và có khả năng tự co giãn khi danh sách thay đổi : Thêm , sửa , xóa , chèn … Hai lớp Collection thường được sử dụng nhiều nhất là ArrayList và Hashmap Giới thiệu về ArrayList ArrayList sử dụng cấu trúc mảng để lưu trữ phần tử , tuy nhiên có hai đặc điểm khác mảng : Không cần khai báo trước kiểu phần tử . Không cần xác định trước số lượng phần tử ( kích thước mảng ). N ó có kh ả năng truy c ậ p ph ầ n t ử ng ẫ u nhiên (Do th ừ a k ế t ừ interface RandomAccess ). P hương thức khởi tạo ● ArrayList () ● ArrayList (Collection c) ● ArrayList ( int initialCapactity ) Các phương thức chính ● add(Object o) ● remove(Object o) ● get( int index) ● size() ● isEmpty () ● contains(Object o) ● clear() Giới thiệu về HashMap ● Là ki ể u t ậ p h ợ p t ừ đ i ể n, HashMap cho phép truy xu ấ t tr ự c ti ế p t ớ i m ộ ...