java中package语句的歧义性

java中package语句的歧义性,java,Java,考虑以下代码: package com.a.b; class Test { public static void main(String[] args) { System.out.println("Hello to the world of packages"); } } 我将程序编译为: javac Test.java 这在当前工作目录中创建了Test.class文件。我现在应该如何运行程序?我试过: java Test 但我得到了一个“找不到类

考虑以下代码:

package com.a.b;

class Test {
    public static void main(String[] args) {
         System.out.println("Hello to the world of packages");   
    }
}
我将程序编译为:

javac Test.java
这在当前工作目录中创建了
Test.class
文件。我现在应该如何运行程序?我试过:

java Test
但我得到了一个“找不到类def错误”。如果我这样编译:

javac -d . Test.java
它正在创建目录结构,然后我可以运行

java com.a.b.Test

如果我可以在没有目录层次结构的情况下编译,为什么我不能执行?

您必须始终使用完全限定的类名运行Java程序:

是否使用
javac-d
选项编译它并不重要

因此,在您的情况下,它将是:

java com.a.b.Test
最好使用
-d
选项编译它,并根据包名将.class文件存储在适当的目录结构中

更新

另外,确保当前目录位于类路径中

尝试运行以下命令:

java -cp . com.a.b.Test
更新2


-d
选项未与
javac
一起使用时,将在当前目录中创建类文件。您必须手动将类文件移动/复制到适当的目录,然后执行它们。
-d
选项是实现这一点的捷径。

您必须始终使用完全限定的类名运行Java程序:

是否使用
javac-d
选项编译它并不重要

因此,在您的情况下,它将是:

java com.a.b.Test
最好使用
-d
选项编译它,并根据包名将.class文件存储在适当的目录结构中

更新

另外,确保当前目录位于类路径中

尝试运行以下命令:

java -cp . com.a.b.Test
更新2


-d
选项未与
javac
一起使用时,将在当前目录中创建类文件。您必须手动将类文件移动/复制到适当的目录,然后执行它们。
-d
选项是实现这一点的捷径。

Java在
类路径中搜索类。默认情况下,
classpath
只包含当前目录


当Java搜索类时,它通过
classpath
元素进行迭代。若元素是目录,那个么它将在某个子目录中搜索具有类结束扩展名
.class
的文件。准确地说,这个子目录是通过在目录分隔simbol(
/
\
中重放点来找到的,具体取决于您的操作系统)和解析结果。

Java在
类路径中搜索类。默认情况下,
classpath
只包含当前目录

当Java搜索类时,它通过
classpath
元素进行迭代。若元素是目录,那个么它将在某个子目录中搜索具有类结束扩展名
.class
的文件。准确地说,此子目录是通过在目录分隔simbol(
/
\
中重放点来找到的,具体取决于您的操作系统)和解析结果。

在您的第一个命令中:

javac Test.java
它编译得很好,因为没有错误,并且将
Test.class
文件放在当前目录中,因为那里是
Test.java
驻留的地方:

如果未指定-d选项,则
javac
将每个类文件放在与生成它的源文件相同的目录中

源文件位于当前目录中,因此类文件位于当前目录中。现在,当您这样执行时:

java Test
出现错误,因为必须使用完全限定类名。您指定了一个包,即使它在当前目录中,也必须使用完全限定名来指定它所在的位置。如果没有全名,Java无法找到它并执行它,因此会出现错误。您可以执行以下操作:

java com.a.b.Test
Java会找到合适的方法,所有的方法都会很好地执行


现在,我建议使用
-d
选项来正确放置组织的类文件。我还建议实际创建您指定的包,因此在第一个命令中将
Test.java
文件放在
/com/a/b

目录中:

javac Test.java
它编译得很好,因为没有错误,并且将
Test.class
文件放在当前目录中,因为那里是
Test.java
驻留的地方:

如果未指定-d选项,则
javac
将每个类文件放在与生成它的源文件相同的目录中

源文件位于当前目录中,因此类文件位于当前目录中。现在,当您这样执行时:

java Test
出现错误,因为必须使用完全限定类名。您指定了一个包,即使它在当前目录中,也必须使用完全限定名来指定它所在的位置。如果没有全名,Java无法找到它并执行它,因此会出现错误。您可以执行以下操作:

java com.a.b.Test
Java会找到合适的方法,所有的方法都会很好地执行


现在,我建议使用
-d
选项来正确放置组织的类文件。我还建议实际创建您指定的包,因此将您的
Test.java
文件放入目录
/com/a/b

1)将您的类添加到java构建路径 2) 使用完整路径运行它。

1)将类添加到java构建路径
2) 使用完整路径运行它。

提示:所有这些都有很好的文档记录。我知道这样问很方便;希望有人能花时间向你解释,但是,有些事情真的很低级。所以,老实说:把一些精力放在做之前的研究上。你可以从寻找资源、阅读、消化和尝试中学到更多。。。而不是“随时提供答案”