一、核心结论
Java 的类可以分布在不同的包中,跨包使用的关键是:
- 被使用的类(非默认访问权限)需要用
public修饰; - 使用方需要通过
import 包名.类名;导入目标类; - 项目的目录结构要和包名严格对应(核心规范)。
二、实战示例(跨包使用类)
我们模拟一个典型场景:
- 业务类:
com.example.entity.Student(实体类,存储学生信息) - 测试类:
com.example.test.StudentTest(测试类,在不同包下调用 Student 类)
步骤 1:按包名创建目录结构(必须)
Java 包名对应操作系统的目录结构,比如:
plaintext
项目根目录/
├─ com/
│ ├─ example/
│ │ ├─ entity/ // 实体类包
│ │ │ └─ Student.java
│ │ └─ test/ // 测试类包
│ │ └─ StudentTest.java
步骤 2:编写被调用的类(Student.java)
路径:com/example/entity/Student.java
java
运行
// 声明包名(必须和目录一致)
package com.example.entity;
// 跨包使用的类必须用public修饰(否则默认访问权限仅同包可见)
public class Student {
private String name;
private int age;
// 构造方法
public Student(String name, int age) {
this.name = name;
this.age = age;
}
// 跨包访问的方法也需要public修饰
public void showInfo() {
System.out.println("姓名:" + name + ",年龄:" + age);
}
}
步骤 3:编写测试类(StudentTest.java)
路径:com/example/test/StudentTest.java
java
运行
// 声明测试类的包名
package com.example.test;
// 导入跨包的Student类(核心:指定完整包名+类名)
import com.example.entity.Student;
public class StudentTest {
public static void main(String[] args) {
// 跨包创建Student对象(因为Student是public,且已导入)
Student stu = new Student("张三", 18);
// 调用跨包类的public方法
stu.showInfo(); // 输出:姓名:张三,年龄:18
}
}
步骤 4:编译运行(关键命令)
假设项目根目录是D:\JavaProject,打开命令行执行:
bash
运行
# 1. 进入项目根目录
cd D:\JavaProject
# 2. 编译(-d 表示按包名生成目录结构)
javac -d . com/example/entity/Student.java com/example/test/StudentTest.java
# 3. 运行(必须指定完整包名+类名)
java com.example.test.StudentTest
运行结果:
plaintext
姓名:张三,年龄:18
三、跨包使用的核心规则(新手必看)
1. 访问权限控制(最关键)
| 访问修饰符 | 同包可见 | 跨包可见 | 备注 |
|---|---|---|---|
public | ✅ | ✅ | 跨包使用的类 / 方法 / 属性必须用 public |
protected | ✅ | 仅子类可见 | 继承场景下使用 |
| 默认(无修饰符) | ✅ | ❌ | 仅同包可见,跨包无法访问 |
private | ❌(仅本类) | ❌ | 任何外部都无法访问 |
⚠️ 注意:如果 Student 类不加public(默认权限),即使导入包,测试类也会报错找不到符号。
2. 导入包的简化写法
-
导入单个类:
import com.example.entity.Student;(推荐,清晰) -
导入整个包下的所有类:
import com.example.entity.*;(适合包内类多的场景) -
直接使用完整类名(无需 import):
java
运行
// 不写import,直接用包名+类名创建对象 com.example.entity.Student stu = new com.example.entity.Student("李四", 20);
3. IDE 中的使用(更简单)
在 IDEA/Eclipse 等 IDE 中,只需:
- 右键创建包(
com.example.entity/com.example.test); - 在对应包下创建类;
- 跨包使用时,IDE 会自动提示导入类(快捷键:IDEA 按
Alt+Enter)。
四、常见报错及解决
-
错误:找不到符号 Student
- 原因:未导入包,或 Student 类不是 public,或包名 / 类名拼写错误;
- 解决:检查 import 语句,确保 Student 类加
public,核对包名和目录一致。
-
错误:类 Student 在包 com.example.entity 中不是公共的,无法从外部包访问
- 原因:Student 类未加
public修饰; - 解决:给 Student 类添加
public关键字。
- 原因:Student 类未加
-
错误:找不到或无法加载主类 com.example.test.StudentTest
- 原因:运行时未指定完整包名,或编译后的 class 文件目录结构错误;
- 解决:运行时用
java 完整包名.类名,编译时加-d .参数。
总结
- Java 类完全可以和测试类不在同一个包中,这是项目分层开发的标准做法(如实体类、工具类、测试类分属不同包)。
- 跨包使用的核心:被访问的类 / 方法必须是
public,使用方通过import导入,且目录结构与包名一致。 - 避坑要点:注意访问权限(public 是跨包访问的前提),编译运行时严格遵循包名规则。
这种包结构的设计能让代码更清晰、易维护,比如实际项目中会分controller(控制器)、service(业务逻辑)、dao(数据访问)、test(测试)等不同包,各司其职。