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