标签:生成 实验 container cmd sele 分享图片 解决 sel 表示
最近写Java实验报告的时候遇到了编译包的问题,很烦。。。
问题:编写一个类A,它位于包a中,保存到A.java中,再编写一个类B,它位于包b中,保存到B.java中。在类B中实例化类A的一个对象。分别编译类A和类B。
使用IDE编译很方便,按要求建包再编译就可以,但要是使用cmd就有一些坑。。。
首先我们建立如下的包关系:
包a:包b、A.java;包b:B.java(B中需要用到类A的对象,所以编译时一定要先编译A.java,再编译B.java)
包a放在D盘中javacode文件夹中,位置是:"D:\javacode\a";
错误编译方法:首先到包a的位置:"D:\javacode\a",先编译A.java,成功编译,生成A.class;再编译B.java,提示找不到类A
至于为什么会出错?我想了很久才明白,我们理一下整个编译过程:(仔细体会)
编译A.java时,首先要找到A.java在哪里?此时我们的位置是"D:\javacode\a",A.java就在a的直接目录下,此时系统能找到A.java,所以直接使用"javac A.java"进行编译,会在这个位置生成A.class;然后编译B.java时,B.java位于包a中的包b里,这时系统在这个位置就找不到B.java了,我们需要进入包b才能找到B.java,所以我们这样写:"javac b\B.java";但是却提示不能找到类A,为什么呢?我们需要弄明白它是怎么找类A的?B.java使用import语句把类A添加到B.java中,我们看import语句怎么写的就知道系统是怎么找类A的了,import a.*意味着我们要先找到包a,我们现在的位置是:"D:\javacode\a",但是在这个位置是找不到包a的,可能有人会疑惑这不就是包a的位置吗,怎么会找不到包a?其实真的找不到,此时系统在这个位置能看到的只有包b、A.java和A.class,是无法找到包a的(如下图所示),所以就出错了。
那我们怎么解决这个问题呢?我目前只知道两种解决方法,如果有其他方法的欢迎补充
方法一:使用-d编译
格式:javac -d<位置a> A.java
表示的意思是在位置a里生成一个同包名(你需要编译的包的包名)的包,包里面只包含编译后的class文件
一般使用:javac -d . A.java(‘.’表示当前位置,‘.’两边有空格不能省略)
使用这种方法进行编译:
编译后:在包a里又产生了一个和a同名的包,这样在编译B.java时就能找到包a了,而且包a里有A.class
我们打开新产生的包a:新包与旧包有相同的结构,里面有编译A.java产生的A.class文件、包b;包b中有编译B.java产生的B.class
打开包b:包b中有编译B.java产生的B.class
方法二:我们不进入要编译包的这一层,而是上一层
我们只进入到"D:javacode",而不是"D:javacode\a",这样做是为了编译B.java时能找到包a,我们在包a的上一层就能看到包a了,这么做不会产生新包,只是在java文件的位置产生class文件
编译过程:
包a的变化:
包b的变化:
标签:生成 实验 container cmd sele 分享图片 解决 sel 表示
原文地址:https://www.cnblogs.com/AcTarjan/p/9699013.html