在 Java 里,包(Package)是组织类和接口的一种机制,其作用是管理代码、避免命名冲突以及访问控制。
1. 包的概念与作用
- 组织代码:包能把相关的类和接口组织在一起,让代码结构更加清晰。例如,在一个大型项目中,可按功能模块划分不同的包,像数据库操作相关的类放在
database
包,用户界面相关的类放在ui
包。 - 避免命名冲突:不同包中可以存在同名的类,因为全限定名(包名 + 类名)是唯一的。例如,
java.util.Date
和java.sql.Date
虽然类名相同,但属于不同的包,不会产生冲突。 - 访问控制:包可以对类、方法和变量的访问进行控制。通过包的访问权限修饰符,能限制其他包中的类对本包内成员的访问。
2.包命名规范详解
规则项 | 说明 | 示例 | 错误示例 |
---|---|---|---|
逆域名结构 | 以组织域名反转开头(如com.company.project ) | com.baidu.search | Baidu.search |
全小写字母 | 禁止使用大写字母(避免OS大小写敏感问题) | net.example.app | Net.Example.App |
单词分隔 | 使用. 连接,不用下划线/连字符 | java.io | java_io / java-io |
长度控制 | 建议不超过5级(如com.company.product.module ) | org.apache.commons | com.company.very.long.package.name |
3. 命名策略
域名反转 + 项目名 + 模块名
// 企业域名:example.com → 项目名:crm → 模块:service package com.example.crm.service;
目录映射
包名 | 文件系统路径 |
---|---|
java.util | java/util/ |
com.company.project | com/company/project/ |
使用包
使用其他包中的类时,有两种方式:
- 全限定名:直接使用类的全限定名,示例如下:
java.util.Date date = new java.util.Date();
- 导入包:使用
import
语句导入包,之后就可以直接使用类名,示例如下:
java
import java.util.Date;
public class Main {
public static void main(String[] args) {
Date date = new Date();
}
}
若要导入一个包中的所有类,可以使用通配符 *
:
import java.util.*;
4. 系统包与自定义包
系统包
Java 提供了许多系统包,例如:
java.lang
:包含了 Java 语言的核心类,如Object
、String
、Integer
等。该包会被自动导入,无需使用import
语句。java.util
:包含了各种实用工具类和集合框架,如ArrayList
、HashMap
、Date
等。java.io
:包含了输入输出相关的类,如File
、InputStream
、OutputStream
等。
自定义包
你可以根据项目需求创建自定义包。例如,创建一个名为 com.example.util
的包,用于存放项目中的工具类:
package com.example.util;
public class MyPrint {
public static void print(String str) {
System.out.println(str);
}
}
5. 包的访问权限
Java 有四种访问权限修饰符,它们与包的关系如下:
public
:被public
修饰的类、方法和变量可以被任何包中的类访问。protected
:被protected
修饰的成员可以被同一包中的类以及不同包中的子类访问。- 默认(无修饰符):默认访问权限的成员只能被同一包中的类访问。
private
:被private
修饰的成员只能在本类中访问,与包无关。
6. 包的编译与运行
编译和运行包含包的 Java 程序时,需要注意类路径的设置。假设项目结构如下:
javaDemo
└── com
└── example
└── myapp
└── Main.java
└── util
└── MyPrint.java
编译时,使用 -d
选项指定编译输出目录:
- 目录存在性:如果
bin
目录不存在,javac
会自动创建它。但如果没有足够的权限创建目录,会抛出错误。 - 包结构:确保
Main.java
中的包声明与文件所在的目录结构一致,否则可能会出现编译错误。例如,若Main.java
声明了package com.example.myapp;
,那么它必须存放在com/example/myapp
目录下。 - 当前工作目录:该命令是相对于当前工作目录执行的。所以在执行命令前,要确保当前工作目录是正确的
javac -d bin com/example/myapp/Main.java
运行时,需要指定类的全限定名:
-cp
-cp
是java
命令的一个选项,它是-classpath
的缩写。-classpath
用于指定 JVM 在运行 Java 程序时查找类文件的路径。java -cp bin 代表把 当前bin目录 放到 java查找路径里
java -cp bin com.example.myapp.Main
集成开发环境给我们做了简化。在集成开发里直接点 run