将包含主方法设置的java类设置为公共类与非公共类之间有什么意义

将包含主方法设置的java类设置为公共类与非公共类之间有什么意义,java,Java,当我开始学习Java时,我也开始使用Ubiqutus Hello world应用程序。这多少有点像: public class MyClass { public static void main(String args[]){ //some code here.... } } 自从我与Java幽会已经很多年了,但最近我遇到了一个初学者的问题:她的类文件即使能够正确编译也无法运行 在看完她的代码后,我注意到的第一件事是在main方法的类上没有公共访问说明符。我立即嘲笑她犯了这

当我开始学习Java时,我也开始使用Ubiqutus Hello world应用程序。这多少有点像:

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的答案更合适。我很感兴趣:你是说程序不会从其他目录执行吗,即使有正确的类文件的相对路径?也许一个例子可以说明发生了什么:她