欢迎光临
我们一直在努力

Java三大修饰符abstract、static、final全面详解

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; ),项目常量定义标准写法。

赞(0)
未经允许不得转载:171主机测评 » Java三大修饰符abstract、static、final全面详解
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址