示例:
我有一个名为ProgA的课程
package test;
public class ProgA
{
public static void main(String[] args)
{
ProgB pb = new ProgB();
pb.callMe();
}
}
现在我有如下的ProgB:
package test2;
public class ProgB
{
public void callMe()
{
System.out.println("inside callme");
}
}
编译ProgB.java后,它的类文件在test2包中生成。现在,当我尝试使用以下命令编译ProgA.java时:
javac -cp C:\Users\MyName\Desktop\test2 ProgA.java
我收到了无法找到ProgB的错误。
我的问题是为什么不能让java在类路径中查找ProgB.class文件并成功编译我的ProgA.java?当我在ProgA.java代码中指定ProgB的完全限定类名并在类路径设置为-classpath C:\Users\MyName\Desktop
的情况下运行时,代码工作正常。当我已经指定了查找ProgB的完整类路径时,为什么要使用完全绗缝的名称。我不清楚classpath的概念和完全限定的类名。请解释一下。谢谢
答案 0 :(得分:2)
首先,您需要导入该类。这就是为什么它要求您使用完全限定的类名。如果没有导入它(或使用完全限定的类名),则不能使用不在同一个包中的类。
import test2.ProgB;
然后在编译时,你应该提供直到根位置的类路径,编译器将使用包名作为路径来查找类。
你的编译命令应该是。
javac -cp C:\Users\MyName\Desktop ProgA.java
答案 1 :(得分:1)
要使用其他包中的类,您需要使用完全限定的类名,或者使用import
语句。这是.java
源代码要求。它不能简单地通过摆弄编译器的类路径来修复。
如果没有import语句,则假定非限定名称属于当前源文件的包。如果您位于package test
文件中,则标识符ProgB
将与test.ProgB
匹配,但不会与test2.ProgB
匹配。除非你告诉它,否则编译器不会搜索其他包。