当我们已经设置-classpath来定位该文件时,必须完全限定类名吗?

时间:2016-10-07 18:23:44

标签: java

示例:

我有一个名为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的概念和完全限定的类名。请解释一下。谢谢

2 个答案:

答案 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匹配。除非你告诉它,否则编译器不会搜索其他包。