今天学java的package的时候
感觉书上写的有点太简略,没法理解package的精髓所在
所以查了一下
发现也没有能让我顿悟的博文
于是自己试了试
过程有点曲折,所以我只说自己对package的理解
首先要理解
如果在某个路径下打开终端
那么该路径就是绝对路径
然后这个绝对路径下呢,你编译一个java文件,恰巧这个java文件里有package p1.p2;
那么电脑就会寻找 绝对路径\p1\p2下的所有需要的类文件
注意,这些类文件里面也必须要有 package p1.p2;
因为这些类文件编译之后生成的字节码 也要从绝对路径走过来
我们做个实验
这个是Student.java
public class Student{
int number;
Student(int n){
number=n;
}
void speak(){
System.out.println("Student类的包名是tom.jiafei,我的学号:"+number);
}
}
这个是Example4_15.java
package jiafei;
public class Example4_15 {
public static void main(String args[]){
Student stu=new Student(10201);
stu.speak();
System.out.println("主类的包名也是tom.jiafei");
}
}
现在它们都放在tom文件夹下
此时我们直接编译Example4_15.java肯定会出错的
因为Example4_15.java里面有package jiafei;
所以电脑会寻址到 Tom\jiafei去寻找需要的student类(现在jiafei文件夹是空的)
好的,那你说把Student.java移动到jiafei总可以吧
但是试一试发现也不行
为什么呢?
因为你是在tom文件夹下打开的终端,所以系统编译在jiafei文件夹里的Student.java的时候呢生成的字节码就是没有路径的,也就是默认在tom文件夹起作用
而Example4_15.java需要的是在tom\jiafei起作用的Student.class
所以我们需要在Student.java里加package jiafei;
这样就没问题了
其中我还发现个有意思的东西
如果是用终端去编译Student.java,不论文件里是否用了package,它的字节码都会生成在Student.java所在的文件夹里
而如果用JC去跑一下Student.java,虽然会报错但是它的字节码会生成在package所指向的文件夹里
我觉得可能是读写权限的原因?
不太清楚,但是至少弄懂了package