包的定义与使用
包的定义
包 = 存放类程序文件的目录,程序类中定义的包名称必须采用小写字母的形式定义。
package com.example.demo ; // 定义包,其中.表示分割子目录 (子包)
public class Hello {public static void main(String args[]) {System.out.println("Hello World !");}
}
一旦程序开发之中出现有包,此时程序编译后的结果就必须将*.class文件保存在指定的目录之中,但是如果手工建立则非常麻烦,那么此时最好的做法是可以进行打包编译处理:
javac -d . Hello.java
- “-d”:表示要生成目录,而目录的结构就是package定义的结构
com/example/demo
- “.” :表示在当前所在目录中生成程序文件
有了如上的包后,在程序执行时,必须要带有包
java com.example.demo.Hello
从此之后,完整的类名称应该是“包.类名称”
包的导入
导入
- 导入单类
利用包的定义实际上就可以将不同的功能的类保存在不同的包之中,但是这些类彼此之间也一定会存在有互相调用的关系,那么在这个时候就需要使用import
语句来导入其他包中的程序类。 - 导入整包
当遇到要导入同一个包中的许多类时,可使用import 包.*
的导入形式,它会根据自己的需要加载所需要的程序类,不需要的程序类是不会被加载的,所以使用 * 还是使用具体的类,性能上是没有区别的。 - 类名冲突(包不重名)
而当两个包中都包含有名称相同的程序类时,此时在主程序中使用类,必须声明出类的完整名称。
多包编译
若导入的包也未编译的话,且当类的数量很多,彼此之间互相引用严格时,那么这个时候最好的做法不是区分顺序,而是直接交给java自己来完成:javac -d . *.java
public class 和 class 的区别
- public class:类名称必须与文件名称保持一致,一个 *.java 文件里面只允许有一个 public class,同时如果一个类需要被其他的包所使用,那么这个类一定要定义为 public class;
- class:类名称可以与文件名称不一致,并且在一个 *.java 文件里面可以提供有多个 class 定义,编译后将形成不同的*.class文件,但是这些类只能够被本包所访问,外包无法访问
静态导入
当使用了静态导入之后,就好比该方法是直接定义在主类中一样,即此时调用该方法时,不需要再添加类名。(有点类似与 C语言的 #include)
但实际运用中较少。
jar文件
定义
对于一个项目工程,到最后会有大量的class文件,这些文件如果散着给用户,不利于维护,因此可以利用一种压缩结构来进行处理,这样的结构再java中被称为jar文件。
打包命令
利用jdk中提供的jar命令来完成:
- 对程序进行打包编译:
java -d . *.java
最终会形成一个 com 的包,包中有相应的子包和 *.class文件 - 将其打包为 test.jar
jar -cvf test.jar com
- “-c”:创建一个新的jar文件
- “-v”:得到一个详细输出
- “-f”:设置要生成的jar文件名称,本处定义的是“test.jar”
包的使用
- 每一个 *.jar 文件都是一个独立的程序路径,如果想在Java程序中使用此路径,则必须通过 CLASSPATH 进行配置。
Set CLASSPATH=.; 盘符:\前置路径\test.jar
(多个路径,使用分号分隔) - 正常编译那个调用了jar包中的类的主java程序,并使用
编译程序类:javac -d . testDemo.java
解释程序: java testDemo
- 其他情况
当程序编译通过后,若由于CLASSPATH发生了改变,类无法加载到testDemo类的时候会出现如下的错误提示:
Exception in thread “main” java.lang.NoClassDefFoundError: testDemo
出现该报错,只有一个情况:*.jar包没有配置正确。
JDK1.9之后出现的模块化操作
- JDK1.9之前实际上提供的是一个所有类的 *.jar 文件(rt.jar,tools.jar),此时开发中,只要启动了java虚拟机,那么就需要加载这几十M的类文件。
- 在 JDK 1.9之后提供了一个模块化的设计,将原本很大的要加载的一个*jar文件变成了若干个模块文件,这样启动的时候可以根据程序加载指定的模块(模块中有包),以加快启动速度。
系统常用包
- java.lang:像 String、Number、Object 等类都在这个包里面,这个包在JDK1.1之后自动默认导入;
- java.lang.reflect: 反射机制处理包,所有的设计从此开始;
- java.util:工具类的定义,包括数据结构的定义;
- lava.1o:进行输入与输出流操作的程序包;
- lava.net:网络程序开发的程序包;
- lava.sql:进行数据库编程的开发包;
- java.applet: Java 的最原始的使用形式,直接嵌套在网页上执行的程序
- 现在的程序已经以 Application 为主了 (有主方法的程序);
- java.awt、javax.swing: Java 的图形界面开发包(GUI)。