包的主要目的是实现程序的分割保存,这样不仅便于开发而且也方便维护。但是这样也往往会出现不同包中的类互相访问的情况。
1 包的基本概念
- 包(package)是在使用多个类或接口时,为了避免名称重复而采取的一种措施,如果使用,直接在程序中加入 package 关键字即可,格式如下:
package 包名称.子包名称;
在 .txt 文件中输入如下代码,输入代码之后把文件名改成 PackageDemo.java
package self.learn.packaged;
public class PackageDemo {
public static void main(String[] args) {
print();
}
public static void print() {
System.out.println("Java is interesting!");
}
}
相关截图:
以上的编译命令中加入了一下两个参数:
(1)-d :表示生成目录,生成的目录以 package 的定义为准。
(2). : 表示在当前所在的文件夹之中生成的。
2 import 语句
- 类的导入格式:
import 包名称.子包名称.类名称; ---> 手工导入所需的类
import 包名称.子包名称.*; ---> 由 JVM 自动加载所需的类
提问:分别倒入与使用 “ * ” 导入哪种性能更高?
回答:两种的性能是一样的。
这两种导入方式,本身并不存在性能的问题,因为使用 “*” 也是自动加载所需的类,而不需要的类根本不会被加载进来。
- 一个类要被外包访问,则此类一定要定义成 public class 。
关于 “public class” 和 “class” 声明类的补充
如果一个类声明为 public class,则文件名称必须与类名称一致,而且在一个类文件中只能有一个 public class,而如果使用 class 声明一个类,则文件名称可以与类名称不一致,但是在执行的时候必须执行生成的 class 文件名称。除了这些外,public class 和 class 还在包的访问上有所限制,如果一个类只在本包中访问,不需要被外包访问,则直接声明成 class 即可;而如果一个类要被外包访问,则必须声明为 public class 。
- 如果一个程序中同时导入了两个包的同名类,在使用时就必须明确地写出完整的 “包.类名称”,代码如下:
package self.learn.packaged.a;
public class Demo {
public void say(){
System.out.println("Java is interesting!");
}
}
package self.learn.packaged.b;
public class Demo {
public void say(){
System.out.println("Java is interesting!");
}
}
package self.learn.packaged;
import self.learn.packaged.a.*; // 包中存在 Demo 类
import self.learn.packaged.b.*; // 包中存在 Demo 类
public class PackageDemo {
public static void main(String[] args) {
Demo demo = new Demo();
demo.say();
}
}
相关截图:
指定具体包名前:
指定具体包名后:
3 系统常见包
在 JDK 中为了方便用户开发程序,提供了大量的系统功能包,如下表列出了一些常用包。
序号 | 包名称 | 作用 |
---|---|---|
1 | java.lang | 此包为基本的包,像 String 这样的类就保存在此包中,在 JDK 1.0 的时候如果想编写程序,则必须手工导入此包,但是随后的 JDK 解决了此问题,所以此包现在为自动导入。 |
2 | java.lang .reflect | 此包为反射机制的包,是 java.lang 的子包 |
3 | java.util | 此包为工具包,一些常用的类库、日期操作等都在此包之中,如果此包精通掌握各种设计思路都好理解。 |
4 | java.text | 提供了一些文本的操作类库 |
5 | java.sql | 数据库操作包,提供了各种数据库操作的类和接口 |
6 | java.net | 完成网络编程 |
7 | java.io | 输入、输出处理 |
4 静态导入
在 JDK1.5 之后提供了静态导入的功能。如果一个类中的方法全部是使用 static 声明的静态方法,则在导入的时候就可以直接使用 “import static” 的方式导入,导入格式如下:
import static 包.类名称.*;
实例:定义一个类,全部由静态方法组成。
package self.learn.packaged.a;
public class Operate { // 里面的方法全部是 static 类型
public static int add(int i, int j) { // 加法操作
return i+j;
}
public static int sub(int i, int j) { // 减法操作
return i - j;
}
}
package self.learn.packaged;
import static self.learn.packaged.a.Operate.*; // 静态导入
public class PackageDemo {
public static void main(String[] args) {
System.out.println("3+3 = "+add(3, 3));
System.out.println("6-3 = "+sub(6, 3));
}
}
运行结果截图:
以上的程序中使用了静态导入,所以 Operate 类中的所有静态方法就可以直接在 导入类中使用,而不再需要使用 “类.静态方法()” 的形式调用。