我有一个包含多个类的java文件,其中一个是公共的。如果main方法在非公共类中。我无法运行该java文件。这是为什么?并且没有编译错误。如果是这样,我该如何使用该主要方法?
答案 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
,您可以编译并运行程序:
这是如何运作的?
编译器为程序中的每个类生成单独的.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”传递“。