Java三大修饰符abstract、static、final全面详解
在Java开发中, abstract 、 static 、 final 是使用频率极高的三大修饰符,分别代表抽象、静态、最终,修饰类、方法、变量时规则各不相同,本文结合底层内存与代码案例系统梳理。
一、abstract:抽象修饰符
abstract核心作用:约束子类重写方法,强制使用多态,仅能修饰类、普通方法,不能修饰变量。
1. 修饰类 → 抽象类
java
abstract class 类名{}
1. 编译照常生成独立 .class 字节码文件;
2. 不能直接new创建对象,但可以声明引用变量(多态常用: Animal a = new Dog(); );
3. 可以定义普通成员变量、普通成员方法、构造方法;构造方法作用:子类实例化时,优先调用父类构造完成抽象父类成员初始化。
2. 修饰方法 → 抽象方法
语法: [权限修饰符] abstract 返回值 方法名(形参);
1. 只有方法声明,没有方法体(无{});
2. 抽象方法必须写在抽象类/接口中,普通类不能包含抽象方法;
3. 继承规则:- 子类不想变成抽象类:必须重写父类所有抽象方法;
– 子类不重写全部抽象方法:子类必须定义为 abstract 抽象类。
3. 设计目的
强制子类实现抽象方法,约束多态落地,是面向对象抽象思想的代码实现。
二、static:静态修饰符
static标识属于类,不属于实例对象,修饰的内容在类加载阶段初始化,全局共享,可修饰属性、方法、代码块、内部类。
1. static修饰属性(静态变量/类变量)
语法
java
// 两种写法
权限 static 数据类型 变量名;
权限 static 数据类型 变量名 = 初始值;
核心特点
1. 所有对象共享同一份静态变量,存储在JVM方法区,不在堆对象中;实例变量存堆空间,每个对象独有。
2. 调用规范:推荐 类名.静态变量 ,不推荐 对象.静态变量 。
代码示例
java
class MyClass{
int value = 10; // 实例变量:每个对象独有
static int b = 30; // 静态变量:全类共享
}
public class TestStatic{
public static void main(String[] args) {
MyClass mc1 = new MyClass();
MyClass mc2 = new MyClass();
mc1.value = 50;
mc1.b = 48;
System.out.println(mc1.value);//50(实例独有)
System.out.println(mc1.b);//48
System.out.println(mc2.value);//10(实例独有)
System.out.println(mc2.b);//48(静态共享,一处修改全局生效)
}
}
内存逻辑:实例变量 value 在堆中两个对象各自存一份;静态变量 b 仅在方法区存一份,所有对象共用。
2. static修饰方法(静态方法/类方法)
语法
java
权限 static 返回值 方法名(形参){方法体}
调用: 类名.静态方法(实参) (标准写法)
四大硬性规则
1. 静态方法只能直接访问静态成员(静态变量、静态方法),不能直接访问实例变量/实例方法;
2. 非静态方法既能访问实例成员,也能直接访问静态成员;
3. 静态方法内不能使用this、super关键字(无当前实例对象);
4. 静态方法可被继承,但只能用静态方法重写,不存在多态。
拓展: System.out.println() 原理
java
class System{
// out是System类静态成员,引用PrintStream对象
public static PrintStream out = new PrintStream();
}
// 调用:静态属性out调用实例方法println
System.out.println();
3. static修饰代码块
分动态代码块(无static)、静态代码块(加static),执行时机完全不同。
① 动态代码块 {}
– 位置:类内部、方法外部;
– 执行时机:每次new对象时执行,在构造方法之前运行,用于实例变量初始化;
– 对象创建赋值顺序:分配内存赋默认值 → 动态代码块赋值 → 构造方法赋值。
② 静态代码块 static{} 【重点】
– 位置:类内部、方法外部;
– 执行时机:类加载时执行,全生命周期只执行1次,用于静态变量初始化;
类加载触发时机(重点)
1. 第一次new该类对象;
2. 第一次调用类的静态属性/静态方法;
3. 子类触发加载 → 优先加载父类,再加载子类;
注:仅声明引用 Animal a; 不触发类加载。
父子类加载&实例化全流程
1. 加载阶段:先父类→子类,依次执行各自静态代码块、初始化静态变量;
2. 实例化阶段:先父类对象→子类对象,依次执行父类动态代码块、父类构造;再子类动态代码块、子类构造。
4. static修饰内部类
静态内部类: static class 内部类名{} ,日常开发单例、工具类常用。
三、final:最终修饰符
final代表不可修改,可修饰变量、方法、类,修饰后内容无法二次修改/重写/继承。
1. final修饰变量(常量)
被final修饰后只能赋值1次,赋值后不可修改,分三类变量规则:
1. 局部final变量:使用前必须手动赋值1次;
2. 实例final变量:无默认值,三种赋值时机- 声明时直接初始化;
– 动态代码块赋值;
– 所有构造方法中统一赋值;
3. 静态final变量:无默认值,两种赋值时机- 声明时直接初始化;
– 静态代码块赋值;
关键: final 引用类型变量 :引用地址不可变,但对象内部属性可以修改( final User u = new User(); u.setName("xxx"); 合法,不能 u = new User() )。
2. final修饰方法
1. 方法可以被子类继承;
2. 禁止子类重写(Override),多用于锁定核心方法逻辑。
3. final修饰类
类不能被继承,没有子类,JDK大量源码使用: String、Math、System 等。
四、三大修饰符搭配总结
1. abstract和final不能一起修饰类/方法:abstract要子类重写/继承,final禁止继承/重写,逻辑冲突;
2. abstract和static不能一起修饰方法:抽象方法需要子类实例重写,静态方法属于类无实例,冲突;
3. final+static组合:定义全局静态常量( public static final int MAX = 100; ),项目常量定义标准写法。
Java三大修饰符abstract、static、final全面详解
未经允许不得转载:171主机测评 » Java三大修饰符abstract、static、final全面详解
相关推荐
Python Subinterpreter 到底解决了什么?线程、进程与子解释器的并行架构选型指南
Python Shared Memory 的代价:多个 Worker 如何高速、零拷贝且安全地共享大型 NumPy Array
踩坑30+后,我把C#上位机AI视觉系统跑在了Windows/Linux工控机上(统一架构+生产级落地)
踩坑20+,我把C#工业上位机无缝跑在了Windows/统信UOS/麒麟OS上(生产级方案)
Java 设计模式全景拆解:从单例工厂到策略责任链的三大类型实战指南
Rust+Slint 实现动态消息提示框源码分享
Python快速入门专业版(五十九):re实战——用正则爬取豆瓣电影Top250(全流程解析)
c++的guaranteed copy elision




