一 、关键点
- 包声明规则:
- 每个类首行的
package
声明必须与文件路径完全匹配 com.example.math
对应路径com/example/math
org.demo.greeting
对应路径org/demo/greeting
- 编译参数:
-d ./build
:指定编译输出目录- 编译器会自动根据包声明创建对应目录结构
- 类路径(Classpath):
- 运行时要指定class文件根目录(这里是build目录)
- 使用
-cp
或-classpath
参数指定 - ✅ 正确命令:
java -cp <类路径> <完全限定类名>
- ❌ 错误命令:直接使用文件路径(如
java ./build/app/Main
)
- 访问控制:
- 确保类和方法都是
public
修饰 - 不同包之间访问需要显式import
二、代码
1. 路径
项目结构:
src/
├── com/
│ └── company/
│ └── utils/
│ └── StringProcessor.java
├── org/
│ └── project/
│ └── service/
│ └── DataService.java
└── me/└── user/└── MainApp.java
2.代码
1 字符串处理工具类(src/com/company/utils/StringProcessor.java)
package com.company.utils;public class StringProcessor {// public方法:允许跨包访问public static String toUpperCase(String input) {return input.toUpperCase();}// protected方法:仅允许子类或同包访问protected static String reverseString(String str) {return new StringBuilder(str).reverse().toString();}// 默认权限方法(包级私有):仅允许同包访问static int countLetters(String text) {return text.replaceAll("[^a-zA-Z]", "").length();}
}
- 数据服务类(src/org/project/service/DataService.java)
package org.project.service;// 导入其他包的类
import com.company.utils.StringProcessor;public class DataService {// 跨包调用public方法public void processData(String data) {String upper = StringProcessor.toUpperCase(data);System.out.println("处理后的数据: " + upper);// 以下两行会编译报错,演示访问权限限制// String reversed = StringProcessor.reverseString(data); // protected方法不可访问// int count = StringProcessor.countLetters(data); // 默认权限方法不可访问}// 同类中protected方法protected void specialProcess() {System.out.println("执行特殊处理");}
}
- 主程序类(src/me/user/MainApp.java)
package me.user;// 导入不同包的类
import com.company.utils.StringProcessor;
import org.project.service.DataService;public class MainApp {public static void main(String[] args) {// 跨包实例化类DataService service = new DataService();String input = "Hello World!";// 调用其他包的public方法service.processData(input);// 使用工具类的public方法String upper = StringProcessor.toUpperCase(input);System.out.println("直接调用工具类: " + upper);// 以下调用会编译报错,演示访问权限限制// service.specialProcess(); // protected方法不可访问}
}
4 编译和运行命令(在项目根目录执行)
# 编译命令
javac -d ./build \src/com/company/utils/StringProcessor.java \src/org/project/service/DataService.java \src/me/user/MainApp.java# 运行命令
java -cp ./build me.user.MainApp
5.结果对比
# 编译命令
javac -d ./build \src/com/company/utils/StringProcessor.java \src/org/project/service/DataService.java \src/me/user/MainApp.java# 运行命令
java -cp ./build me.user.MainApp