Uma regra prática: pergunte a si mesmo "Faz sentido chamar esse método, mesmo que nenhum objeto tenha sido construído ainda?" Nesse caso, deve ser definitivamente estático.
Portanto, em uma classe, Carvocê pode ter um método:
double convertMpgToKpl(double mpg)
... o que seria estático, porque é possível saber no que 35mpg se converte, mesmo que ninguém jamais tenha construído um Car. Mas este método (que define a eficiência de um particular Car):
void setMileage(double mpg)
... não pode ser estático, pois é inconcebível chamar o método antes que qualquer Cartenha sido construído.
(A propósito, o inverso nem sempre é verdadeiro: às vezes você pode ter um método que envolve dois Carobjetos e ainda assim querer que seja estático. Por exemplo:
Car theMoreEfficientOf( Car c1, Car c2 )
Embora isso possa ser convertido para uma versão não estática, alguns argumentam que, como não há uma opção "privilegiada", o que Caré mais importante, você não deve forçar um chamador a escolher um Carcomo o objeto que você chamará. método ativado. Essa situação é responsável por uma fração bastante pequena de todos os métodos estáticos.)