The interpreter
could still execute it if it were protected, default-protected, or private; there's nothing to stop an implementation of the
Java command-line executable from calling java.lang.reflect.Method.setAccessible(true) on the Method object that represents a private version of main(). But it's not guaranteed to work.
There's probably no implementation of Java in existence that would still launch main() if the return type or argument types were different, but again, that's just by convention; there's nothing stopping me from writing a version that found
any method named main(), and called it regardless of its signature. But changing the protection was all that the original poster was asking about.