将包含主方法设置的java类设置为公共类与非公共类之间有什么意义
当我开始学习Java时,我也开始使用Ubiqutus Hello world应用程序。这多少有点像:将包含主方法设置的java类设置为公共类与非公共类之间有什么意义,java,Java,当我开始学习Java时,我也开始使用Ubiqutus Hello world应用程序。这多少有点像: public class MyClass { public static void main(String args[]){ //some code here.... } } 自从我与Java幽会已经很多年了,但最近我遇到了一个初学者的问题:她的类文件即使能够正确编译也无法运行 在看完她的代码后,我注意到的第一件事是在main方法的类上没有公共访问说明符。我立即嘲笑她犯了这
public class MyClass {
public static void main(String args[]){
//some code here....
}
}
自从我与Java幽会已经很多年了,但最近我遇到了一个初学者的问题:她的类文件即使能够正确编译也无法运行
在看完她的代码后,我注意到的第一件事是在main方法的类上没有公共访问说明符。我立即嘲笑她犯了这个错误,并通过添加公共访问修饰符来“修复”它。这个笑话当然是开在我身上的,因为那也没什么区别。然后我意识到,她试图从与类文件所在目录不同的目录执行编译后的类。我更改为该dir并发出java命令,它立即运行
这就引出了我的问题。。。大多数hello world示例都具有公共访问的类设置,而完全没有公共访问也是可以的。那么,对于一个包含main方法的类来说,这有什么区别呢
为了让大家更清楚地了解我们到底在做什么,以下是步骤:
我们在教室里上课
c:\users\[usersname]\[my documents folder]\myprog.class
我们尝试从c:\(作为我们的工作目录)运行它。我们确实指定了完整的相对路径,希望它能够工作。像这样:
java users\[usersname]\[my documents folder]\myprog
当然,这只是失败了,直到我改变到文档文件夹,使其成为当前的工作目录,并再次发出这样的命令
java myprog
因此,当您将类放在一个类似于名称前面的文件夹结构的包中时,这种调用基本上是有意义的。在这种情况下,该类不在任何包中。与任何方法一样,其他类的可见性也受到影响。如果您将main方法标记为public,则其他类可以访问它。public与package的说明符与是否允许其他包中的类“查看”该类有关 大多数hello world程序都会忽略软件包,因此它们会使用更常见的公共选项。大多数人在真正学会将项目组织到包中之前,永远不必了解其他包说明符(及其限制)。当然,如果你只有一门课,那也没关系
还有,我不知道你为什么嘲笑新手程序员。我已经用Java编写代码10年了,仍然一直在学习新东西 真的不需要吗?有意思,我得说我还没试过 除了Java运行时是否可以调用您的主类之外,该类上的访问修饰符的含义与它们对任何其他类的含义相同。如果一个类是公共的,那么其他类可以引用它,而如果它是私有的,它们就不能引用它(当然是受保护的,默认值是中间值) 不管是否必须公开主类,否则在概念上没有任何意义。更窄的访问定义可以被视为外部方面无法访问该类的标志,因此您可以根据需要自由更改定义。在这种情况下,您的主类肯定是public,因此我认为将其定义为其他任何内容都是错误的(即使是合法的)。可见性修饰符(public、private或protected)实际上是可选的 如果未指定可见性修改器,将应用默认可见性 默认可见性允许同一包中的类访问具有默认可见性的任何内容(无论是类、方法还是属性) 那么,对于一个包含main方法的类来说,这有什么区别呢 没有 您可以使用公共访问修饰符运行类的main方法,也可以不使用它 您的问题是,该类位于不同的目录中,因此,解释器(java)不知道在何处查看 假设我有:
src/Hello.java
您可以使用:javacsrc/Hello.java
它编译得很好,然后您尝试执行它:javahello
但这不会运行,不是因为定义的类是否具有公共访问权限,而是因为生成的.class
文件位于目录src
中,而不是在这里(
)
可以使用-d选项指定.class文件的放置位置
请参见此示例:
$mkdir src
$cat >src/Hello.java <<.
> class Hello {
> public static void main( String [] args ) {
> System.out.println("Hello, world");
> }
> }
> .
$javac src/Hello.java
$java Hello
Exception in thread "main" java.lang.NoClassDefFoundError: Hello
Caused by: java.lang.ClassNotFoundException: Hello
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
$cd src/
$java Hello
Hello, world
$cd ..
$ls
src
$rm src/Hello.class
$javac -d . src/Hello.java
$java Hello
Hello, world
$
$mkdir src
$cat>src/Hello.java公共静态void main(字符串[]args){
>System.out.println(“你好,世界”);
> }
> }
> .
$javac src/Hello.java
$java你好
线程“main”java.lang.NoClassDefFoundError中出现异常:Hello
原因:java.lang.ClassNotFoundException:Hello
位于java.net.URLClassLoader$1.run(URLClassLoader.java:202)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.net.URLClassLoader.findClass(URLClassLoader.java:190)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:307)
位于sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:248)
$cd src/
$java你好
你好,世界
$cd。。
$ls
src
$rm src/Hello.class
$javac-d。src/Hello.java
$java你好
你好,世界
$
我指的是类上的公共访问修饰符,而不是函数。或者我看错了你的答案。我知道不使用public标记“main”函数将阻止jvm调用它。我的问题是,在示例中公开或不公开类“MyClass”的意义是什么?因为在这两种情况下,文件的执行都很好。@balien我误解了这个问题,因此Uri的答案更合适。我很感兴趣:你是说程序不会从其他目录执行吗,即使有正确的类文件的相对路径?也许一个例子可以说明发生了什么:她