Одно эмпирическое правило: спросите себя: «Есть ли смысл вызывать этот метод, даже если объект еще не был построен?» Если это так, то он обязательно должен быть статичным.
Так что в классе у Car
вас может быть метод:
double convertMpgToKpl(double mpg)
... что было бы статично, потому что кто-то может захотеть узнать, во что конвертируется 35 миль на галлон, даже если никто никогда не создавал Car
. Но этот метод (который устанавливает эффективность одного конкретного Car
):
void setMileage(double mpg)
... не может быть статичным, поскольку невозможно вызвать метод до того, как какой-либо объект был создан Car
.
(Между прочим, обратное не всегда верно: иногда вы можете иметь метод, который включает два Car
объекта, и все же хотите, чтобы он был статическим. Например:
Car theMoreEfficientOf( Car c1, Car c2 )
Хотя это может быть преобразовано в нестатическую версию, некоторые утверждают, что, поскольку нет «привилегированного» выбора, который Car
более важен, вы не должны заставлять вызывающего абонента выбирать его Car
в качестве объекта, который вы вызываете. метод на. Эта ситуация объясняет довольно небольшую долю всех статических методов.)