Metoda programowania zorientowanego obiektowo, która jest zadeklarowana w klasie, ale nie jest zależna od żadnego konkretnego wystąpienia tej klasy, jest nazywana metodą statyczną. Większość języków programowania zawiera słowo kluczowe static w deklaracji metody, aby uczynić metodę statyczną. Te metody należą wyłącznie do klasy, w której są zawarte, a nie do żadnego obiektu utworzonego z tej klasy. Często określa się je mianem metod klasowych.
Dosłowna nazwa klasy jest zwykle używana do uzyskania dostępu do metody statycznej zamiast odwoływania się do niej za pomocą nazwy obiektu. W Javie dozwolone jest używanie nazw obiektów do odwoływania się do tych metod, ale jest to zdecydowanie odradzane. Jeśli używana jest nazwa obiektu, osoba czytająca kod może pomylić jedną z tych metod z metodą instancji.
Metody statyczne są często używane w klasach użytkowych, które nie zależą od zmiennych instancji z żadnej konkretnej klasy. Są one również używane, gdy programista musi uzyskać dostęp do metody, ale nie ma potrzeby tworzenia instancji klasy, w której jest ona zawarta. Klasy narzędziowe zwykle nie są tworzone w postaci obiektów. Niezwykłe byłoby, gdyby metoda narzędziowa wymagała modyfikowania informacji o obiekcie. Metoda z klasy java.lang.math, taka jak pow(), byłaby przykładem zastosowania tego typu metody w klasie użytkowej.
Metody instancji mogą bezpośrednio uzyskiwać dostęp do zmiennych instancji, zmiennych statycznych, metod instancji i metod statycznych. Metody statyczne nie mogą bezpośrednio uzyskiwać dostępu do zmiennych instancji i metod instancji. Ze względu na charakter metod instancji, które mają lepszy dostęp do składowych klas niż metody statyczne, metody instancji są typami metod zwykle używanymi w zwykłych klasach.
Jedna z głównych wad metod statycznych występuje podczas dziedziczenia, gdy stosuje się polimorfizm. Dopóki nadrzędna metoda statyczna nie jest zadeklarowana jako ostateczna, ta sama podrzędna metoda statyczna może być zakodowana w klasie podrzędnej tak, jakby była zastępowana. Technicznie nazywa się to ukrywaniem zamiast zastępowania, ponieważ metody statycznej nie można zastąpić.
Gdy używane jest ukrywanie, jeśli nadrzędna metoda statyczna jest dostępna przy użyciu nazwy klasy, zostanie użyta metoda nadrzędna. Jeśli przesłonięta statyczna metoda podrzędna jest dostępna przy użyciu nazwy obiektu, zostanie użyta zastąpiona metoda podrzędna. Problem pojawia się, gdy obiekt podrzędny jest odrzucany jako rodzic. W takim przypadku wywołanie statycznej metody upcast potomnej użyje metody nadrzędnej zamiast oczekiwanej metody potomnej. Przy prawdziwym polimorfizmie metoda potomna byłaby aktywowana po upcastowaniu.