Java 包
Java - 包
Section titled “Java - 包”在 Java 中,包(packages)用于组织相关的类、接口、枚举和注解。可以把它们想象成计算机上用来组织文件的文件夹。包有以下几个重要的用途:
- 命名空间管理: 防止命名冲突。如果两个类位于不同的包中,它们可以拥有相同的名称(例如,
java.util.Date和java.sql.Date)。 - 访问控制: 控制类型和成员的可见性(使用访问修饰符,如
public、protected、private和 default/package-private)。 - 组织: 使查找和管理相关的代码组件变得更容易。
- 分发: 将相关功能捆绑在一起以便共享和重用。
Java 提供了丰富的标准库包,例如:
java.lang:基础类(如Object、String、System)。自动导入到每个 Java 程序中。java.util:工具类(集合、日期/时间工具、Scanner等)。java.io:用于输入/输出操作的类。java.net:用于网络编程的类。java.nio:更新的 I/O 和文件系统 API。java.time:现代日期和时间 API。
你也可以(而且应该)定义自己的包来组织应用程序代码。
要将一个类或其它类型放入包中,需要使用 package 语句作为源文件(.java 文件)中的第一行。
`package com.yourcompany.yourproject.module;`- 每个源文件只能有一个
package语句。 - 它必须是第一个非注释行。
- 在该源文件中定义的所有类型都将属于指定的包。
- 如果一个源文件没有
package语句,则其类型属于未命名包(也称为默认包)。对于非简单的项目,不建议依赖未命名包。
为了确保全局唯一性,标准约定是使用你的组织的倒序互联网域名。例如,如果你的域名是 example.com,你的包可能以 com.example 开头。
- 使用所有小写字母。
- 使用点 (
.) 分隔组件。 - 避免在包名中使用 Java 关键字。
- 示例:
com.mycompany.ecommerce.util,org.apache.commons.lang3
让我们创建一个包含实用工具类的简单包 com.myapp.util。
源文件:src/com/myapp/util/StringUtils.java(参见下面的“包与目录结构”部分)
package com.myapp.util;
public class StringUtils { public static boolean isNullOrEmpty(String str) { return str == null || str.trim().isEmpty(); }
// 其他实用工具方法...}另一个包中的另一个类:
源文件:src/com/myapp/main/App.java
package com.myapp.main;
// 需要导入 StringUtils 类才能使用它import com.myapp.util.StringUtils;// 或者,导入包中的所有类型:// import com.myapp.util.*;
public class App { public static void main(String[] args) { String name = ""; if (StringUtils.isNullOrEmpty(name)) { System.out.println("Name is missing."); }
// 使用标准库中的类(隐式需要导入) java.util.Scanner scanner = new java.util.Scanner(System.in); }}import 关键字
Section titled “import 关键字”要使用来自不同包的类型(类、接口等),通常需要 import 导入它,或者使用其完全限定名(包名 + 类型名)来引用它。
同一包中的类型无需导入;它们可以直接通过其简单名称相互引用。
使用其它包中的类型的方法:
Section titled “使用其它包中的类型的方法:”- 导入单个类型: 使用完全限定名导入特定的类或接口。这是为了清晰起见推荐的方法。
-
import java.util.ArrayList;
// …
ArrayList
3. **导入整个包(按需导入/通配符导入):** 使用星号 (`*`) 通配符导入包中的所有 `public` 类型。谨慎使用这种方式,因为它有时会使得类型的来源不太明确。4. ```javaimport java.util.*;// ...List<String> list = new ArrayList<>();Scanner scanner = new Scanner(System.in);- 使用完全限定名: 每次都使用其完整的包名来引用类型。这种方式通常比较冗长且可读性较差,但可以避免潜在的导入冲突。
-
java.util.ArrayList
`import` 语句出现在 `package` 语句(如果存在)之后,类声明之前。
### 静态导入
你还可以使用 `import static` 导入类的 `static` 成员(方法和字段)。这允许你在使用静态成员时无需加上类名。
```javaimport static java.lang.Math.PI;import static java.lang.System.out;
public class StaticImportExample { public static void main(String[] args) { double radius = 5.0; double area = PI * radius * radius; // 直接使用 PI out.println("Area: " + area); // 直接使用 out }}谨慎使用静态导入,过度使用可能会使代码更难理解。
包与目录结构
Section titled “包与目录结构”至关重要的是,包结构必须与源代码(.java 文件)和编译后的字节码(.class 文件)的目录结构匹配。
如果一个类 MyClass 在包 com.mycompany.app 中,其源文件 MyClass.java 必须位于如下目录结构中:
<source_root>/com/mycompany/app/MyClass.java其中 <source_root> 是源代码的根目录(例如,src,src/main/java)。
类似地,编译后,MyClass.class 文件必须位于:
<output_root>/com/mycompany/app/MyClass.class其中 <output_root> 是编译后的类的根目录(例如,bin,build/classes/java/main)。
Java 编译器 (javac) 和 Java 虚拟机 (java) 利用这种目录结构,结合类路径 (classpath),来查找所需的 .class 文件。
类路径 (The Classpath)
Section titled “类路径 (The Classpath)”类路径是 JVM 和编译器搜索类文件的目录、JAR 文件(Java 归档)和 ZIP 归档的列表。
当你运行 java com.mycompany.app.MyClass 时,JVM 需要找到 MyClass.class。它会在类路径指定的 location 中查找。如果你的输出根目录是 build/classes,并且 build/classes 在类路径中,JVM 将会查找 build/classes/com/mycompany/app/MyClass.class。
现代开发: 虽然理解类路径很重要,但在现代 Java 开发中,使用 CLASSPATH 环境变量或 -cp/-classpath 命令行选项手动管理类路径已不那么常见。像 Maven 和 Gradle 这样的构建工具可以自动化代码编译、依赖管理(外部 JAR)以及设置正确的类路径来运行和测试应用程序的过程。它们定义了标准的项目结构(如源代码的 src/main/java)并自动处理依赖解析。
设置 CLASSPATH(传统方法)
Section titled “设置 CLASSPATH(传统方法)”如果你需要手动管理类路径(例如,对于没有构建工具的简单示例):
- 环境变量: 在系统范围或你的 shell 中设置
CLASSPATH环境变量。 - Windows:
set CLASSPATH=C:\path\to\classes;C:\path\to\lib\library.jar;.(使用分号;分隔各项) - Linux/macOS:
export CLASSPATH=/path/to/classes:/path/to/lib/library.jar:.(使用冒号:分隔各项) .代表当前目录。- 命令行选项: 在编译或运行时指定类路径。
javac -cp <classpath_entries> MyClass.javajava -cp <classpath_entries> com.mycompany.app.MyClass<classpath_entries>使用与环境变量相同的格式(分号或冒号)。
对于包含多个包或外部库的项目,依赖默认类路径(通常只是当前目录)或手动管理类路径很快就会变得繁琐。强烈建议使用构建工具。
接下来是什么?
Section titled “接下来是什么?”理解包对于组织大型 Java 项目至关重要。接下来的章节将深入探讨面向对象概念,如继承 (Inheritance)、接口 (Interfaces) 和多态 (Polymorphism),这些概念通常涉及不同包中类之间的交互。