处学Java请教关于package的问题

Jackstraw 2002-12-24 05:01:40
CLASSPATH和PATH都已经设定有了F:\javaprogram; 所有源码文件均在此目录下
想要实践一下关于包的知识,在testPack.java中写下
package com.testpack.util;

public class testPack{
.
.
public static int test(int i, int j)
{
return i+j;
}
}

在F:\javaprogram>下使用java -d . testPack.java编译通过,并且成功的创建了子目录而且.class文件正确产生
在另一个fortest.java中引用import com.testpack.util.*;
在class fortest的main函数中如下调用
testPack.test(1, 3)
出现错误如下:
不能解析符号:方法test(int, int)
位置:类 in testPack
testPack.test(1,3);
^
1个错误

如果改成import com.testpack.util.testPack;则程序没有任何问题,而且运行正确


这是怎么回事儿呢?
...全文
78 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jackstraw 2002-12-26
  • 打赏
  • 举报
回复
哦,我明白了,谢谢,原来是先找当前目录下的,真让人郁闷!好的,谢谢大家,马上结贴
coaa 2002-12-26
  • 打赏
  • 举报
回复
package的机制是优先找当前目录下的文件,再去找com\jswlee\util\的.
deniswang 2002-12-26
  • 打赏
  • 举报
回复
该问题已经解决。呵呵。如coaa(我吃多了) 老兄所说。我尝试了一下,果真如此。不过coaa说的不太清楚而已。

1.我尝试用javac -verbose来编译fortest。发现编译过程中,他发现有import*,就会在当前目录下【注:当你在classpath中包含了当前目录的情况下】查找所有包含在com.testpack.util包中的源文件并进行编译,当发现testPack.java,并且时间戳比class新,便会尝试进行编译,当然,由于没有使用-d参数,他无法正常编译该源文件,便放弃,继续进行fortest.java的check动作,当发现fortest使用了testPack后,就报错:can not resolve symbol。呵呵。

2.注意,当你在fortest.java中使用import具体包名时,他的动作顺序就不一样了。
他首先查找classpath下是否有符合该包名的路径,如果找到,就进去看是不是有testPack.class,如果没有,再找源文件进行编译,当然,我们的情况是肯定可以找到testPack.class的,呵呵。因为已经编译好了的么。当这一步完成后,再进行fortest.java的check动作,从而顺利通过编译。

所以,楼主可以尝试把这两个源文件(testPack.java、fortest.java)放在不同的目录中,就肯定可以通过编译。

不知道我表述的清楚不?如果不清楚,可以和我联系(deniswang@sina.com)。呵呵。希望和大家多多交流,共同进步。
感谢coaa(我吃多了)提出的宝贵思路。

我已经试过了,没问题。
ps:jdk真的很白痴。
风-君子 2002-12-26
  • 打赏
  • 举报
回复
Mytest文件位置错误根据包com.testpack.util,位置应该是com\testpack\util\下;包指的是路径不是随便命名的
tonycrow 2002-12-26
  • 打赏
  • 举报
回复
我想如果把这两个java先放外面编译,编译完一个后把此class文件放到包的文件夹中,再编译另一个java.
或许能编译通过.
Jackstraw 2002-12-26
  • 打赏
  • 举报
回复
确实是这样,可是按照Thinking in Java中自动编译一节的说法,
为导入的类首次创建一个对象时(或者访问一个类的static成员时),编译器会在适当的目录里寻找同名的.class文件(所以如果创建类X的一个对象,就应该是X.class)。若只发现X.class,它就是必须使用的那一个类。然而,如果它在相同的目录中还发现了一个X.java,编译器就会比较两个文件的日期标记。如果X.java比X.class新,就会自动编译X.java,生成一个最新的X.class。对于一个特定的类,或在与它同名的.java文件中没有找到它,就会对那个类采取上述的处理。

这段话的意思好像是应该在导入的包中也就是com\jswlee\util\寻找比较新的java源码文件吧,它怎么在F:\javaprogram中寻找起来了?
mengqifeng 2002-12-26
  • 打赏
  • 举报
回复
应该先建一个testPack对象t,然后再引用t.test(1,3);
coaa 2002-12-26
  • 打赏
  • 举报
回复
应该是我说的那样吧,我也试了一次了.
Jackstraw 2002-12-26
  • 打赏
  • 举报
回复
如果将上述代码中的int result=Mytest.test(1,3);改为
int result=com.jswlee.util.Mytest.test(1,3);就是正确的,这是为什么?

如果将上述代码中的import com.jswlee.util.*;改成
import com.jswlee.util.Mytest;不修改int result这一句也是成功的,这又是为什么呢?

多谢指教!
jery_lee 2002-12-26
  • 打赏
  • 举报
回复
surprise!
Jackstraw 2002-12-26
  • 打赏
  • 举报
回复
大家可以看看用这个代码试一下,
//Mytest.java
package com.jswlee.util;
import java.util.*;
public class Mytest
{
public static void main(String args[])
{
System.out.println("main function for the class packed
in the package");
}

public static int test(int i, int j)
{
return i+j;
}
}

//TestMytest.java
import com.jswlee.util.*;
class TestMytest
{
public static void main(String args[])
{
int result=Mytest.test(1, 3);
System.out.println("Result is : "+result);
}
}

javac -d . Mytest.java
java com.jswlee.util.Mytest 运行成功
javac TestMytest.java失败,错误如下

TestMytest.java:8: 不能解析符号
符号:方法 test (int,int)
位置:类 in Mytest
int result=Mytest.test(1, 3);
^
1 个错误

环境:J2SDK 1.3.0
CLASSPATH和PATH均设置没有问题
zxhong 2002-12-26
  • 打赏
  • 举报
回复
好象没有实例化啊!
testPack testp=new testPack();
testp.test(1,1);

you may test it!
coaa 2002-12-26
  • 打赏
  • 举报
回复
关键是你的两个java文件都放在了F:\javaprogram下面了,把testPack.java剪贴放在他打包的目录下面,就不会有编译错误了.

因为他会首先找当前目录下面的java文件,发现有该java文件后,就会编译,当然不会象javac -d 的结果,采用类似于make机制的东西,去make他.结果你的java文件是package了,所以应该fortest应该找不到了.
liusuanse 2002-12-26
  • 打赏
  • 举报
回复
gz
deniswang 2002-12-26
  • 打赏
  • 举报
回复
我也不相信,但是按照楼主的代码试了一遍,果然如此。即使命名规范也一样出问题。

还请高手指点迷经。

mark。。。。。up。。。。。。
zl_215 2002-12-26
  • 打赏
  • 举报
回复
gz
wang_zheng_wz 2002-12-25
  • 打赏
  • 举报
回复
不如贴出所有相关程序看看
unlock_2000 2002-12-25
  • 打赏
  • 举报
回复
我从来没想过会有这种问题,我还不信呢,因为我用过啊!
可是刚试了确实是这样,等待高手回答.
Jackstraw 2002-12-25
  • 打赏
  • 举报
回复
to zxhong,
我已经import了,还需要这样用整个的路径名称?

to jihaihan,
我改了名字错误依然出现,无法解析静态公共方法test(int,int),为什么呢?请教了,谢谢
jihaihan 2002-12-24
  • 打赏
  • 举报
回复
没什么,你的类名不符合命令规范而已。

把 public class testPack{
改成 public class TestPack{
加载更多回复(6)

62,615

社区成员

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

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