如果main方法在java文件的“非公开类”里面怎么办?

时间:2012-09-21 04:37:19

标签: java main public

我有一个包含多个类的java文件,其中一个是公共的。如果main方法在非公共类中。我无法运行该java文件。这是为什么?并且没有编译错误。如果是这样,我该如何使用该主要方法?

7 个答案:

答案 0 :(得分:22)

实际上,您可以在非公共类中执行main方法。如果你把这个班级

class A {
  public static void main(String... args) {
      System.out.println("This is not a public class!");
  }
}

在名为NonPubClass.java的文件中。你可以使用javac命令编译这个文件,但你不会得到一个NonPubClass.class,你会得到一个A.class。使用java a调用该类,您将看到打印的字符串---这不是公共类!

答案 1 :(得分:2)

看看这段代码:
Super.java

public class Super{ }
class Sub{
    public static void main(String[] s){
        System.out.println("Hello");
    }
}

为了打印Hello,您可以编译并运行程序:

console output

这是如何运作的?
编译器为程序中的每个类生成单独的.class文件。因此,不是从公共类的main()调用非公共类的main(),而是可以打印输出,如上所示。

注意:正如大会所说,您必须将public class放在单独的文件<class_name>.java中。并且不要在一个文件中放置多个类(除非它们是内部类),因为如果您想要导入它们或将它们与其他类一起使用,那么它将导致问题。

答案 2 :(得分:1)

简单回答。 You can't。您需要在public class中使用main方法,其签名应为public static void main(String... args)

  

没有编译错误

为什么会这样?就编译规则而言,你没有做错任何事。 唯一的问题是您的non-public-class-main-method不能作为代码的入口点。

答案 3 :(得分:1)

有一些我想补充的内容,虽然这里的每个人都认为公共是课堂主要的必要条件,没有主要课程就无法工作

您可以根据需要在课程中拥有尽可能多的主管,并且您可以在没有公共访问修改器的情况下拥有它们。 但要小心,只有以文件命名的类才可以公开 我的意思是,如果您将文件命名为 a.java ,则只有名称为 a 的类可以公开,其他任何一个都不能拥有此功能

这是一个显示此代码的代码: 你可以看到该文件的名称是help.java

//:initialization/helping.java

class b{
    public static void main(){
        System.out.println("hello its b");
    }
}   

class helping {
    static void f(float i, Character... c) {
        System.out.println("first");
    }
    static void f(char a, Character... args) {
        System.out.println("second");
    }
    public static void main(String[] args) {
        f(1,'a');
        f('a','b');
        c.main();
    }
}

class c{
    public static void main(){
        System.out.println("hello its b");
    }
}
//:~
/*
 * output:  
 * first
 * second
 * hello its b  
 * */

答案 4 :(得分:0)

您当然可以覆盖main方法,它不违反任何编译器规则,因此您不会有任何编译器错误。

您检查一下,尽管您有多个类,但声明为public的文件是您尝试执行的文件的名称。

这是一个约定,该文件应该在该代码中公开的同一个类之后命名

因此,当您尝试执行该类时,它没有从中开始执行的主方法。因此,如果要在非公共类中执行main方法,唯一的方法就是从main调用main公共课的方法。

答案 5 :(得分:0)

如果顶级类型声明包含以下任何一个访问修饰符,则为编译时错误:protected,private或static.This link可能会有所帮助。

答案 6 :(得分:0)

这不是编译时错误,因为你提到顶级类型声明不应该受到保护,静态或私有。

如果你通过你已经共享的链接http://docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.6,那么很明显顶级类型声明只引用“顶级类和接口类型声明”,这些声明不应该被保护,顶级声明中的静态或私有,但我们可以对其中的任何方法或变量声明使用protected,static或private。

关于上面的代码,声明中没有任何错误,代码将编译并成功运行,因为所有外部顶级类都是默认的并且没有违规。

顶部提出的问题的答案正如前面几位专家所提到的那样,

“我们确定我们可以在非公共类中包含一个带有main方法的文件,它将编译并运行成功,但请确保在运行程序时我们必须传递类名”main“方法“到java解释器而不是公共的类。”

如果我们有2个类A(公共)和B(非公共包含main方法),那么该文件将使用“javac A.java”进行编译,但在运行代码时我们需要将命令作为“java B”传递“。