12

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

4

7 回答 7

28

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

于 2013-07-24T18:18:02.950 回答
3

看看这段代码:
Super.java

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

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

控制台输出

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

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

于 2013-07-15T09:40:20.993 回答
2

我想补充一点,尽管这里的每个人都认为公共对于课程中的主要内容是必要的,并且没有主要内容就无法工作

您可以在一个类中拥有任意数量的主电源,并且您可以在没有公共访问修饰符的情况下拥有它们。但要小心,只有以文件命名的类才能公开我的意思是如果你将文件命名为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  
 * */
于 2013-05-31T23:33:43.707 回答
1

简单的答案。You can't. 您需要在 a 中有 main 方法,public class其签名应该是public static void main(String... args)

没有编译错误

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

于 2012-09-21T04:40:05.743 回答
0

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

于 2013-11-02T08:14:15.117 回答
0

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

如果您通过链接http://docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.6以及您已共享,那么很明显那里有一个顶部-级别类型声明仅指“顶级类和接口类型声明”,这些声明不应在顶级声明中受到保护、静态或私有,但我们可以对其中的任何方法或变量声明使用受保护、静态或私有。

以上代码,声明没有错,所有外部顶级类都是默认的,没有违规,代码会编译运行成功。

顶部提出的问题的答案与顶部的少数专家所提到的完全一样,即

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

如果我们有 2 个类 A(public) 和 B(non-public contains main method) ,那么文件将使用 "javac A.java" 编译,但是在运行代码时,我们需要将命令作为 "java B" 传递。

于 2016-07-18T05:32:39.253 回答
-2

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

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

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

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

于 2012-09-21T05:01:06.293 回答