最近为了考试开始学习Java。
在学习软件包时,尝试了这个并收到错误消息。我所做的是
//Creating class A (Within package the package: com.test.helpers)
package com.test.helpers;
public class A {
public void sayHello(){
System.out.println("Hello World");
}
}
//And then the class App utilising the class A
import com.test.helpers.*;
public class App{
public static void main(String args[]){
A a = new A();
a.sayHello();
}
}
我将这两个文件放在名为“JavaTest”的目录中(在 Windows 7 上),并首先使用命令
javac -d . A.java
编译了 A.java
然后,在尝试编译 App.java 时,我收到以下错误消息:
App.java:5: error: cannot access A
A a = new A();
^
bad source file: .\A.java
file does not contain class A
Please remove or make sure it appears in the correct subdirectory of the source path.
1 error
但是,问题似乎可以通过两种方式解决,
import com.test.helpers.*;
更改为 import com.test.helpers.A
App.java
。如果您能解释一下这里发生的情况,我将不胜感激。或者我可能会犯一个愚蠢的人为错误或语法错误。
您好,这里的问题是,由于两个目录(
ambiguous
和 JavaTest
目录)中的 com.test.helpers
类文件名,JVM 混淆了类文件。
当你这样做时
javac -d . A.java
编译器会在目录 com.test.helpers
中创建一个类文件,现在它将它与 JavaTest
中的源文件混淆
Deleting the Source file A.java
当您从
A.java
中删除源文件 JavaTest
时,JVM 现在知道要使用 com.test....
中的类文件,歧义就消失了。
Changing the import statement from 'import com.test.helpers.*;' to 'import com.test.helpers.A' in the file, 'App.java'.
在这里,您指定在类实现中使用哪个特定文件,即告诉编译器使用来自
A.java
的文件 com.test...
,而不是来自 JavaTest
包
现在,这种歧义的解决方案对您来说永远不会成为问题,您必须使用 import 语句导入特定文件,即
import com.test.helpers.A;
或者如果您想做 import com.test.helpers.*;
那么您必须专门使用 com.test.helpers.A
代替A
在当前类实现中的任何地方,告诉编译器不要将其与 JavaTest
处的源混淆
我知道这个特定的答案已经很晚了,但我想与即将到来的读者分享我的观点,如果它能以任何方式帮助他们,那就太好了。 谢谢!
将JavaTest文件夹下的A.java移至com/test/helpers。您看到的错误是编译器抱怨 A.java 所在的文件夹与其包声明不匹配。请记住,如果 A 不在包中,您就无法从 App 访问 A。
从 src 目录下运行以下命令来编译你的类
src> javac ./*.java ./com/test/helpers/*.java
然后从 src 文件夹下
src>java App
应该运行你的程序。
文件 A.java 应该位于 JavaTes 路径中