Java 修饰符 超详细大全
public / private / protected / default / static / final / abstract 全部一次性整理到位,包含作用、使用范围、执行顺序、企业坑、内存规则,是你能找到最完整的版本。
一、Java 修饰符分类
1. 权限修饰符(4个)
控制访问范围
privatedefault(缺省,不写)protectedpublic
2. 状态/功能修饰符(3个)
控制生命周期、特性、功能
staticfinalabstract
二、权限修饰符(最核心)
1. private(私人的)
- 范围:仅当前类内部可访问
- 可修饰:成员变量、成员方法、构造器
- 不可修饰:类、接口
作用:
- 封装核心,禁止外部直接访问
- 安全、防止脏数据
企业规范:所有成员变量必须 private
2. default(缺省/包权限)
- 不写任何修饰符
- 范围:当前类 + 同包类
- 可修饰:类、接口、变量、方法
作用:包内部使用,对外隐藏
3. protected(受保护的)
- 范围:同包 + 不同包的子类
- 可修饰:变量、方法、构造器
- 不可修饰:类(外部类)
作用:留给子类扩展使用
4. public(公共的)
- 范围:任意位置
- 可修饰:类、接口、变量、方法
作用:对外提供接口、服务、API
三、权限修饰符范围表(背会)
| 修饰符 | 同类 | 同包 | 子类(不同包) | 任意位置 |
|---|---|---|---|---|
| private | ✅ | ❌ | ❌ | ❌ |
| default | ✅ | ✅ | ❌ | ❌ |
| protected | ✅ | ✅ | ✅ | ❌ |
| public | ✅ | ✅ | ✅ | ✅ |
四、功能修饰符(static / final / abstract)
1. static(静态)
可修饰
- 成员变量
- 成员方法
- 代码块
- 内部类
特点
- 属于类,不属于对象
- 类加载时初始化,全局只有一份
- 优先于对象存在
- 静态方法不能访问非静态成员
- 静态方法不能用
this、super
执行顺序
静态内容 > 构造代码块 > 构造方法
静态变量
public static int count;
- 所有对象共享一份
- 类名直接访问
静态方法
public static void method(){}
- 工具类常用
- 不能被重写,只能隐藏
- Spring 事务、AOP 对 static 方法无效!!!(大坑)
静态代码块
static {
// 类加载只执行一次
}
作用:驱动加载、初始化配置、注册驱动
2. final(最终的、不可改变)
可修饰
- 类
- 方法
- 变量
规则
- final 类:不能被继承
final class String{} - final 方法:不能被重写
- final 变量:常量,只能赋值一次
- 基本类型:值不可变
- 引用类型:地址不可变,内容可变(大坑)
常量规范
public static final String USER_NAME = "张三";
全大写 + 下划线
3. abstract(抽象)
可修饰
- 类
- 方法
规则
-
抽象类
- 不能 new 对象
- 可以有抽象/非抽象方法
- 有构造器(给子类用)
-
抽象方法
public abstract void run();- 无方法体
- 子类必须重写,否则子类也是抽象类
禁忌
- abstract 不能与 private 共存
- abstract 不能与 static 共存
- abstract 不能与 final 共存
五、修饰符不能组合使用(面试必考)
- private + abstract → 冲突
- static + abstract → 冲突
- final + abstract → 冲突
- final + private → 可以,但无意义
- final + static → 常用(全局常量)
六、企业开发中最容易踩的坑(超级重要)
坑1:private 方法不能被重写
子类写同名方法 → 不是重写,是新方法
坑2:static 方法不能被重写,只能隐藏
多态无效,调用看左边
坑3:final 修饰引用类型,内容可以改
final User u = new User();
u.setName("张三"); // 可以改!
u = new User(); // 报错
坑4:protected 不是子类就能随便访问
必须通过继承关系访问,不能直接创建父类对象访问
坑5:default 权限,不同包的子类不能访问
坑6:static 常量滥用,高并发下线程不安全
坑7:static 方法无法被 Spring 事务管理(BUG 重灾区)
坑8:private 变量,子类不能直接访问,只能用 get/set
坑9:抽象类不能实例化,但可以有构造方法
坑10:final 方法会被 JVM 优化(内联),不能轻易去掉
七、修饰符使用顺序(规范)
正确顺序:
权限修饰符 → static → final → abstract
示例:
public static final int MAX = 100;
public abstract void run();
八、一张图记住所有修饰符
权限:private < default < protected < public
功能:
static:属于类,唯一一份
final:不可变、不能继承、不能重写
abstract:抽象、无实现、留给子类
九、高频面试题(100%考)
- 四个权限修饰符区别?
- static 作用与内存?
- final 可以修饰什么?
- abstract 不能和哪些修饰符共用?
- static 方法为什么不能访问非静态?
- 为什么抽象类有构造方法却不能实例化?
- protected 不同包子类如何访问?