Static methods go against the object-oriented paradigm, because static methods turn object-oriented programming into "class-oriented" programming. The problem is that with class-oriented programming, decomposition doesn't work anymore. We can't break down a complex problem into parts, because only a single instance of a class exists in the entire program. When I instantiate an object inside a method, it is dedicated to my specific task. It is perfectly isolated from all other objects around the method. It is a local variable in the scope of the method. A class, with its static methods, is always a global variable no matter where we use it.

Public static methods also have a few practical drawbacks: It's impossible to mock them, or at best a very bad idea to try to mock them. Also, they are not thread-safe by definition, because they always work with static variables, which are accessible from all threads. You can make them thread-safe, but this will always require explicit synchronization.