Why doesn't the class containing main have to be public?

前端 未结 3 1745
迷失自我
迷失自我 2020-12-18 10:31

I declared the following class

class A { //not public
  public static void main(String args[]) {
     System.out.println(\"done\");
 }

When

相关标签:
3条回答
  • 2020-12-18 10:56

    The reason the JVM can see a non-public class is because it controls visibility, meaning it sees everything and decides what can see/call/access what.

    The use of public on a class is different than on a method, but the concept is the same.

    On a method, the public keyword means the method can be used outside the class. An example would be:

    class A {
      public static void do() {
        // Do something
      }
    }
    
    class B {
      public static void main(String[] args) {
        A.do(); // This works because do() is public and static
      }
    }
    

    The same concept applies to classes, but in a different way.

    Using public on a class means that it can be used outside the current .java file (it will have its own .class file).

    Here's an example:

    //C.java
    
      class C {
        static void do() {
          // Do something
        }
    
        public static void run() {
          A.do();  // Works because A.do() is public and static
          B.do();  // Does not work because B is not a public class
        }
      }
    
    
    
    //A.java
    
      public class A {
        public static void main(String[] args) {
          B.do(); // Works because B is in the same file
          do();   // Duh...
        }
    
        public static void do() {
          // Do something
        }
      }
    
      class B {
        static void do() {
          // Do something
        }
      }
    
    0 讨论(0)
  • 2020-12-18 11:11

    The JVM has access to every class in the application all the time because one of its responsibilities is enforcing visibility rules. Therefore, one can draw the conclusion that it can ignore visibility rules if need be (e.g. when the user starts the application, the JVM has to find the entry point, which is main()).

    In other words, the JVM is not a class accessing this function, so visibility doesn't apply. It is basically the overseer, managing the application from execution to termination.

    For reference, see Execution.

    0 讨论(0)
  • 2020-12-18 11:18

    When you declare a class private, you're not making it "invisible", and the same goes for your methods. Declaring a method private simply means it's not callable from outside your class. A static public method of a private class is publicly callable.

    0 讨论(0)
提交回复
热议问题