2010-01-17 3 views
56

У меня есть концепция статических переменных, но каковы преимущества статических методов в классе. Я работал над некоторыми проектами, но не ставил статический метод. Всякий раз, когда мне нужно вызвать метод класса, я создаю объект этого класса и вызываю нужный метод.Когда следует использовать статические методы в классе и какие преимущества?

Вопрос: Статическая переменная в методе хранит его значение даже в том случае, когда метод выполняется, но доступен только в его методе, но что является лучшим определением статического метода?

Вопрос: Вызывает статический метод без создания объекта этого класса, является единственным преимуществом статического метода?

Вопрос: Каков допустимый диапазон для статического метода?

Благодаря

+4

Это было довольно широко обсуждено на SO, ознакомьтесь с http://stackoverflow.com/questions/169378/c-method-can-be-made-static-but-should-it/169423#169423 и другими вопросами которые появляются при поиске «статического метода». – PeterAllenWebb

ответ

58

Ваше описание статической переменной более соответствует тому, что содержится в C. Концепция статической переменной в объектно-ориентированных терминах концептуально отличается. Я рисую из опыта Java здесь. Статические методы и поля полезны, когда они концептуально не принадлежат к экземпляру чего-то.

Рассмотрим класс Math, содержащий некоторые общие значения, такие как Pi или e, и некоторые полезные функции, такие как sin и cos. Это действительно не имеет смысла создавать отдельные экземпляры, чтобы использовать такую ​​функциональность, поэтому они лучше как статики:

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

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

В ОО-языках (опять же, с точки зрения Java) функций, или более известный как методы, не может иметь статические локальные переменные. Только классы могут иметь статические члены, которые, как я сказал, мало похожи по сравнению с идеей статического в C.

+0

Я не уверен, что согласен с утверждением: «На самом деле не имеет смысла создавать отдельные экземпляры для использования такого рода функций, поэтому они лучше, чем статика». – Charbel

+0

@Charbel Что касается математики Например, статичность имела бы смысл, если только вы не подумаете о внедрении [New Math] (https://www.youtube.com/watch?v=UIKGV2cTgqA). –

5

Единственный раз, когда вы хотите использовать статический метод в классе, - это когда данный метод не требует экземпляр класса, который должен быть создан. Это может быть при попытке вернуть общий источник данных (например, Singleton) или выполнить операцию, которая не изменяет внутреннее состояние объекта (например, String.format).

Эта запись википедия объясняет статические методы довольно хорошо: http://en.wikipedia.org/wiki/Method_(computer_science)#Static_methods

2

Статические переменные и статические методы связаны с классом, а не экземпляр класса.

Статические методы не должны содержать «состояние». Все, что связано с состоянием, должно быть связано с экземпляром объекта, а не с классом.

8

По существу статические методы позволяют писать процедурный код на объектно-ориентированном языке. Он позволяет вам вызывать методы без необходимости создания объекта в первую очередь.

2

Static Methods in PHP:

Может быть вызван без создания объекта класса.

Можно использовать только статические методы и функции.

15

Статические методы не передают «этот» указатель на объект, поэтому они не могут ссылаться на нестатические переменные или методы, но, следовательно, могут быть более эффективными во время выполнения (меньшее количество параметров и никаких накладных расходов для создания и уничтожения объект).

Их можно использовать для группировки когезионных методов в один класс или для работы с объектами их класса, например, в заводской схеме.

11

Синтаксис (PHP) для статических методов:

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

код клиента:

echo Number::multiply(1, 2); 

Что имеет больше смысла, чем:

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

Поскольку метод multiply() не использует какой-либо переменные класса и как таковой не требует экземпляра Number.

+0

little nitpicking: Number звучит скорее как класс, представляющий числовое значение, а не класс полезности, предоставляющий арифметические операции. – RecursiveExceptionException

1

Статическая переменная используется, когда вы хотите поделиться информацией между различными объектами класса. Поскольку переменная является общей, каждый объект может ее обновить, а обновленное значение будет доступно для всех других объектов. Поскольку статическая переменная может использоваться совместно, их часто называют переменной класса.

1

Статические элементы доступны из любого контекста (т. Е. В любом месте вашего сценария), поэтому вы можете получить доступ к этим методам, не передавая экземпляр класса из объекта в объект.

Статические элементы доступны в каждом экземпляре класса, поэтому вы можете установить значения, которые должны быть доступны всем членам типа.

для дальнейшего чтения a link!

Смежные вопросы