跳转至

包与访问修饰符

包 package = 目录

package com.javaglm.language.ch10;   // 声明本类属于哪个包

铁律:包名必须和目录结构一一对应。 文件在 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: 上一章:接口与抽象类 | 下一章:异常处理