已知classpath="c:\1000;.;",其中.表示当前路径,不用多说,现有下边两个类:
package p;
class p1{
String s="change";
public void show(){
System.out.println(s);
}
}
保存为c:\1000\p\p1.java,暂时不编译它。
另外一个类:
package p;
class p2{
public static void main(String args[]){
p1 a=new p1();
a.show();
}
}
保存为c:\1000\p\p2.java,然后编译c:\1000\p>javac p2.java,运行c:\1000>java p.p2,一切正常,注意要在c:\1000>下运行才可以。
请问,1、在编译时和运行时,java是如何找到类p1的,注意在编译p2.java时也编译了p1.java,请说说找到 类 p1的完整类路径。(我认为在编译时是通过classpath=.; 这个当前路径c:\1000\p>找到类p1的,那么运行时呢??)2、如果将p2.java文件中第一行的package p;去掉,则出错,但编译时也可以通过classpath=.; 这个当前路径c:\1000\p>找到类p1呀??3、在第2的基础上,加上import p.*也出错,为什么?是classpath=.;的问题,为什么呢??但import p.p1则正确。谁可以完整地说说java在处理类路径和包时的执行过程是怎样的??
如何处理classpath="c:\1000;.;",import p.*,有这方面地详细资料或书籍吗?
有哪本java书在一些细节问题上说的很详细的(像c++Primer Plus则本书就很好,讲的很透彻,而且错误很少,还是老外的书写地严谨)??

解决方案 »

  1.   

    问题好复杂, 我知道一些或许有帮助。 我现在用netbeans,什么都不操心了。。java就是根据classpath找到相关的类的,在这里面就是classpath="c:\1000;.;"
    如果没有设置输出路径的话, 那p1类的路径就是"c:\1000\p1.class"。被import的类必须是public才能被不同包中的其他类访问,在这个例子中,p2,p1在不同的包中,所以不能访问。被引用的类必须[p1]向编译,否则找不到p1的类。但如果p1是interface 或super class的话,好像会自动编译,我不确定。
      

  2.   

    你所说的问题,完全就是CLASSPATH的问题
    要运行一个类,首先要告诉运行环境这个类在哪,java就是用classpath,各种IDE向Programmer屏蔽了这个问题,只不过以一种方式标记classpath而已,如果你不用IDE开发,这种问题就得自己解决,所以,关于找到,找不到各种类的问题,就是classpath,没什么高深
    可以想象你是一个虚拟机,当有人让你装载一个类,你肯定会问,它在哪呢?
    JF
    Eclipse 对Classpath的解决是,每一个项目的根目录都有一个。classpath 的XML文档
    <?xml version="1.0" encoding="UTF-8"?>
    <classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="src" path="res"/>
    <classpathentry kind="con" path="J2MELIB"/>
    <classpathentry kind="output" path="bin"/>
    </classpath>