Java平台概述(下)
管理原始码与位码
分目录管理
期望原始码都整理在一个目录src下,而位码都输出到classes目录下。同时注意到存在的问题:实际项目中有数以万计的类,如果每次都要重新将.java编译成.class,那会是非常费时的工作。
例如:
(1).编辑
添加 src/Console.java 文件1
2
3
4
5class Console{
public static void writeLine(String text){
System.out.println(text);
}
}
添加 src/Helloworld.java 文件1
2
3
4
5class Helloworld{
public static void main(String args[]){
Console.writeLine("Hello World");
}
}
(2).编译1
$ javac -sourcepath src -d classes src/Helloworld.java
-sourcepath
用于向编译程序(javac)指定源文件的搜索路径,也就是原始码的位置。-d
指定放置生成的类文件的路径,也就是位码的位置。如果再用-verbose
监测,可以看到大致的过程是:
- 源文件的搜索路径——搜索原始码
- 类文件的搜索路径——搜索位码(包括默认和classpath)
- 检查需要使用的各位码,如果存在且无变化则加载,如果不存在或有变化则写入
用以下命令可以感受到第3步的差别,多加了-cp classes
,把位码的输出目录也加到位码的搜索路径中去,这样再次编译的时候若Console.java没有变化,就不需要写入Console.class,而可以直接使用它了。1
$ javac -sourcepath src -d classes - classes src/Helloworld.java
(3).执行1
$ java - classes Helloworld
分包管理
只分目录并不够,还期望根据类的功能将原始码放置在不同目录下,另外也得考虑团队合作下类名称可能重复的问题。从实体和虚拟上,都需要分门别类地管理,package
就出现了。以网址(如com.stackess)命名package,可以保证唯一性。
package的管理能力在于:
- 原始码按package文件夹层级放置
- 位码按package文件夹层级放置
package名+class名
构成完全吻合名称
,这才是类的大名- 类或方法在包内、包间的权限管理,只有public可在包间使用
当编译程序在原始码中看到一个完全吻合名称,直接去搜索这个类。但为了方便,没有包管理的类名称也是可以的,编译程序会机智地按如下顺序查找类的大名:
- 在同包中寻找
- 比对
import
声明(默认import java.lang)
例如:
(1).编辑
添加 src/com/stackess/util/Console.java 文件1
2
3
4
5
6package com.stackess.util; //包
public class Console{ //声明public!
public static void writeLine(String text){
System.out.println(text);
}
}
添加 src/com/stackess/Helloworld.java 文件1
2
3
4
5
6package com.stackess;
class Helloworld{
public static void main(String args[]){
com.stackess.util.Console.writeLine("Hello World"); //完全吻合名称
}
}
或者用import
给 src/com/stackess/Helloworld.java 偷懒1
2
3
4
5
6
7package com.stackess;
import com.stackess.util.Console;
class Helloworld{
public static void main(String args[]){
Console.writeLine("Hello World"); //只是类名称
}
}
(2).编译1
$ javac -sourcepath src -d classes -cp classes src/com/stackess/Helloworld.java
(3).执行1
$ java -cp classes com.stakcess.Helloworld
别忘了完全吻合名称才是类的大名,这样java -cp classes/com/test Helloworld
是错的,这可没有import给你用。