七、java修饰符

2 阅读4分钟

Java 修饰符 超详细大全

public / private / protected / default / static / final / abstract 全部一次性整理到位,包含作用、使用范围、执行顺序、企业坑、内存规则,是你能找到最完整的版本。


一、Java 修饰符分类

1. 权限修饰符(4个)

控制访问范围

  • private
  • default(缺省,不写)
  • protected
  • public

2. 状态/功能修饰符(3个)

控制生命周期、特性、功能

  • static
  • final
  • abstract

二、权限修饰符(最核心)

1. private(私人的)

  • 范围:仅当前类内部可访问
  • 可修饰:成员变量、成员方法、构造器
  • 不可修饰:类、接口

作用

  • 封装核心,禁止外部直接访问
  • 安全、防止脏数据

企业规范:所有成员变量必须 private


2. default(缺省/包权限)

  • 不写任何修饰符
  • 范围:当前类 + 同包类
  • 可修饰:类、接口、变量、方法

作用:包内部使用,对外隐藏


3. protected(受保护的)

  • 范围:同包 + 不同包的子类
  • 可修饰:变量、方法、构造器
  • 不可修饰:类(外部类)

作用:留给子类扩展使用


4. public(公共的)

  • 范围:任意位置
  • 可修饰:类、接口、变量、方法

作用:对外提供接口、服务、API


三、权限修饰符范围表(背会)

修饰符同类同包子类(不同包)任意位置
private
default
protected
public

四、功能修饰符(static / final / abstract)

1. static(静态)

可修饰

  • 成员变量
  • 成员方法
  • 代码块
  • 内部类

特点

  • 属于类,不属于对象
  • 类加载时初始化,全局只有一份
  • 优先于对象存在
  • 静态方法不能访问非静态成员
  • 静态方法不能用 thissuper

执行顺序

静态内容 > 构造代码块 > 构造方法

静态变量

public static int count;
  • 所有对象共享一份
  • 类名直接访问

静态方法

public static void method(){}
  • 工具类常用
  • 不能被重写,只能隐藏
  • Spring 事务、AOP 对 static 方法无效!!!(大坑)

静态代码块

static {
    // 类加载只执行一次
}

作用:驱动加载、初始化配置、注册驱动


2. final(最终的、不可改变)

可修饰

  • 方法
  • 变量

规则

  1. final 类:不能被继承
    final class String{}
    
  2. final 方法:不能被重写
  3. final 变量:常量,只能赋值一次
    • 基本类型:值不可变
    • 引用类型:地址不可变,内容可变(大坑)

常量规范

public static final String USER_NAME = "张三";

全大写 + 下划线


3. abstract(抽象)

可修饰

  • 方法

规则

  1. 抽象类

    • 不能 new 对象
    • 可以有抽象/非抽象方法
    • 有构造器(给子类用)
  2. 抽象方法

    public abstract void run();
    
    • 无方法体
    • 子类必须重写,否则子类也是抽象类

禁忌

  • abstract 不能与 private 共存
  • abstract 不能与 static 共存
  • abstract 不能与 final 共存

五、修饰符不能组合使用(面试必考)

  1. private + abstract → 冲突
  2. static + abstract → 冲突
  3. final + abstract → 冲突
  4. final + private → 可以,但无意义
  5. 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 优化(内联),不能轻易去掉


七、修饰符使用顺序(规范)

正确顺序:

权限修饰符 → staticfinalabstract

示例:

public static final int MAX = 100;
public abstract void run();

八、一张图记住所有修饰符

权限:private < default < protected < public
功能:
   static:属于类,唯一一份
   final:不可变、不能继承、不能重写
   abstract:抽象、无实现、留给子类

九、高频面试题(100%考)

  1. 四个权限修饰符区别?
  2. static 作用与内存?
  3. final 可以修饰什么?
  4. abstract 不能和哪些修饰符共用?
  5. static 方法为什么不能访问非静态?
  6. 为什么抽象类有构造方法却不能实例化?
  7. protected 不同包子类如何访问?