标题:[求助]关于引用包中文件的问题
只看楼主
yfann
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2007-3-23
 问题点数:0 回复次数:2 
[求助]关于引用包中文件的问题
两个文件
Mypackage.java

package mypackage;
public class Mypackage{
public void get(){
System.out.println("congratulations");
}
}

main.java

import mypackage.*;
public class main{
public static void main(String args[]){
Mypackage a=new Mypackage();
a.get();
}
}
编译main.java时出错
*改为Mypackage时能正常编译,是什么问题
搜索更多相关主题的帖子: Mypackage public main 文件 get 
2007-04-18 19:55
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
得分:0 
用IDE试试就知道了

你应该把源文件和类文件都用文件夹组织好,就OK了

可惜不是你,陪我到最后
2007-04-19 09:16
yfann
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2007-3-23
得分:0 

问题解决了,以下是引用的一篇贴子,和我的问题一样,是初学者容易犯的错误

问题
首先新建一个目录存放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也会被自动编译。

2007-04-19 14:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-132965-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.132817 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved