包与访问修饰符¶
包 package = 目录¶
铁律:包名必须和目录结构一一对应。 文件在 com/javaglm/language/ch10/ 目录下,包名就必须是 com.javaglm.language.ch10。对标 ES module:包就像文件路径。
import 引入别的包¶
import com.javaglm.language.ch10.model.Product; // 精确导入一个类
import java.util.*; // 导入整个包(少用,IDE 一般帮你精确导入)
对标 JS 的 import { Product } from './model/Product'。区别:Java 默认 java.lang 包(String、System 等)自动导入,不用写。
四种访问修饰符¶
| 修饰符 | 本类 | 同包 | 子类 | 其他包 | 对标 |
|---|---|---|---|---|---|
public |
✅ | ✅ | ✅ | ✅ | export |
protected |
✅ | ✅ | ✅ | ❌ | — |
| 不写(default) | ✅ | ✅ | ❌ | ❌ | 模块内部 |
private |
✅ | ❌ | ❌ | ❌ | #私有字段 |
记忆法:从宽到窄 public > protected > default > private。
实战建议¶
- 字段一律
private,通过 getter/setter 暴露(封装,第 08 章)。 - 类一般
public(一个文件一个 public 类)。 - 工具方法/常量用
public static。 - Spring 里,Controller / Service / Mapper 的实现类通常
public,接口public。
完整可运行示例¶
主类(演示同包访问 + 跨包 import):
package com.javaglm.language.ch10;
// import 别的包里的类(对标 ES module 的 import)
import com.javaglm.language.ch10.model.Product;
/**
* 第 10 章 · 包与访问修饰符。
* 包(package)就是目录,必须和目录结构一一对应——对标 ES module 的文件路径。
* 访问修饰符控制"谁能用到这个成员"。
*/
public class PackageDemo {
public static void main(String[] args) {
// 同包的类,直接用
User u = new User("Tom");
System.out.println("public name = " + u.name); // public:任何地方
System.out.println("default tag = " + u.tag); // 包级私有:同包可见
// 跨包:用 import 进来的 Product
Product p = new Product("鼠标", 99.0);
System.out.println("跨包 Product = " + p.getName() + " / " + p.getPrice());
// 私有成员外部访问不到
// System.out.println(u.id); // ✗ id 是 private,编译报错
}
}
/** 同包内的类。展示四种访问级别。 */
class User {
public String name; // public:任何包都能访问
private int id; // private:只有本类
String tag; // 不写修饰符 = 包级私有(default):仅同包
protected String note; // protected:同包 + 子类
User(String name) {
this.name = name;
this.id = 1;
this.tag = "vip";
this.note = "备注";
}
}
跨包的被引用类:
package com.javaglm.language.ch10.model;
/** 放在子包 model 里,演示跨包访问。 */
public class Product {
private String name;
private double price;
public Product(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() { return name; }
public double getPrice() { return price; }
}
包命名约定
公司域名反写开头:com.公司名.项目名.模块。本书统一用 com.javaglm.*。
:octicons-arrow-left-16: 上一章:接口与抽象类 | 下一章:异常处理