01_包的定义与导入

一、包的基本概念

包(Package)是 Java 中用于组织类和接口的命名空间,本质上是目录结构,用于解决类名冲突、管理类文件和划分代码模块。
核心作用

  • 避免类名重复(不同包中可存在同名类)
  • 将相关类和接口归类,便于管理和维护
  • 控制类的访问范围(配合访问修饰符)
    在这里插入图片描述

二、包的定义

2.1 定义语法

在 Java 源文件的第一行(注释除外)使用package语句定义包,语法:

package 包名;

  • 包名通常由小写字母组成,多个层级用.分隔(对应目录的层级结构)
  • 定义包后,类的完整名称为 “包名。类名”(称为全限定名

2.2 示例

// 定义包:com.example.utils(对应目录结构:com/example/utils)
package com.example.utils;

public class MathTool {
    // 类内容
}

上述代码中:

  • 包名为com.example.utils
  • 类的全限定名为com.example.utils.MathTool
  • 编译后,.class文件会被存储在com/example/utils目录下

2.3 注意事项

  1. 位置要求:package语句必须是源文件的第一行有效代码(不能在其前面编写类定义或其他语句,注释除外)。
// 错误示例:package语句不在第一行
public class Test {}
package com.example; // 编译错误:package语句必须在最前面
  1. 唯一性:同一包中不能有同名类,但不同包中可以有同名类。例如:
    • com.example.User和com.test.User是两个不同的类,不会冲突。
  2. 与目录结构一致:包名的层级需与实际存储的目录结构一致,否则编译或运行时会找不到类。
    • 包com.example对应目录com/example
    • 若类定义在com.example包中,但.class文件存储在com/test目录下,会导致ClassNotFoundException

三、包的导入

当需要使用其他包中的类时,需通过import语句导入,避免每次使用都写全限定名,简化代码。

3.1 导入语法

3.1.1 导入单个类

import 包名.类名;

示例

// 导入java.util包下的ArrayList类
import java.util.ArrayList;

public class Demo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>(); // 可直接使用类名
    }
}

3.1.2 导入整个包中的所有类(通配符*)

import 包名.*;

示例

// 导入java.util包下的所有类
import java.util.*;

public class Demo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>(); // 可用
        HashMap<String, Integer> map = new HashMap<>(); // 可用
    }
}

3.1.3 导入静态成员(静态方法或静态变量)

import static 包名.类名.静态成员名; // 导入单个静态成员
import static 包名.类名.*; // 导入所有静态成员

示例

// 导入java.lang.Math类的所有静态成员
import static java.lang.Math.*;

public class Demo {
    public static void main(String[] args) {
        double pi = PI; // 直接使用静态变量PI(无需Math.PI)
        double sqrt = sqrt(25); // 直接使用静态方法sqrt()(无需Math.sqrt())
    }
}

3.2 无需导入的类

以下情况使用类时无需导入:

  1. 同一包中的类:同一包下的类可直接相互访问,无需导入。
// 包:com.example
package com.example;

public class A {}

// 同一包下的类B,可直接使用A
package com.example;

public class B {
    A a = new A(); // 无需导入
}
  1. java.lang 包中的类:Java 默认导入java.lang包(如String、System、Math等),可直接使用。
// 无需导入java.lang.String,默认已导入
String str = "hello";

// 无需导入java.lang.System
System.out.println(str);

3.3 类名冲突与解决

当导入的多个包中存在同名类时,会导致类名冲突,需通过全限定名区分。

示例

// 导入两个包,均包含Date类
import java.util.Date;
import java.sql.Date; // 与java.util.Date冲突

public class Demo {
    public static void main(String[] args) {
        // Date date = new Date(); // 编译错误:无法确定是哪个Date
        
        // 解决:使用全限定名
        java.util.Date utilDate = new java.util.Date();
        java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
    }
}

3.4 注意事项

  1. 位置要求:import语句需放在package语句之后、类定义之前。
package com.example;
import java.util.ArrayList; // 正确位置

public class Demo {}
  1. 通配符*的范围:import com.example.*仅导入com.example包下的直接类,不会导入其子包中的类。例如:
    • import com.example.*可导入com.example.User
    • 但不能导入com.example.service.UserService(需显式导入com.example.service.*或com.example.service.UserService)
  2. 冗余导入:未使用的import语句不会影响程序运行,但建议删除,保持代码整洁(IDE 通常有自动优化功能)。

四、总结

操作 语法 作用 注意事项
定义包 package 包名; 声明类所属的命名空间 必须是源文件第一行有效代码
导入类 import 包名.类名; 或 import 包名.*; 简化其他包中类的使用 需放在package之后、类定义之前
导入静态成员 import static 包名.类名.成员名; 简化静态方法 / 变量的使用 可直接使用成员名,无需类名

包的核心价值在于组织代码和避免类名冲突,合理的包定义和导入能使项目结构清晰,提高代码的可维护性。实际开发中,需注意包名与目录结构一致,以及类名冲突的处理。

posted @ 2025-07-07 08:18  HuCiZhi  阅读(45)  评论(0)    收藏  举报