I always read that the main method must be defined as public static void... however I am able to compile and run programs with this method defined at any visibility level such as private. I am also able to declare my main method as final. Why is this the case, is it my JVM? What are the advantages and disadvantages of changing these?