首先,我们先来了解有包名的类的存储目录
如果一个类有包名,那么我们就不能任意位置存放它,不然虚拟机将无法加载它。如果程序使用了如下的包语句:
package cn.edu;
那么,存储文件的目录结构中必有如下的结构:······\cn\edu,例如:E:\test\cn\edu,并且要将源文件编译得到的字节码文件保存在E:\test\cn\edu 中,(源文件可以任意存放)。如果源文件保存在E:\test\cn\edu 中,那么编译后得到的字节码文件就会默认地保存在E:\test\cn\edu 中。
编译源文件:E:\test>javac cn\edu\源文件
运行主类:E:\test>java cn.edu.主类名 (使用了包名,运行时就必须写主类的全名:“包名.主类名”)
下面我用个例子来演示:
新建文件夹,如:
在E盘建一个test文件夹,在test下建一个cn文件夹,在cn下建一个edu文件夹。
在edu的文件夹里放置java源文件
package cn.edu;
public class Student{
int number;
Student(int n){
number=n;
}
void speak(){
System.out.println("我是一名学生,学号是"+number);
}
}
package cn.edu;
public class Test{
public static void main(String args[]){
Student stu=new Student(111111);
stu.speak();
}
}
进入cn\edu的上层目录test中编译
方法一:
E:\test>javac cn\edu\Student.java
E:\test>javac cn\edu\Test.java
方法二:进入 E:\test\cn\edu 目录中,使用通配符 “ *”编译所有的源文件
E:\test\cn\edu>javac *.java
方法三:不需要新建 cn 和 edu 这两个文件夹,将源码放在test文件夹下。
E:\test>javac -d . *.java
执行该命令自动生成子目录。
方法一、方法二编译后结果如下:
方法三编译后结果如下:
运行:必须到 cn\edu 的上一层目录test中来运行。
E:\test>java cn.edu.Test
运行的结果:我是一名学生,学号是111111