2010-01-17 47 views
56

Tôi có khái niệm về các biến tĩnh nhưng lợi ích của các phương thức tĩnh trong một lớp là gì. Tôi đã làm việc trên một số dự án nhưng tôi đã không thực hiện một phương pháp tĩnh. Bất cứ khi nào tôi cần gọi một phương thức của một lớp, tôi tạo một đối tượng của lớp đó và gọi phương thức mong muốn.Khi nào tôi nên sử dụng các phương pháp tĩnh trong một lớp học và các lợi ích là gì?

Q: Biến tĩnh trong phương thức giữ giá trị của nó ngay cả khi phương thức được thực thi nhưng chỉ có thể truy cập trong phương thức chứa nhưng định nghĩa tĩnh nhất là gì?

Q: Việc gọi phương thức tĩnh mà không tạo đối tượng của lớp đó là lợi ích duy nhất của phương pháp tĩnh?

Q: Phạm vi truy cập cho phương pháp tĩnh là gì?

Cảm ơn

+4

Điều này đã được thảo luận khá nhiều trên SO, hãy xem http://stackoverflow.com/questions/169378/c-method-can-be-made-static-but-should-it/169423#169423 và các câu hỏi khác xuất hiện khi bạn tìm kiếm "phương pháp tĩnh". – PeterAllenWebb

Trả lời

58

Mô tả của bạn về biến tĩnh phù hợp hơn với biến được tìm thấy trong C. Khái niệm về biến tĩnh trong các thuật ngữ hướng đối tượng là khác nhau về mặt khái niệm. Tôi đang vẽ từ kinh nghiệm Java ở đây. Các phương thức và trường tĩnh hữu ích khi chúng không thuộc về một cá thể nào đó.

Hãy xem xét một lớp Toán có chứa một số giá trị phổ biến như Pi hoặc e và một số hàm hữu ích như sin và cos. Nó thực sự không có ý nghĩa để tạo ra các trường hợp riêng biệt để sử dụng loại chức năng, do đó họ đang tốt như tĩnh học:

// This makes little sense 
Math m = new Math(); 
float answer = m.sin(45); 

// This would make more sense 
float answer = Math.sin(45); 

Trong các ngôn ngữ OO (một lần nữa, từ góc độ Java) chức năng, hay còn gọi là phương pháp, không thể có các biến cục bộ tĩnh. Chỉ có các lớp có thể có các thành viên tĩnh, như tôi đã nói, tương tự ít so với ý tưởng tĩnh trong C.

+0

Tôi không chắc chắn rằng tôi đồng ý với tuyên bố "Nó thực sự không có ý nghĩa để tạo các trường hợp riêng biệt để sử dụng loại chức năng này, do đó chúng tốt hơn là statics" – Charbel

+0

@Charbel Về Toán Ví dụ, tĩnh sẽ có ý nghĩa, trừ khi bạn xem xét việc thực hiện [Toán mới] (https://www.youtube.com/watch?v=UIKGV2cTgqA). –

5

Thời gian duy nhất bạn muốn sử dụng một phương thức tĩnh trong lớp là khi một phương thức đã cho không yêu cầu một thể hiện của một lớp được tạo ra. Điều này có thể là khi cố gắng trả về nguồn dữ liệu được chia sẻ (ví dụ Singleton) hoặc thực hiện một thao tác không sửa đổi trạng thái bên trong của đối tượng (ví dụ String.format).

nhập wikipedia này giải thích phương pháp tĩnh khá tốt: http://en.wikipedia.org/wiki/Method_(computer_science)#Static_methods

2

biến tĩnh và phương pháp tĩnh được ràng buộc với lớp, và không phải là một thể hiện của lớp.

Phương pháp tĩnh không được chứa "trạng thái". Bất cứ điều gì liên quan đến một nhà nước, nên được ràng buộc với một đối tượng instantiated, và không phải là lớp học.

8

Về cơ bản, các phương thức tĩnh cho phép bạn viết mã thủ tục theo ngôn ngữ hướng đối tượng. Nó cho phép bạn gọi các phương thức mà không phải tạo một đối tượng trước tiên.

2

Static Methods in PHP:

Có thể được gọi mà không cần tạo đối tượng lớp.

Chỉ có thể gọi trên các phương pháp và chức năng tĩnh.

15

Phương pháp tĩnh không truyền con trỏ "này" đến đối tượng, vì vậy chúng không thể tham chiếu biến hoặc phương pháp không tĩnh, nhưng do đó có thể hiệu quả hơn trong thời gian chạy (ít tham số hơn và không có phí để tạo và phá hủy) một đối tượng).

Chúng có thể được sử dụng để nhóm các phương thức cố kết vào một lớp đơn lẻ hoặc để tác động lên các đối tượng trong lớp của chúng, chẳng hạn như trong mẫu nhà máy.

11

Cú pháp (php) cho các phương pháp tĩnh:

<?php 
class Number { 
    public static function multiply($a, $b) { 
     return $a * $b; 
    } 
} 
?> 

Khách hàng mã:

echo Number::multiply(1, 2); 

nào có ý nghĩa hơn:

$number = new Number(); 
echo $number->multiply(1, 2); 

Là phương pháp multiply() không sử dụng bất kỳ biến lớp và như vậy không yêu cầu một thể hiện của Number.

+0

ít nitpicking: Số âm thanh giống như một lớp đại diện cho một giá trị số, không phải là một lớp tiện ích cung cấp các phép toán số học. – RecursiveExceptionException

1

Biến tĩnh được sử dụng khi bạn muốn chia sẻ một số thông tin giữa các đối tượng khác nhau của lớp. Biến được chia sẻ mỗi đối tượng có thể cập nhật và giá trị cập nhật khả dụng cho tất cả các đối tượng khác. Khi biến tĩnh có thể được chia sẻ, chúng thường được gọi là biến lớp.

1

các phần tử tĩnh có thể truy cập được từ bất kỳ ngữ cảnh nào (ví dụ: ở bất kỳ đâu trong tập lệnh của bạn), để bạn có thể truy cập các phương pháp này mà không cần phải chuyển một thể hiện của lớp từ đối tượng này sang đối tượng khác.

Phần tử tĩnh có sẵn trong mọi phiên bản của một lớp, do đó bạn có thể đặt giá trị mà bạn muốn có sẵn cho tất cả các thành viên của một loại.

để đọc thêm a link!

Các vấn đề liên quan