为什么不奇怪?应该不用导入全名呀,为什么用import com.testpack.util.*就不可以呢?

解决方案 »

  1.   

    如果不在同一包下
    必须要
    com.testpack.util.testPack test=new  com.testpack.util.testPack()
    test.test(1,1);
      

  2.   

    没什么,你的类名不符合命令规范而已。把   public class testPack{
    改成 public class TestPack{
      

  3.   

    to zxhong,
    我已经import了,还需要这样用整个的路径名称?to jihaihan,
    我改了名字错误依然出现,无法解析静态公共方法test(int,int),为什么呢?请教了,谢谢
      

  4.   

    关键是你的两个java文件都放在了F:\javaprogram下面了,把testPack.java剪贴放在他打包的目录下面,就不会有编译错误了.因为他会首先找当前目录下面的java文件,发现有该java文件后,就会编译,当然不会象javac -d 的结果,采用类似于make机制的东西,去make他.结果你的java文件是package了,所以应该fortest应该找不到了.
      

  5.   

    好象没有实例化啊!
    testPack testp=new testPack();
    testp.test(1,1);you may test it!
      

  6.   

    大家可以看看用这个代码试一下,
    //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均设置没有问题
      

  7.   

    如果将上述代码中的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这一句也是成功的,这又是为什么呢?多谢指教!
      

  8.   

    应该先建一个testPack对象t,然后再引用t.test(1,3);
      

  9.   

    确实是这样,可是按照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中寻找起来了?
      

  10.   

    我想如果把这两个java先放外面编译,编译完一个后把此class文件放到包的文件夹中,再编译另一个java.
    或许能编译通过.
      

  11.   

    Mytest文件位置错误根据包com.testpack.util,位置应该是com\testpack\util\下;包指的是路径不是随便命名的
      

  12.   

    该问题已经解决。呵呵。如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)放在不同的目录中,就肯定可以通过编译。不知道我表述的清楚不?如果不清楚,可以和我联系([email protected])。呵呵。希望和大家多多交流,共同进步。
    感谢coaa(我吃多了)提出的宝贵思路。我已经试过了,没问题。
    ps:jdk真的很白痴。
      

  13.   

    package的机制是优先找当前目录下的文件,再去找com\jswlee\util\的.