Java: khi nào nên sử dụng các phương thức tĩnh


911

Tôi đang tự hỏi khi sử dụng phương pháp tĩnh? Nói rằng nếu tôi có một lớp với một vài getters và setters, một hoặc hai phương thức và tôi muốn các phương thức đó chỉ là bất khả xâm phạm trên một đối tượng thể hiện của lớp. Điều này có nghĩa là tôi nên sử dụng một phương thức tĩnh?

ví dụ

Obj x = new Obj();
x.someMethod

hoặc là

Obj.someMethod

(đây có phải là cách tĩnh không?)

Tôi khá bối rối!

Câu trả lời:


1458

Một nguyên tắc nhỏ: hãy tự hỏi mình "Có hợp lý không khi gọi phương thức này, ngay cả khi chưa có đối tượng nào được xây dựng?" Nếu vậy, nó chắc chắn nên tĩnh.

Vì vậy, trong một lớp Carbạn có thể có một phương thức:

double convertMpgToKpl(double mpg)

... đó sẽ là tĩnh, bởi vì người ta có thể muốn biết 35mpg chuyển đổi thành gì, ngay cả khi chưa có ai từng xây dựng Car. Nhưng phương pháp này (thiết lập hiệu quả của một cụ thể Car):

void setMileage(double mpg)

... không thể tĩnh vì không thể gọi phương thức trước khi bất kỳ phương thức nào Carđược xây dựng.

(Nhân tiện, điều ngược lại không phải lúc nào cũng đúng: đôi khi bạn có thể có một phương thức liên quan đến hai Carđối tượng và vẫn muốn nó ở trạng thái tĩnh. Ví dụ:

Car theMoreEfficientOf( Car c1, Car c2 )

Mặc dù điều này có thể được chuyển đổi thành phiên bản không tĩnh, nhưng một số người sẽ cho rằng vì không có lựa chọn "đặc quyền" nào Carquan trọng hơn, bạn không nên buộc người gọi chọn một Carđối tượng làm đối tượng bạn sẽ gọi phương pháp trên. Tuy nhiên, tình huống này chiếm một phần khá nhỏ trong tất cả các phương thức tĩnh.)


325
Một vài ví dụ tốt ở đây. Tuy nhiên, tôi sẽ thêm rằng "tĩnh" thường có giá trị khi bạn biết điều gì đó sẽ không thay đổi giữa các trường hợp. Nếu đây là trường hợp, tôi thực sự sẽ xem xét "Nguyên tắc trách nhiệm duy nhất", ngụ ý một lớp nên có một khả năng đáp ứng và do đó chỉ có một lý do để thay đổi. Tôi cảm thấy nên cân nhắc việc chuyển chức năng "ConvertMpgToKpl (double mpg)" và các phương thức tương tự sang lớp của riêng họ. Mục đích của một đối tượng xe hơi là cho phép khởi tạo xe ô tô, không cung cấp sự so sánh giữa chúng. Những người nên được bên ngoài lớp học.
Zack Jannsen

34
Tôi nghĩ rằng tôi muốn thay vì phương pháp Car#isMoreEfficientThan(Car). Nó có lợi thế là chiếc xe bạn trở lại trong một chiếc cà vạt không phải là tùy ý. Rõ ràng bởi tiêu đề của phương thức những gì được trả lại trong một tie.
Cruncher

5
Tôi cũng sẽ cẩn thận về việc tạo một phương thức tĩnh đang sử dụng một số tài nguyên bên ngoài (hệ thống tệp, cơ sở dữ liệu, v.v.) loại tĩnh này có thể khiến cho việc kiểm tra các phương thức tiêu thụ trở nên khủng khiếp. Cá nhân tôi cố gắng giữ số liệu thống kê trong lĩnh vực "tiện ích".
Seth M.

7
Trong thực tế, nó nên được thực hiện như là một so sánh .
Dogweather

3
@ B1KMusic Tất nhiên rồi. Ý tôi là "chiếc xe nào được trả lại trong cà vạt" là "bản đồ thật cho chiếc xe được gọi và bản đồ giả cho chiếc xe đã qua". Nó không có sự mơ hồ.
Cruncher

538

Chỉ xác định các phương thức tĩnh trong các trường hợp sau:

  1. Nếu bạn đang viết các lớp tiện ích và chúng không được thay đổi.
  2. Nếu phương thức không sử dụng bất kỳ biến thể hiện nào.
  3. Nếu bất kỳ hoạt động không phụ thuộc vào việc tạo cá thể.
  4. Nếu có một số mã có thể dễ dàng được chia sẻ bởi tất cả các phương thức cá thể, hãy trích xuất mã đó thành một phương thức tĩnh.
  5. Nếu bạn chắc chắn rằng định nghĩa của phương thức sẽ không bao giờ bị thay đổi hoặc ghi đè. Vì các phương thức tĩnh không thể bị ghi đè.

45
điểm tốt, nhưng chúng là những yêu cầu nếu bạn muốn làm cho một phương thức tĩnh, không phải là lý do để tạo một phương thức.
tetsuo

4
@Mohd về yêu cầu 5: Khi nào bạn có thể chắc chắn 100% một phương thức sẽ không bao giờ bị thay đổi hoặc ghi đè? Không phải lúc nào cũng có những yếu tố không xác định mà bạn không thể tính đến tại thời điểm bạn viết phương thức tĩnh?
PixelPlex

8
"Các lớp tiện ích" rất khó để lý do, điều tồi tệ là sớm muộn gì mọi thứ cũng bắt đầu "trông giống như" một tiện ích (vâng tôi đang đề cập đến gói "tiện dụng" bị cồng kềnh, không thể chạm tới và được kiểm tra kém), và các trường hợp thử nghiệm của bạn sẽ cần nhiều công việc hơn (để giả định các tiện ích tĩnh là CỨNG). Ưu tiên đối tượng trước.
Sergio

2
@Mohd câu trả lời này chính xác là những gì tôi đang tìm kiếm. Tôi đã phải đối mặt với rất nhiều vấn đề khi sử dụng các phương thức tĩnh trong đa luồng. Bạn có thể vui lòng giải thích thêm 2, 3 điểm nữa không (ví dụ 100 ngón tay cái cho bạn)
Prakash Pandey

Tôi nghĩ rằng một "lớp tĩnh" nên được phát minh nếu bạn định sử dụng các biến và phương thức tĩnh.
Robert Rocha

182

Có một số lý do hợp lệ để sử dụng các phương thức tĩnh:

  • Hiệu suất : nếu bạn muốn một số mã được chạy và không muốn khởi tạo một đối tượng bổ sung để làm như vậy, hãy chuyển nó thành một phương thức tĩnh. JVM cũng có thể tối ưu hóa các phương thức tĩnh rất nhiều (Tôi nghĩ rằng tôi đã từng đọc James Gosling tuyên bố rằng bạn không cần hướng dẫn tùy chỉnh trong JVM, vì các phương thức tĩnh sẽ nhanh như vậy, nhưng không thể tìm thấy nguồn - do đó nó có thể hoàn toàn sai). Vâng, đó là tối ưu hóa vi mô, và có lẽ không cần thiết. Và chúng tôi lập trình viên không bao giờ làm những việc không cần thiết chỉ vì chúng mát mẻ, phải không?

  • Tính thực tiễn : thay vì gọi điện new Util().method(arg), gọi điện Util.method(arg)hoặc method(arg)nhập khẩu tĩnh. Dễ dàng hơn, ngắn hơn.

  • Thêm các phương thức : bạn thực sự muốn Chuỗi lớp có một removeSpecialChars()phương thức cá thể, nhưng nó không có ở đó (và nó không nên, vì các ký tự đặc biệt của dự án của bạn có thể khác với các dự án khác) và bạn không thể thêm nó (vì Java là hơi lành mạnh), vì vậy bạn tạo một lớp tiện ích và gọi removeSpecialChars(s)thay vì s.removeSpecialChars(). Ngọt.

  • Độ tinh khiết : thực hiện một số biện pháp phòng ngừa, phương thức tĩnh của bạn sẽ là một hàm thuần túy , nghĩa là, điều duy nhất nó phụ thuộc vào là các tham số của nó. Dữ liệu trong, dữ liệu ra. Điều này dễ đọc và gỡ lỗi hơn, vì bạn không phải lo lắng về quyền thừa kế. Bạn cũng có thể làm điều đó với các phương thức cá thể, nhưng trình biên dịch sẽ giúp bạn nhiều hơn một chút với các phương thức tĩnh (bằng cách không cho phép các tham chiếu đến các thuộc tính cá thể, các phương thức ghi đè, v.v.).

Bạn cũng sẽ phải tạo một phương thức tĩnh nếu bạn muốn tạo một singleton, nhưng ... không. Ý tôi là, hãy suy nghĩ kỹ.

Bây giờ, quan trọng hơn, tại sao bạn không muốn tạo một phương thức tĩnh? Về cơ bản, đa hình đi ra khỏi cửa sổ . Bạn sẽ không thể ghi đè phương thức, cũng không thể khai báo nó trong một giao diện (tiền Java 8) . Nó mất rất nhiều tính linh hoạt từ thiết kế của bạn. Ngoài ra, nếu bạn cần trạng thái , bạn sẽ gặp rất nhiều lỗi đồng thời và / hoặc tắc nghẽn nếu không cẩn thận.


1
Rất nhiều lý do tốt được liệt kê ở đây khi tĩnh có thể hữu ích. Một điều nữa tôi có thể nghĩ đến là việc viết bài kiểm tra đơn vị cho các phương pháp như vậy chỉ đơn giản
nilesh

@tetsuo Cảm ơn! Giải thích của bạn rất rõ ràng và những lý do được cung cấp rất hợp lý và có nhiều ý nghĩa.
Deniss M.

3
Và chúng tôi lập trình viên không bao giờ làm những việc không cần thiết chỉ vì chúng mát mẻ, phải không? +1
Scaramouche

Điều đó nói rằng một phương thức tĩnh trở thành một hàm đầy đủ có tên stackoverflow.com/questions/155609/
Kẻ

Tôi đồng ý với Hiệu suất và Thực tiễn, nhưng không phải là Độ tinh khiết. Phương thức tĩnh có thể sửa đổi các thành viên tĩnh của lớp (có thể là riêng tư). Điều này có thể hữu ích. Ví dụ: bạn có thể có một phương thức như "static sync int allocateID () {return idNext ++;}". Trong thực tế, một phương thức tĩnh có thể chỉ thuần túy hoặc không tinh khiết như một phương pháp không tĩnh về mặt tác dụng phụ.
Adam Gawne-Cain

42

Sau khi đọc các bài viết của Misko, tôi tin rằng các phương pháp tĩnh là xấu từ quan điểm thử nghiệm. Bạn nên có các nhà máy thay thế (có thể sử dụng một công cụ tiêm phụ thuộc như Guice ).

Làm thế nào để tôi đảm bảo rằng tôi chỉ có một trong những thứ đó

Chỉ có một trong những vấn đề của vấn đề làm thế nào để tôi đảm bảo rằng tôi chỉ có một trong những thứ gì đó được xếp bên lề. Bạn chỉ khởi tạo một ApplicationFactory duy nhất trong chính của mình và kết quả là bạn chỉ khởi tạo một thể hiện duy nhất của tất cả các singletons của bạn.

Vấn đề cơ bản với các phương thức tĩnh là chúng là mã thủ tục

Vấn đề cơ bản với các phương thức tĩnh là chúng là mã thủ tục. Tôi không có ý tưởng làm thế nào để kiểm tra mã thủ tục đơn vị. Kiểm thử đơn vị giả định rằng tôi có thể khởi tạo một phần ứng dụng của mình một cách cô lập. Trong thời gian khởi tạo, tôi kết nối các phụ thuộc bằng các giả / kết bạn thay thế các phụ thuộc thực sự. Với lập trình thủ tục, không có gì để "nối dây" vì không có đối tượng, mã và dữ liệu là riêng biệt.


20
Tôi không hiểu phần về việc không thể kiểm tra mã thủ tục đơn vị. Không phải bạn chỉ thiết lập các trường hợp kiểm tra ánh xạ đầu vào chính xác thành đầu ra chính xác bằng phương thức tĩnh cùng với lớp làm "đơn vị" của bạn?
tjb

2
Bạn có thể làm điều đó để kiểm tra các chức năng đó. Nhưng khi sử dụng các phương thức tĩnh này trong các lớp khác mà bạn muốn kiểm tra, tôi tin rằng bạn không thể giả mạo chúng (giả / kết bạn) hoặc bất cứ điều gì, vì bạn không thể khởi tạo một lớp.
Alfred

4
@Alfred: Vui lòng xem PowerMock có khả năng giả định các phương thức tĩnh. Sử dụng PowerMock, có một số trường hợp, nếu có, trong đó bạn tìm thấy các phụ thuộc phương thức không thể bị chế giễu.
Carles Sala

7
Bạn có thể đơn vị kiểm tra thống kê bằng PowerMock, tuy nhiên bạn sẽ sớm thấy mình hết không gian Permgen (đã hoàn thành việc đó, có áo phông) và vẫn còn khó chịu. Trừ khi bạn BIẾT (dựa trên ít nhất một thập kỷ kinh nghiệm của chính bạn bằng các ngôn ngữ OO thực sự, không di chuyển từ C) thì KHÔNG LÀM NÓ. Nghiêm túc mà nói, mã tồi tệ nhất tôi từng thấy xuất phát từ việc sử dụng thống kê của một nhà phát triển nhúng và trong hầu hết các trường hợp, chúng tôi đã bị mắc kẹt mãi mãi, và thêm nhiều mã chỉ khóa chúng tôi vào khối nguyên khối không thể thay đổi thậm chí chặt chẽ hơn. Khớp nối lỏng lẻo: không, có thể kiểm tra: hầu như không thể sửa đổi: KHÔNG BAO GIỜ. Tránh!
1016765

14
Tôi có thể hiểu được sự khó khăn của việc kiểm tra các phương thức tĩnh phụ thuộc vào trạng thái tĩnh. Nhưng khi bạn đang thử nghiệm các phương thức tĩnh không trạng thái như Math.abs()hoặc Arrays.sort(), thậm chí các phương thức bạn có thể chuyển tất cả các phụ thuộc vào , tôi không thấy điều đó sẽ cản trở thử nghiệm đơn vị như thế nào. Tôi muốn nói một quy tắc đơn giản là: nếu bạn có bất kỳ lý do nào để chế nhạo logic thủ tục, thì đừng đặt nó vào một phương thức tĩnh. Tôi chưa bao giờ có một lý do để chế nhạo Arrays.sort()hay Math.abs().
Andy

36

Một staticphương pháp là một loại phương pháp mà không cần bất kỳ đối tượng được khởi tạo cho nó được gọi. Bạn có nhận thấy staticđược sử dụng trong mainhàm trong Java không? Chương trình thực hiện bắt đầu từ đó mà không cần tạo đối tượng.

Hãy xem xét ví dụ sau:

 class Languages 
 {
     public static void main(String[] args) 
     {
         display();
     }

     static void display() 
     {
         System.out.println("Java is my favorite programming language.");
     }
  }

câu trả lời hay nhất thực sự
Yahya

20

Các phương thức tĩnh trong java thuộc về lớp (không phải là một thể hiện của nó). Họ không sử dụng biến đối tượng và thường sẽ lấy đầu vào từ các tham số, thực hiện các hành động trên nó, sau đó trả về một số kết quả. Các phương thức thể hiện được liên kết với các đối tượng và, như tên ngụ ý, có thể sử dụng các biến thể hiện.


12

Không, các phương thức tĩnh không liên quan đến một thể hiện; họ thuộc về lớp. Phương thức tĩnh là ví dụ thứ hai của bạn; phương thức cá thể là đầu tiên.


1
Bạn nên sử dụng các phương thức tĩnh nếu không cần các thao tác trạng thái của đối tượng.
MastAvalons

11

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

  1. Một phương thức tĩnh thuộc về lớp chứ không phải là đối tượng của một lớp.
  2. Một phương thức tĩnh được gọi mà không cần tạo một thể hiện của một lớp.
  3. phương thức tĩnh có thể truy cập thành viên dữ liệu tĩnh và có thể thay đổi giá trị của nó.
  4. Một phương thức tĩnh có thể được truy cập chỉ bằng cách sử dụng tên của một tên tĩnh của lớp. . . ví dụ: Student9.change ();
  5. Nếu bạn muốn sử dụng các trường không tĩnh của một lớp, bạn phải sử dụng một phương thức không tĩnh.

// Chương trình thay đổi thuộc tính chung của tất cả các đối tượng (trường tĩnh).

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,"Indian");  
Student9 s2 = new Student9 (222,"American");  
Student9 s3 = new Student9 (333,"China");  

s1.display();  
s2.display();  
s3.display();  
}  }

O / P: 111 BBDIT Ấn Độ 222 BBDIT Mỹ Trung Quốc BBDIT Trung Quốc


10

Các phương thức tĩnh không được liên kết với một thể hiện, vì vậy chúng không thể truy cập bất kỳ trường không tĩnh nào trong lớp.

Bạn sẽ sử dụng một phương thức tĩnh nếu phương thức đó không sử dụng bất kỳ trường nào (hoặc chỉ các trường tĩnh) của một lớp.

Nếu bất kỳ trường không tĩnh nào của một lớp được sử dụng, bạn phải sử dụng phương thức không tĩnh.


1
Câu trả lời rõ ràng, ngắn gọn và đơn giản.
Josi

8

Các phương thức tĩnh nên được gọi trên Class, các phương thức Instance nên được gọi trên Instances của Class. Nhưng điều đó có nghĩa gì trong thực tế? Đây là một ví dụ hữu ích:

Một lớp ô tô có thể có một phương thức thể hiện gọi là Gia tốc (). Bạn chỉ có thể Tăng tốc một chiếc xe, nếu chiếc xe thực sự tồn tại (đã được xây dựng) và do đó đây sẽ là một phương pháp ví dụ.

Một lớp xe hơi cũng có thể có một phương thức đếm được gọi là GetCarCount (). Điều này sẽ trả về tổng số xe được tạo ra (hoặc được xây dựng). Nếu không có ô tô nào được chế tạo, phương thức này sẽ trả về 0, nhưng nó vẫn có thể được gọi, và do đó nó sẽ phải là một phương thức tĩnh.


6

Trên thực tế, chúng tôi sử dụng các thuộc tính và phương thức tĩnh trong một lớp, khi chúng tôi muốn sử dụng một phần chương trình của chúng tôi sẽ tồn tại ở đó cho đến khi chương trình của chúng tôi chạy. Và chúng ta biết rằng, để thao tác các thuộc tính tĩnh, chúng ta cần các phương thức tĩnh vì chúng không phải là một phần của biến thể hiện. Và không có phương thức tĩnh, để thao tác các thuộc tính tĩnh là tốn thời gian.


Giữ trạng thái trong các biến tĩnh là một điều tồi tệ phải làm vì nhiều lý do - như an toàn đa luồng, gỡ lỗi, đóng gói dữ liệu..v.v vv Các phương thức tĩnh là ổn nếu chúng là các hàm thuần túy (chỉ hoạt động với params, mà không thay đổi chúng). Ví dụ tốt sẽ là một lớp tiện ích, để nói các phép tính toán.
Vladimir Demirev

5

Sử dụng một phương thức tĩnh khi bạn muốn có thể truy cập phương thức mà không cần một thể hiện của lớp.


29
Điều này không đưa ra bất kỳ lý do nào cho việc thiết kế chương trình.
adamjmarkham

4

Tĩnh: Obj.someMethod

Sử dụng statickhi bạn muốn cung cấp quyền truy cập cấp lớp cho một phương thức, tức là trong đó phương thức sẽ có thể gọi được mà không cần một thể hiện của lớp.


4

Các phương thức tĩnh không cần phải được gọi trên đối tượng và đó là khi bạn sử dụng nó. Ví dụ: Main () của bạn là tĩnh và bạn không tạo đối tượng để gọi nó.


1
Yay! Hãy nhìn nơi tôi đến trong khi googling câu hỏi noobie Java! Đó là một thế giới nhỏ :-)
Deepak

1
@Deepak thế giới nhỏ thực sự :)
Vaishak Suresh

4

Các phương thức và biến tĩnh được kiểm soát phiên bản của các hàm và biến 'Toàn cầu' trong Java. Trong đó các phương thức có thể được truy cập dưới dạng classname.methodName()hoặc classInstanceName.methodName(), tức là các phương thức tĩnh và các biến có thể được truy cập bằng tên lớp cũng như các thể hiện của lớp.

Lớp không thể được khai báo là tĩnh (vì nó vô nghĩa. Nếu một lớp được khai báo công khai, nó có thể được truy cập từ bất cứ đâu), các lớp bên trong có thể được khai báo là tĩnh.


3

Phương thức tĩnh có thể được sử dụng nếu

  • Người ta không muốn thực hiện một hành động trên một cá thể (phương thức tiện ích)

    Như đã đề cập trong vài trong số những câu trả lời ở trên trong bài này, chuyển đổi dặm sang km, hoặc tính toán nhiệt độ từ Fahrenheit sang Celsius và ngược lại. Với các ví dụ này sử dụng phương thức tĩnh, không cần khởi tạo toàn bộ đối tượng mới trong bộ nhớ heap. Xem xét dưới đây

    1. new ABCClass(double farenheit).convertFarenheitToCelcium() 
    2. ABCClass.convertFarenheitToCelcium(double farenheit)

    cái trước tạo ra một dấu chân lớp mới cho mọi phương thức gọi, Hiệu suất, Thực tế . Ví dụ là lớp StringUtils của thư viện Math và Apache-Commons bên dưới:

    Math.random()
    Math.sqrt(double)
    Math.min(int, int)
    StringUtils.isEmpty(String)
    StringUtils.isBlank(String)
  • Một người muốn sử dụng như một chức năng đơn giản. Các đầu vào được truyền một cách rõ ràng và lấy dữ liệu kết quả làm giá trị trả về. Kế thừa, đối tượng không được đưa vào hình ảnh. Súc tích, dễ đọc .

LƯU Ý : Rất ít người tranh luận chống lại khả năng kiểm tra của các phương thức tĩnh, nhưng các phương thức tĩnh cũng có thể được kiểm tra! Với jMockit, người ta có thể giả định các phương thức tĩnh. Khả năng kiểm tra . Ví dụ dưới đây:

new MockUp<ClassName>() {
    @Mock
    public int doSomething(Input input1, Input input2){
        return returnValue;
    }
};

3

Các phương thức tĩnh là các phương thức trong Java có thể được gọi mà không cần tạo một đối tượng của lớp. Nó thuộc về lớp.

Chúng tôi sử dụng phương thức tĩnh khi chúng tôi không cần phải gọi phương thức bằng cách sử dụng thể hiện.


2

Tôi đang tự hỏi khi sử dụng phương pháp tĩnh?

  1. Một cách sử dụng phổ biến cho staticcác phương thức là truy cập staticcác trường.
  2. Nhưng bạn có thể có staticcác phương thức, mà không cần tham chiếu staticcác biến. Các phương thức trợ giúp mà không cần tham chiếu staticbiến có thể được tìm thấy trong một số lớp java như java.lang.Math

    public static int min(int a, int b) {
        return (a <= b) ? a : b;
    }
  3. Trường hợp sử dụng khác, tôi có thể nghĩ về các phương thức này kết hợp với synchronizedphương thức là triển khai khóa cấp lớp trong môi trường đa luồng.

Nói rằng nếu tôi có một lớp với một vài getters và setters, một hoặc hai phương thức và tôi muốn các phương thức đó chỉ là bất khả xâm phạm trên một đối tượng thể hiện của lớp. Điều này có nghĩa là tôi nên sử dụng một phương thức tĩnh?

Nếu bạn cần truy cập phương thức trên một đối tượng thể hiện của lớp, phương thức của bạn sẽ không tĩnh.

Trang tài liệu Oracle cung cấp thêm chi tiết.

Không phải tất cả các kết hợp của các biến và phương thức của thể hiện và lớp đều được phép:

  1. Các phương thức sơ thẩm có thể truy cập các biến thể hiện và các phương thức thể hiện trực tiếp.
  2. Các phương thức sơ thẩm có thể truy cập các biến lớp và các phương thức lớp trực tiếp.
  3. Các phương thức lớp có thể truy cập các biến lớp và phương thức lớp trực tiếp.
  4. Các phương thức lớp không thể truy cập các biến thể hiện hoặc các phương thức cá thể trực tiếp, chúng phải sử dụng một tham chiếu đối tượng. Ngoài ra, các phương thức lớp không thể sử dụng từ khóa này vì không có trường hợp nào để tham khảo.

Chúng ta không thể truy cập các trường tĩnh thông qua các phương thức thông thường? Sau đó, đây A common use for static methods is to access static fields.không phải là một đối số.
phân tích cú pháp

2

Một phương thức tĩnh có hai mục đích chính:

  1. Đối với các phương thức tiện ích hoặc trợ giúp không yêu cầu bất kỳ trạng thái đối tượng. Vì không cần phải truy cập các biến thể hiện, nên có các phương thức tĩnh giúp loại bỏ nhu cầu của người gọi để khởi tạo đối tượng chỉ để gọi phương thức.
  2. Đối với trạng thái được chia sẻ bởi tất cả các phiên bản của lớp, như bộ đếm. Tất cả các trường hợp phải chia sẻ cùng một trạng thái. Các phương thức chỉ sử dụng trạng thái đó cũng nên tĩnh.

1

Trong nhật thực, bạn có thể kích hoạt cảnh báo giúp bạn phát hiện các phương thức tĩnh tiềm năng. (Phía trên dòng được tô sáng là một dòng khác tôi quên đánh dấu)

thiết lập nhật thực


0

Bất cứ khi nào bạn không muốn tạo một đối tượng để gọi một phương thức trong mã của bạn, chỉ cần khai báo phương thức đó là tĩnh. Vì phương thức tĩnh không cần gọi một cá thể nhưng việc bắt ở đây không phải là tất cả các phương thức tĩnh được JVM gọi tự động. Đặc quyền này chỉ được hưởng bởi phương thức main () "public static void main [String ... args]" trong java vì tại Runtime đây là phương thức Chữ ký công khai "static" void main [] được JVM tìm kiếm làm điểm vào bắt đầu thực thi mã.

Thí dụ:

public class Demo
{
   public static void main(String... args) 
   {
      Demo d = new Demo();

      System.out.println("This static method is executed by JVM");

     //Now to call the static method Displ() you can use the below methods:
           Displ(); //By method name itself    
      Demo.Displ(); //By using class name//Recommended
         d.Displ(); //By using instance //Not recommended
   }

   public static void Displ()
   {
      System.out.println("This static method needs to be called explicitly");
   }
} 

Đầu ra: - Phương thức tĩnh này được thực thi bởi JVM Phương thức tĩnh này cần được gọi một cách rõ ràng Phương thức tĩnh này cần được gọi một cách rõ ràng Phương thức tĩnh này cần được gọi một cách rõ ràng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.