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

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

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

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

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

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

实际上,您可以在非公共类中执行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调用该类,您将看到打印的字符串—这不是公共类!

看看这段代码:
Super.java

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

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

控制台输出

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

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

简单的答案。 You can't 。 你需要在public class使用main方法,它的签名应该是public static void main(String... args)

没有编译错误

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

有一些我想补充的内容虽然这里的每个人都认为一个公共对于class级中的主要是必要的,并且如果没有主要的话它将无法工作

您可以根据需要在课堂中拥有尽可能多的主管,并且您可以在没有公共访问修改器的情况下拥有它们。 但是要小心,只有那个以文件命名的类可以是公共的,我的意思是如果你将文件命名为a.java ,那么只有名为a的类可以是公共的,没有其他人可以拥有这个function

这是一个显示此代码的代码:您可以看到该文件的名称是helps.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 * */ 

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

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

如果你通过链接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”传递。