本问题已经有最佳答案,请猛点这里访问。
我写了以下代码
class Hello //Note the class is not public
{
public static void main(String args[]) {
System.out.println("Hello");
}
}
代码>
因此,当我运行它时,它运行正常并打印输出"Hello"。
但是,如果JVM规范要求主要方法应该是公开的,因为"它不能看到主要的",那么它不应该也适用于类吗? 如果JVM"未能看到"Hello.main(),当它未被声明为public时,它如何能够看到A类本身。
除了"因为规范是这样说的"之外,还有其他解释吗?
如果JVM能够看到所有类和方法,因为它本身就是"安全/可见性执行器",那么为什么需要将main方法声明为public。
也可以在非默认包中运行!
好吧,忘了我说的话,我完全错了。
您在规范中的哪个位置找到了"它看不到主要信息"的引用?
很多答案。 请参阅我的回答,我之前发布了类似讨论的链接,这表明该课程不必是公开的。 该规范没有说那样的话。
只是为了踢,私人类也可以举行main的演示:
class Outer {
private static class Inner {
public static void main(String[] args) {
System.out.println("Hello from Inner!");
}
}
}
从命令行编译并运行良好:
C:\junk>javac Outer.java
C:\junk>java Outer$Inner
Hello from Inner!
C:\junk>
很好,从来不知道这是可能的。
请注意,在linux bash中,您需要将其转义,即java Outer\$Inner才能运行。
if JVM spec mandates that main method should be public since"it can't
see main otherwise"
它可以看到,但它不会将其视为入口点,这就是为什么它会给出NoSuchMethodError:main如果你尝试执行一个没有这种方法的类。
通过经典设计,主要切入点 -
必须命名为main
必须公开
必须是静态的
必须无效
必须有一个参数是一个字符串数组
因此,
public static void main(String args[])
作为静态,JVM可以在不创建包含main方法的任何类实例的情况下调用它。不确定它是否是主要设计静态的主要原因。
在您的示例中具有类似Hello的默认访问的类仅对同一包中的其他类可见。
您应该添加第5点:"必须命名为main"。
@TedHopp不知道我是怎么说的。谢谢。
@SajalDutta谢谢你的伴侣。你的解释是准确和令人满意的!
@KhanZaid欢迎你..
@SajalDutta这也是一个原因,一个类不能被声明为private,受保护?
我不认为规范说该课程必须是公开的。
请参阅官方java教程中的示例。示例中没有使用main方法的类都声明为Public。
这在之前讨论过stackoverflow。请参阅:.java文件中的包 - 私有类 - 为什么它可以访问?
解释得很好。
谢谢回复。我的问题是JVM要求main()公开,以便从任何地方访问它。但是如果包含main()的类不是公共的,那么main()的目的是什么(即它的可见性受到该类的限制)
当JVM启动时,它会加载命令行中指定的类(请参阅jls java虚拟机启动),并且您不能在类中使用protected或private说明符,因此您唯一的选择是public或只是空白default,这两个访问说明符都允许在同一个包中访问该类。因此,无需为要加载的类指定public关键字。
希望清楚。
你是否认为main必须声明为public的原因是它可以被JVM访问或者它只是语法的一部分,就像java开发人员希望我们遵循他们的语法一样!
这是一个类似的问题,有一个非常直截了当的答案。
基本上,JVM可以访问default访问或public访问的任何类中的main,因为它是入口点。如果类是private或protected,则会出现编译错误。
是什么让你觉得你会得到一个编译错误?
因为我试过了;-)
外部类只能有public访问修饰符。但内部类肯定可以是private或protected。
根据我的研究,一个类只能有2个访问修饰符。公开或默认。
首先让我们考虑一下
1.由于main方法是静态的,Java虚拟机可以调用它而无需创建包含main方法的任何类实例。
这个:
2.在Java中的类中声明的任何内容都属于引用类型,并且需要在使用它们之前创建对象,但静态方法和静态数据被加载到JVM中的单独内存中,称为上下文,这是在加载类时创建的。如果main方法是静态的,那么它将在JVM上下文中加载并且可以执行。
最后这个:
3.主要方法是任何Core Java程序的入口点。执行从main方法开始。
总而言之:Java首先收取你的Main方法,public使这个方法可以从JVM的各个地方访问,并且static在JVM上下文中设置方法,所以JVM加载它的第一件事就是你的主要方法!
Class Hello{}
只需让同一个包中的所有类都可以访问您的类。
package.Classes可以访问同一个包中其他类的成员。但是在包外面它看起来是私有的,但是JVM可以访问所有类,因此JVM可以改变可见性,只是为了找到程序的开头因此它默认为默认值
请注意main是早期语言功能。我的猜测是,人们认为私有方法可能会在.class文件中消失,可能是内联的,可能是一个较短的名称。所以这是一个简单的过度限制(?)约定,用于检索正确的方法:
static void main(String[])