use*_*872 8 java import package
最近开始学习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");
}
}
Run Code Online (Sandbox Code Playgroud)
//And then the class App utilizing the class A
import com.test.helpers.*;
public class App{
public static void main(String args[]){
A a = new A();
a.sayHello();
}
}
Run Code Online (Sandbox Code Playgroud)
我将这两个文件放在名为"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
Run Code Online (Sandbox Code Playgroud)
但问题似乎有两种解决方法,
如果你能解释这里发生的事情,我将非常感激.或者我可能会犯一个愚蠢的人为错误或语法错误.
非常感谢你
将文件夹JavaTest下的A.java移动到com/test/helpers.您看到的错误是编译器抱怨A.java位于与其包声明不匹配的文件夹中.请记住,如果没有A在包中,您无法从应用程序访问A.
从src driectory下面运行以下命令来编译你的类
src> javac ./*.java ./com/test/helpers/*.java
Run Code Online (Sandbox Code Playgroud)
然后从src文件夹下
src>java App
Run Code Online (Sandbox Code Playgroud)
应该运行你的程序.
嗨,这里的问题是 JVM 由于ambiguous目录(JavaTest以及com.test.helpers目录)中的类文件名而混淆了类文件。
当你这样做时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 语句 ie 导入特定文件,import com.test.helpers.A;或者如果您想这样做,import com.test.helpers.*;那么您必须专门使用com.test.helpers.A代替A当前类实现中的任何地方来告诉编译器不要将其与来源混淆JavaTest
我知道这个特定答案为时已晚,但我想与即将到来的读者分享我的观点,如果它可以以任何方式帮助他们,那就太好了。谢谢!
文件 A.java 应该位于路径 JavaTest\com\test\helpers\A.java 中
并且不要忘记像这样编译它: javac -d 。com\test\helpers\A.java