Java包的问题,如何在包外面访问包中的类.

人工智能-张晨光
优质创作者: 前端开发技术领域
领域专家: 后端开发技术领域
2007-12-10 06:26:18
package domain;
public class Company
{
private String sName;//公司名
public Company(String sName){
this.sName=sName;
System.out.println(sName);
}
}
=======================
上面执行生成包命令后,继续下面一个在domain包外的类,但是出现了问题,郁闷哦.
import domain.*;
//为什么domain.*就出问题呢?但是换成类名就不出问题了???
class Test
{
public static void main(String[] args)
{
Company niit=new Company("牛公司");
}
}
-=-============错误
Test.java:8: cannot access Company
bad class file: .\Company.java
file does not contain class Company
Please remove or make sure it appears in the correct subdirectory of the classpath.
Company niit=new Company("牛公司");
...全文
463 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangshaojun 2007-12-10
  • 打赏
  • 举报
回复
这个环境变量设置的问题啊,
在这里就多罗嗦一下环境变量了(WINDOWS下),
JAVA_HOME是JDK总的目录;
PATH是各种JAVA命令的目录,比如javac、javadoc、jar、java等等的命令;
CLASSPATH是自己编写的类库的目录,自己编写的类库就放在这里。
PATH可以放JAVA各种命令绝对路径,比如是D:\Program Files\Java\jdk1.6.0_02\bin;
这样就不用在JAVA_HOME里面在设置JDK总的路径了。
CLASSPATH放自己编写的类库也是一样,可以存放绝对路径。

最好用javac -d path Company.java 格式去编译这个Company.java文件,这个path就用CLASSPATH环境变量里面的绝对路径,
编译后可以去这个绝对路径下边,有一个domain包,包里有一个Company.class,
这样编译Test.java时就可以找到那个Company.class文件了。
zhangbaokun 2007-12-10
  • 打赏
  • 举报
回复
以我的经验,删了或者移动就好了,classpath的问题,一般说不清楚,用编译器管理不会出现问题
Clesome_VC 2007-12-10
  • 打赏
  • 举报
回复
学习了
cursor_wang 2007-12-10
  • 打赏
  • 举报
回复
你的问题我知道了,一下很难解释,给你看篇文章你就会明白了.不懂再问.

首先新建一个目录存放Java源文件,或者直接在某个盘符下放置程序,例如:D:\,然后按照下面的步骤进行实验(本实验在D:\目录下操作)。

Step1:编写程序World.java,代码如下:

package a;



public class World

{

public World()

{

System.out.println(", World!");



}

}

Step2:编写Hello.java,代码如下:

import a.World;



public class Hello

{

public static void main(String[] args)

{

System.out.print("Hello");

World world = new World();

}

}

Step3:将两个程序保存到你所建的目录下,在这里,我们将它们保存到D:\下。

Step4:编译这两个Java源文件

先编译World.java,执行javac -d . World.java,在D盘生成目录a,及其中的World.class。接下来编译Hello.java,执行javac Hello.java,在D盘上生成Hello.class。

Step5:运行Hello类

执行java Hello,输出Hello, World!目前一切正常。

Step6:修改Hello.java

将第1行的语句“import a.World;”改为“import a.*;”,重新编译Hello.java,出现下面的错误提示:

错误的类文件: .\World.java

文件不包含类 World

请删除该文件或确保该文件位于正确的类路径子目录中。

World world = new World();

^

Step7:根据错误提示进行下列操作

按照错误提示,删除 World.java 或者将 World.java 放到其他地方,则程序成功编译运行。

问题:

请问为何会出现Step6中的错误呢?使用 “import a.*;”导入a下所有类和接口,和使用“import a.World;”导入a包中具体的类,为何会产生上述的差异呢?

回答
当你导入一个包中所有的类时,javac在编译时并不确定你要使用的World类是a包中的类,还是其他包中的类,它会根据你机器上的CLASSPATH环境变量的值去查找类,通常我们在CLASSPATH中会设置一个点(.),表示当前目录,如果没有CLASSPATH环境变量,那么在JDK1.4之后,默认也是查找当前目录。javac在按照文件名(不包括后缀)来查找类,于是找到World.java,而这个文件根本不是字节码文件,当然就报错了。当你导入一个具体的类时,javac在分析源文件时就知道了你程序中用的类是a.World,那么它就在CLASSPATH环境变量下查找a目录下的World类,正好有,于是正确执行。

为了帮助读者对这个问题加深理解,我给大家设计了下面的操作步骤(本文是在D盘上操作):

(1)将a目录剪切到C:\下;
(2)再次执行javac Hello.java,你会看到同样的错误。也就是证实了在出错之前,javac还没有去查找a包中的类(对于包是否存在的验证已经进行)。
(3)执行set classpath=c:\。由于你明确地设置了CLASSPATH环境变量的值,并且没有包含点(.),因此javac不会再查找当前的目录。
(4)再次执行javac Hello.java,你会发现成功执行。

这里面还有一个有趣的现象,如果我们将a目录下的World.class删除,替换为World.java,那么在编译Hello.java时,World也会被自动编译。
qixueqi 2007-12-10
  • 打赏
  • 举报
回复
感觉上可以
为什么不行
关注
庚武讲堂 2007-12-10
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20071127/18/184236b1-10c3-4f27-9682-45d56034d2bd.html
俺也和你遇到同样的问题,我也不像你这么重视这个问题。知道这样不行就可以了!~
没办法,不能偷懒,import domain.Company; ^.^

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧