1. Phương thức tĩnh

Ngoài các biến tĩnh, các lớp cũng có thể có các phương thức tĩnh.

Các phương thức thông thường được liên kết với các đối tượng (thể hiện) của một lớp và có thể tham chiếu đến các biến thông thường (không tĩnh) của lớp (cũng như các biến và phương thức tĩnh ). Các phương thức tĩnh được liên kết với đối tượng tĩnh của lớp và chỉ có thể truy cập các biến tĩnh và/hoặc các phương thức tĩnh khác của lớp.

Để gọi một phương thức thông thường (không tĩnh) trên một lớp, trước tiên bạn phải tạo một đối tượng của lớp và sau đó gọi phương thức trên đối tượng. Bạn không thể gọi một phương thức bình thường trên lớp chứ không phải một đối tượng.

Ví dụ:

Bạn không thể gọi một phương thức không tĩnh trên một lớp!
public class DataInfo
{
   public int getValue()
   {
      return 100;
   }
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.getValue()); // This will generate an error!
   }
}

Nhưng để gọi một phương thức tĩnh, chỉ cần tồn tại đối tượng tĩnh của lớp là đủ (và nó luôn tồn tại sau khi lớp được nạp vào bộ nhớ). Đây là lý do tại sao phương thức main() là tĩnh. Nó được liên kết với đối tượng tĩnh của lớp, vì vậy bạn không cần tạo bất kỳ đối tượng nào để gọi nó.

Để khai báo một phương thức tĩnh, bạn cần viết từ khóa tĩnh trước tiêu đề phương thức. Hình thức chung của cấu trúc này như sau:

static Type name(parameters)
{
   method code
}

Ví dụ:

Mã số Ghi chú
public class Solution
{
   public static void main(String args[])
   {
      test();
   }

   public static void test()
   {
      int d = 2/0;
   }
}


Máy Java gọi mainphương thức bằng một lệnh như sau: Solution.main();



Phương thức tĩnh test()được gọi trong main()phương thức tĩnh.

Để gọi một phương thức tĩnh từ một lớp khác, bạn cần chỉ định tên lớp trước tên của phương thức tĩnh. Hình thức chung của cấu trúc này như sau:

Type name = ClassName.methodName(arguments)

Ví dụ:

Mã số phương pháp tĩnh
int x = Math.min(a, b);
int min(int a, int b)
Thread.sleep(200);
void sleep(long ms)
Path path = Path.of("c:\\readme.txt");
Path of(String str)


2. Phương thức tĩnh và thông thường (không tĩnh)

Sự khác biệt giữa các phương pháp tĩnh và phương pháp thông thường là gì?

Một phương thức thông thường được liên kết với một đối tượng thông thường (một thể hiện của một lớp), trong khi một phương thức tĩnh thì không. Một phương thức thông thường có thể truy cập các biến trong thể hiện của nó, nhưng một phương thức tĩnh thì không thể: đơn giản là nó không có một thể hiện được liên kết.

Sự khác biệt giữa hai loại phương pháp được thể hiện trong bảng sau:

Khả năng/tài sản phương pháp thông thường phương pháp tĩnh
Bị ràng buộc với một thể hiện của lớp Đúng KHÔNG
Có thể gọi các phương thức thông thường của lớp Đúng KHÔNG
Có thể gọi các phương thức tĩnh của lớp Đúng Đúng
Có thể truy cập các biến thông thường của lớp Đúng KHÔNG
Có thể truy cập các biến tĩnh của lớp Đúng Đúng
Có thể được gọi trên một đối tượng Đúng Đúng
Có thể được gọi trên lớp KHÔNG Đúng

Tại sao các phương pháp như vậy cần thiết nếu chúng bị hạn chế nghiêm trọng? Câu trả lời là cách tiếp cận này cũng có những ưu điểm của nó.

Đầu tiên, bạn không cần chuyển bất kỳ tham chiếu đối tượng nào để truy cập các phương thức và biến tĩnh.

Thứ hai, đôi khi bạn cần có một thể hiện duy nhất của một biến. Ví dụ: System.out( biến tĩnh ngoài của lớp Hệ thống ).

Và, thứ ba, đôi khi bạn cần gọi một phương thức trước khi có thể tạo các đối tượng. Ví dụ, máy Java gọi phương thức main() để bắt đầu thực thi chương trình ngay cả trước khi một thể hiện của lớp được tạo.

Bị ràng buộc với một thể hiện của lớp

Khi một phương thức thông thường được gọi, một đối số — đối tượng mà phương thức đó được gọi — được truyền ngầm cho nó. Tham số này được gọi là this. Tham số ẩn này (một tham chiếu đến đối tượng mà phương thức được gọi) phân biệt các phương thức thông thường với các phương thức tĩnh.

Các phương thức tĩnh không có tham số ẩn này, vì vậy bạn không thể sử dụng thistừ khóa bên trong các phương thức tĩnh và bạn không thể gọi một phương thức không tĩnh bên trong một phương thức tĩnh. Đơn giản là không có nơi nào để tham chiếu đến một thể hiện của một lớp.

Có thể gọi các phương thức thông thường của lớp

Một phương thức thông thường luôn có thistham số ẩn, vì vậy bạn luôn có một tham chiếu đến đối tượng mà phương thức đó được gọi. Bất cứ khi nào bạn gọi một phương thức thông thường bên trong một phương thức thông thường khác, thistham số ẩn được sử dụng để thực hiện cuộc gọi đó. Ví dụ

Mã số Làm thế nào nó hoạt động
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = min(a, b);
   return min(t, c);
}
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = this.min(a, b);
   return this.min(t, c);
}

Đó là lý do tại sao bạn không thể gọi một phương thức thông thường từ một phương thức tĩnh. Đơn giản là không có biến ngầm định nào được đặt tên thisbên trong một phương thức tĩnh.

Hoặc tưởng tượng một tình huống khác: không một đối tượng nào của lớp chúng ta chưa được tạo trong chương trình của chúng ta. Chúng ta có thể gọi một phương thức tĩnh của lớp chúng ta không? Đúng. Và phương thức tĩnh này có thể gọi một phương thức thông thường (không tĩnh) không?

Chà, chúng ta sẽ gọi nó trên đối tượng nào? Rốt cuộc, không có một thể hiện nào của lớp chúng ta tồn tại!

Có thể gọi các phương thức tĩnh của lớp

Các phương thức tĩnh có thể được gọi từ bất kỳ đâu — từ bất kỳ vị trí nào trong chương trình. Điều này có nghĩa là chúng có thể được gọi từ cả phương thức tĩnh và phương thức thông thường. Không có hạn chế ở đây.

Có thể truy cập các biến thông thường của lớp

Bạn có thể truy cập các biến thông thường của một lớp từ một phương thức thông thường, vì nó có thể dễ dàng lấy tham chiếu đến một thể hiện của lớp thông qua tham số ẩn this.

Một phương thức tĩnh không biết nó nên sử dụng phiên bản nào của lớp để lấy giá trị của các biến thông thường. Và tổng quát hơn, chúng ta có thể dễ dàng gặp phải tình huống khi một phương thức tĩnh được gọi nhưng chưa có một thể hiện nào của lớp được tạo trong chương trình.

Kết quả là các phương thức tĩnh không thể truy cập các biến thông thường của một lớp.

Giả sử một phương thức tĩnh gọi một phương thức bình thường. Đối tượng nào nên gọi phương thức thông thường đó?

phương pháp tĩnh

Không ai biết! Đó là lý do tại sao bạn không thể gọi một phương thức thông thường từ một phương thức tĩnh mà không chuyển tham chiếu đến một đối tượng!

Có thể truy cập các biến tĩnh của lớp

Tình huống với các cuộc gọi đến các biến tĩnh cũng giống như các cuộc gọi đến các phương thức tĩnh. Các biến tĩnh có thể được truy cập từ bất kỳ đâu trong chương trình. Điều đó có nghĩa là bạn có thể truy cập chúng từ các phương thức tĩnh và thông thường.

Có thể được gọi trên một đối tượng

Cả hai phương thức tĩnh và thông thường đều có thể được gọi trên một đối tượng. Có thể gọi một phương thức thông thường - thực sự, đó là cách duy nhất để gọi một phương thức thông thường. Một phương thức tĩnh cũng có thể được gọi trên một đối tượng: trong trường hợp này, trình biên dịch tự xác định loại biến và gọi phương thức tĩnh dựa trên loại của nó:

Mã số Trình biên dịch nhìn thấy nó như thế nào
Thread th = Thread.current();
th.sleep(1000);
Thread th = Thread.current();
Thread.sleep(1000);
Integer i = 1;
int x = i.parseInt("12");
Integer i = 1;
int x = Integer.parseInt("12");
"".valueOf(12);
String.valueOf(12);

Có thể được gọi trên lớp

Bạn chỉ có thể gọi một phương thức tĩnh trên một lớp. Để gọi một phương thức thông thường, bạn cần tham chiếu đến một thể hiện của lớp. Do đó, bạn không thể gọi một phương thức thông thường bằng cách sử dụng cấu trúc này:ClassName.methodName(arguments)