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