一、包
1、简要介绍
在Java编程语言中,包(Package) 是一种用来组织和管理类(Class)和接口(Interface)的机制。包为开发者提供了一种逻辑分组的方式,使代码更加模块化、结构化和易于管理。
包在 Java 中叫包,实际上就是一种文件夹,也就是目录系统,实际上我们可以在 JDK 中的 src.zip 压缩包中可以找到以下资源,可以发现这些就是我们平时使用的包,比如选中的 util 包:
所以说包就是文件夹。
这样我们就对包的作用有了一个较为清晰的认知,因为我们创建文件夹的目的就是管理文件,所以在 Java 中,包就是用来管理不同类和接口的。以及处理同名文件,不同路径中的同名文件不会冲突,在 Java 中,不同包中的同名类也不冲突。与文件中的目录系统一样,Java 中的包使用的也是这种树形的结构。
2、包的定义和声明
包是Java命名空间机制的一部分,用于将相关的类、接口和子包进行分组,以避免命名冲突和提高代码的可维护性,以及控制类、接口等的访问范围。
在一个Java源文件的开头使用 package
关键字来声明它所属的包。例如:
package com.example.myapp;
3、包名与路径
包名实际上就是路径,但是中间不使用斜杠或者反斜杠分割,而是使用 . 分隔。
这里我们创建了一个包,然后我们可以到文件管理器中查看具体的路径:
可以发现包名 com.pack1 对应的就是 com\pack1,所以说包名实际上就是路径。
然后我们再在 com 中创建一个包:
可以发现这种树形结构,就是类似目录系统的。
4、包示例
上面我们创建了两个包,这样我们就可以分别在这两个包中创建一些类了,这些类即使同名也不会冲突。
然后我们分别在两个包中创建相同名字的类,如下:
package com.pack1;
public class Person {
String name;
int age;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
//...
}
和
package com.pack2;
public class Person {
String name;
int age;
double weight;
public Person(double weight, String name, int age) {
this.weight = weight;
this.name = name;
this.age = age;
}
public double getWeight() {
return weight;
}
//...
}
可以发现这两个 Person 类虽然类名相同,但是内部字段实际是不一样的。通过包,我们就可以实现这两个同名的类在不同包中管理而不冲突。
当我们要使用这两个包中的两个同名的类时,就要对这两个类更详细的标注:
public class Test {
public static void main(String[] args) {
com.pack1.Person person = new com.pack1.Person(18,"张三");
com.pack2.Person person1 = new com.pack2.Person(60,"李四",19);
}
}
这样我们才能分清对应的对象是哪个包中的类的实例。
而且我们还不能同时导入这个包中的 Person 类:
import com.pack1.Person;
import com.pack2.Person;
这样会报错。
也可以只导入一个包对应的类,这个类不用指定包名,然后另一个类的包不导入,指定包名:
import com.pack1.Person;
public class Test {
public static void main(String[] args) {
Person person = new Person(18,"张三");
com.pack2.Person person1 = new com.pack2.Person(60,"李四",19);
}
}
二、包的命名规则与规范
1、命名规则
包的命名规则:
只包含数字(1-9)、字母大小写(A-Z,a-z),下划线(_),小圆点(.),不能以数字开头。也不能是关键字或保留字。
2、命名规范
一般是小写字母加小圆点构成。
结构是:
com.公司名.项目名.模块
三、常用的包
1、java.lang
这个包是自动导入的,这意味着你不需要使用 import
语句来导入这个包中的类。这是Java语言设计的一部分,旨在提供最基本的功能,所以对于这个包下的很多类:
我们在创建程序后就可以直接使用。
2、java.util
java.util
包是Java标准库中用于提供实用工具类的包,它包含集合框架、事件模型、日期和时间设施、国际化和其他实用工具类。以下是一些 java.util
包中的关键类和接口:
- 集合框架:包括
List
、Set
、Map
、Queue
等接口,以及它们的实现类如ArrayList
、LinkedList
、HashSet
、TreeSet
、HashMap
、TreeMap
等。 - 日期和时间:包括
Date
、Calendar
、GregorianCalendar
、TimeZone
等类,以及Java 8引入的新的日期和时间API,如LocalDate
、LocalTime
、LocalDateTime
、ZonedDateTime
等。 - 随机数生成:
Random
类用于生成伪随机数。 - 国际化:
Locale
类用于表示特定的地理、政治或文化区域。 - 事件模型:
Observer
和Observable
类用于实现观察者模式。 - 工具类:如
Arrays
和Collections
,提供了对数组和集合进行操作的静态方法。 - 正则表达式:
Pattern
和Matcher
类用于处理正则表达式。
3、java.awt
java.awt
(Abstract Window Toolkit)包提供了用于构建图形用户界面(GUI)的类,包括窗口、按钮、文本框等组件,以及布局管理器和图形绘制工具。以下是 java.awt
包中的一些关键类:
- 组件:如
Frame
、Panel
、Button
、Label
、TextField
、TextArea
等。 - 布局管理器:如
FlowLayout
、BorderLayout
、GridLayout
、CardLayout
等,用于管理组件在容器中的布局。 - 事件处理:如
ActionListener
、MouseListener
、KeyListener
等接口,用于处理用户输入事件。 - 图形和图像:
Graphics
类用于绘制图形,Image
类用于处理图像。 - 颜色和字体:
Color
和Font
类用于设置组件的颜色和字体。
4、java.net
java.net
包提供了用于实现网络应用程序的类和接口,包括用于处理TCP/IP和UDP/IP协议的类,以及URL处理和网络通信的工具。以下是 java.net
包中的一些关键类:
- URL:
URL
和URLConnection
类用于处理URL和与之相关的网络资源。 - Socket编程:
Socket
和ServerSocket
类用于实现基于TCP的客户端和服务器端通信。 - DatagramSocket:用于实现基于UDP的数据报通信。
- InetAddress:用于表示IP地址。
- URI:
URI
类用于处理统一资源标识符。
四、导入包
1、如何导入包
1)导入某个包中的某个类
一般情况下,我们要导入某个包,实际上是要使用这个包中的某个类,所以一般是导入某个包中的固定类:
例如,如果你想在代码中使用 java.util.ArrayList
,你可以这样导入:
import java.util.ArrayList;
然后,你就可以在代码中直接使用 ArrayList
类,而不需要每次都写上完整的包名。
2)导入整个包
我们不仅可以导入一个包中的固定类,也可以导入整个包。如果你需要使用一个包中的多个类或接口,可以使用通配符 *
来导入整个包:
例如,导入 java.util
包中的所有类和接口:
import java.util.*;
这样,你就可以在代码中直接使用 java.util
包中的任何类或接口,如 ArrayList
、HashMap
、Date
等。
2、导入包示例
导入 util 包中的 Arrays 类,使用 Arrays 类中的静态方法 sort 排序数组:
import java.util.Arrays;//导入java.util包中的Arrays这个类
public class Test {
public static void main(String[] args) {
int[] arr = {12,23,435,34,2};
Arrays.sort(arr);
for(int i : arr) {
System.out.print(i + " ");
}
}
}
运行结果:
五、注意事项
-
package
语句必须是源文件中的第一条非注释语句。这意味着它必须位于所有import
语句之前,以及所有类或接口定义之前。 -
每个源文件只能包含一个
package
语句。也就是说这个文件只能有一个路径,它的位置是唯一的。 -
import 应该在 package 和类的定义之间,没有顺序要求,可以有多句。就像下面这样:
package com.pack1; import java.util.Arrays;//导入java.util包中的Arrays这个类 import java.util.Scanner;//导入java.util包中的Scanner这个类 public class Test { public static void main(String[] args) { //... } }
- 如果你创建了一个源文件,放到了一个包中,但是没有使用 package 语句,那这样我们就不能在其他的源文件中使用这个类,也不能导入这个类。
六、补充
在一个源文件中使用某个包中的某个类,我们有两种方法:
1、使用 import
语句:
这是最常见的方法,通过 import
语句,你可以告诉编译器你想要使用的类来自哪个包。这样,在源文件中就可以直接使用类的名称来创建对象或调用方法,而不需要写出完整的包名。import
语句通常放在源文件的顶部,package
语句之后。
例如,如果你想使用 java.util
包中的 Arrays
类,你可以这样做:
import java.util.Arrays;//导入java.util包中的Arrays这个类
public class Test {
public static void main(String[] args) {
int[] arr = {1, 23, 64, 33, 32};
Arrays.sort(arr);//排序
System.out.println(Arrays.toString(arr));//转成字符串然后打印
}
}
运行结果:
2、使用完整的类名:
如果你不想使用 import
语句,或者你想使用的类与当前包中的另一个类有相同的名称,你可以使用完整的类名来引用该类。完整的类名包括包名和类名,用点(.
)分隔。
例如,如果你没有导入 java.util.Arrays
,你可以这样使用它:
public class Test {
public static void main(String[] args) {
int[] arr = {1, 23, 64, 33, 32};
java.util.Arrays.sort(arr);//排序
System.out.println(java.util.Arrays.toString(arr));//转成字符串然后打印
}
}
运行结果: