The fundamental problem is that you need to have an entry point - the earliest of your code that will run once the program is started. That must be something allowed by the language of choice. Non-member functions are allowed in C and C++ but not in Java.
However static member functions are very close to non-member functions (you can simply call a public static member function of any class without instantiating an object just as you would call a non-member function) and are allowed in Java and so that's the choice for how the entry point is defined.
Yes, you could perhaps have a non-static member function being used as an entry point, but which object would it be invoked on? This could be done for example by specifying a specific class as holding an entry point function (using some attribute or program configuration file or whatever else) and the runtime would instantiate it and call the member function on the object. However this is an unnecessary complication - you can have all that with a static member function used as an entry point. Once control gets there - just instantiate whatever you want and call member functions thereof.