package abc;
public class One{
public int i;
One(int j){
this.i = j;
}
void outPrn(){
System.out.println("----------" + i);
}
}package abc;
public class Two{
public static void main(String args[]){
One t = new One(12);
t.outPrn();
}
}javac One.java 时没问题,当javac Two.java的时候却出现了问题。提示找不到类文件One,这是怎么回事?两个文件都在同一包abc下。大家可以运行一下,就会发现问题。
public class One{
public int i;
One(int j){
this.i = j;
}
void outPrn(){
System.out.println("----------" + i);
}
}package abc;
public class Two{
public static void main(String args[]){
One t = new One(12);
t.outPrn();
}
}javac One.java 时没问题,当javac Two.java的时候却出现了问题。提示找不到类文件One,这是怎么回事?两个文件都在同一包abc下。大家可以运行一下,就会发现问题。
解决方案 »
- 关于toString() 的问题
- java 新手的困扰 希望高手指点
- java Swing 打印发票问题。。。。
- is it look good?
- 这个怎么打印出来呢??请大家帮忙@@@@
- J2SE问题The type MyChessFrame must implement the inherited abstract 疑惑中~~~求高手相助
- 谁能给我一个PipedInputStream and PipedOutputStream 怎么用的例子,我想用数据库image字段对另一个imaeagezi字段
- 如何能显示动画gif文件的一帧
- 我的Jbuilder怎么引用我自己编写的Class文件?
- 关于饿汉式的一个小问题
- JAVA静态变量的问题.
- oracle的jdbc驱动必须安装?还是只要在ClassPath里指定了几个.jar包 就可以用了?
-------------------------------
C:\One>javac Two.javaC:\One>java Two
----------12C:\One>
--------------------------------------------------------输出结果如下
-------------------------------
C:\One>javac Two.javaC:\One>java Two
----------12C:\One>
-----------------------------------------------------------
我只想在生成class文件后在包abc下执行One.java 和Two.java 解析后 生成的class文件都放在包abc下,为什么在abc下执行Two时会出错呢。
例如:
在命令行输入
d:\abc\java Two
现在包abc下的class文件都是解析完的,直接运行不可以吗?d:\abc\java Two
各位能告诉我为什么吗?谢谢了
c:\abc\One.java
c:\abc\Two.java (先不管系统的那个CLASSPATH变量)
你在Two中引用了One,其实不用先编译One再编译Two,而是直接编译Two就行了,这是Java的特性,事实上如果你在Two中引用了很多,有One Three Four,难道你一个个先编译它们?
现在说编译.
要注意你这个类One和Two都声明了在包abc中.如果你在c:\abc\目录下编译是通不过的.你可能想这样:javac Two.java,但是会提示你找不到One.java.你会想了这个类是在abc目录下呀,不就是在包abc中吗,这样想就错了.如果你真想在c:\abc\目录下编译我建议你这样做:
建一个目录abc,即形成c:\abc\abc\,把两个文件都放进去c:\abc\abc\One.java Two.java
然后javac -sourcepath . abc\Two.java.我解释一下sourcepath表示要在后面的路径中找到Two.java中用到的其它类,这里是One.那个 .(点) 表示是当前目录,你会说当前目录也就是c:\abc\中没有One啊,但是One是在包abc中的,所以JVM在当前目录下找到包abc再找到里面的One.java.后面的abc\Two.java是告诉JVM在Two.java是在哪里.这样,会在c:\abc\abc\下得到One.class和Two.class,现在明白了吗,第二个abc才被JVM认做是package abc.
如果是在c:\下编译这样javac -sourcepath . abc\Two.java. sourcepath参数可以不要.此时JVM就把abc文件夹当作是package abc.这样,会在c:\abc\下得到One.class和Two.class.
下面来运行.如果你现在理解了包那么对这句就不会感到奇怪:
java -cp . abc.Two
解释一下 cp表示要在后的路径中找到Two用到的其它类,这跟上面sourcepath差不多,但不能省略(如果你没有设置CLASSPATH变量). abc.Two这是完整的类名:包名.类名 你不是说Two属于包abc吗,那就得带上它.
原因很简单,若在abc下运行java Two,类加载器会根据源文件用的包名abc,在当前的abc目录下再去找子目录abc中的Two.class来加载,当然找不到!
若在abc的上级目录下运行java abc/Two,则类加载器可以找到abc目录下的Two.class文件
回复人:tcpipokokok() ( 一级(初级)) 信誉:100
回复人:sonyejin(春去春又来) ( 二级(初级)) 信誉:99
你们的是正解!万分感谢各位!谢谢大家的参与!!
谢谢!!
javac abc/Two.java //One.java 也被编译
java abc/Two顺利通过