1。我先在E:\JAVA\ 目录下新建了一个文件夹p1,然后我将三个.java文件保存在此文件夹里,我通过命令行方式编译并且通过了。接着,我又在E:\JAVA\ 下新建了文件夹p2,然后将二个.java文件放到此文件夹里,这两个.java文件都调用了p1中的类,我仍然在命令行下编译,但是出现编译错误,提示找不到p1,我将P1复制到p2里,再次编译运行,这次通过了,我想知道这是怎么回事???
2。还有就是在命令行方式下编译的时候,为什么必须把同一包中的所有.java文件一次性通过javac编译,而不能一个一个的分别编译呢???
2。还有就是在命令行方式下编译的时候,为什么必须把同一包中的所有.java文件一次性通过javac编译,而不能一个一个的分别编译呢???
我用JCreator编译的时候,p1和p2不存在包含,也能通过编译没出现错误,这是为什么呢???
你要是这样说的话,我基本上可以确定是你的classpath设置为:E:\JAVA\p2了,你可以仔细检查一下这一方面。我用JCreator编译的时候,p1和p2不存在包含,也能通过编译没出现错误,这是为什么呢???
用IDE不需要考虑包的问题,因为IDE会帮助你自动加上必需的参数。
先编译p1中的.java文件:
E:\JAVA\p1>javac SamePackage.java Protection.java Derived.java Demo.java(编译通过)
然后:
E:\JAVA\p1>cd..
E:\JAVA>java p1.Demo(显示出正确结果)再编译p2中的.java文件:
E:\JAVA\p2>javac Demo.java OtherPackage.java Protection2.java(编译通不过)
错误信息:
Protection2.java:2: package p1 does not exist
class Protection2 extends p1.Protection
^
OtherPackage.java:6: package p1 does not exist
p1.Protection p=new p1.Protection();
^
OtherPackage.java:6: package p1 does not exist
p1.Protection p=new p1.Protection();
^
Protection2.java:9: cannot resolve symbol
symbol : variable n_pro
location: class p2.Protection2
System.out.println("n_pro="+n_pro);
^
Protection2.java:10: cannot resolve symbol
symbol : variable n_pub
location: class p2.Protection2
System.out.println("n_pub="+n_pub);
^
5 errors接着我将包p1整个复制到包p2中再次编译:
E:\JAVA\p2>javac Demo.java OtherPackage.java Protection2.java(这次编译通过了)
E:\JAVA\p2>cd..
E:\JAVA>java p2.Demo(得到正确结果)这到底是什么原因呢?
package p1;
class文件就应该位于E:\JAVA\p1
-----这个不就是指的当前路径吗?那我在命令行方式下直接进入E:\JAVA\p2 进行编译,这不就是在文件的当前路径下编译吗?把classpath中的.;去掉,换成E:\JAVA\;,再编译。
-------如果是因为这个原因,那为什么p1中的文件能通过编译呢?
class文件位于E:\JAVA\p2中;可是我还是不知道这是为什么,为什么我不改classpath它就找不到p1包呢?
javac在编译Protection2.java时,
遇到p1.Protection,
会去找p1/Protection.java这个文件
jre/lib和jre/lib/ext下是系统缺省去找的
当然没有
然后从当前目录找,没有
如果你在CLASSPATH中设置E:\JAVA
则就去找E:\JAVA\p1\Protection.java
这样就会找到,否则找不到,错误2.只要你编译想要被java执行的主类文件就可
编译器会自动去寻找引用的.java文件,并进行编译
另外你也可 javac *.java
这个E:\JAVA\p2就是当前目录
另如果你不进入到E:\JAVA\p2中去编译
在E:\JAVA中,这时当前目录为E:\JAVA,编译器也会找到相应的文件
javac p2\*.java,也可通过
这样CLASSPATH就不需要加上E:\JAVA
还有一点,是直接指定类查找路径javac -classpath E:\java Demo.java OtherPackage.java Protection2.java