Jedna praktyczna zasada: zadaj sobie pytanie „Czy sensowne jest wywoływanie tej metody, nawet jeśli żaden obiekt nie został jeszcze zbudowany?” Jeśli tak, zdecydowanie powinien być statyczny.
Więc w klasie Carmożesz mieć metodę:
double convertMpgToKpl(double mpg)
... który byłby statyczny, ponieważ można by chcieć wiedzieć, na co konwertuje 35mpg, nawet jeśli nikt nigdy go nie zbudował Car. Ale ta metoda (która określa wydajność jednego konkretnego Car):
void setMileage(double mpg)
... nie może być statyczny, ponieważ nie jest możliwe wywołanie metody, zanim Carzostanie ona zbudowana.
(Nawiasem mówiąc, odwrotność nie zawsze jest prawdą: czasami możesz mieć metodę, która obejmuje dwa Carobiekty i nadal chcesz, aby była statyczna. Np .:
Car theMoreEfficientOf( Car c1, Car c2 )
Chociaż można to przekonwertować na wersję niestatyczną, niektórzy twierdzą, że skoro nie ma „uprzywilejowanego” wyboru, który Carjest ważniejszy, nie powinieneś zmuszać dzwoniącego do wybrania jednego Carjako obiektu, który wywołasz metoda włączona. Ta sytuacja stanowi jednak niewielki ułamek wszystkich metod statycznych.)