Java9三大修饰符

一、abstract(抽象的)

1. abstract修饰类

(1) 被abstract修饰的类称为抽象类
语法:abstract class 类名{}
(2) 抽象类编译后依然会生成独立的.class字节码文件
(3) 抽象类不能直接new创建对象,但可以声明引用类型
(4) 抽象类中既可以定义成员变量,也可以定义普通成员方法
(5) 抽象类包含构造方法;抽象类的构造方法,主要用于子类创建对象时,优先完成父类对象初始化。

2. abstract修饰方法

(1) 被abstract修饰的方法称为抽象方法
(2) 抽象方法只有方法声明,没有方法体实现(连{}都不能写)
语法:访问修饰符 abstract 返回值类型 方法名(形参列表);
注意:访问修饰符 和 abstract 书写先后顺序不做要求。
(3) 抽象方法只能定义在抽象类中;抽象类既可以包含抽象方法,也可以包含普通非抽象方法。
(4) 继承规则:子类继承抽象类后,如果不想自身也变成抽象类,必须重写覆盖父类所有抽象方法;否则子类也必须定义为抽象类。

3. 抽象类核心作用

强制子类实现重写抽象方法,强制使用多态。
二、static(静态的)

1. static修饰属性【开发重点】

(1) static修饰的属性:静态属性、静态变量、类变量
(2) 语法格式
访问修饰符 static 数据类型 属性名;
访问修饰符 static 数据类型 属性名 = 初始值;
注意:访问修饰符与static先后书写顺序无要求。
(3) 核心特点:静态属性属于整个类所有,为全部对象共享,和创建多少个实例对象无关。
(4) 访问方式
a. 对象名.静态属性名;  // 语法允许,但开发不推荐
b. 类名.静态属性名;    // 标准推荐写法

2. static修饰方法【开发重点】

(1) static修饰的方法叫做静态方法/类方法
(2) 语法:访问修饰符 static 返回值类型 方法名(形参列表){ 方法体实现 }
(3) 调用方式
类名.静态方法名(实参);   // 推荐
对象名.静态方法名(实参); // 不推荐
(4) 四条关键规则
a. 静态方法只能直接访问本类静态成员(静态属性、静态方法);不能直接访问非静态成员。
b. 非静态方法:既可以访问本类非静态成员(实例变量、普通成员方法),也能直接访问本类静态成员。
c. 静态方法不能使用this、super关键字。
d. 静态方法允许被子类继承;静态方法只能被子类静态方法重写覆盖,但不存在多态效果。

补充:静态方法如果要访问非静态成员,只能先创建对象,通过对象名调用非静态内容。

拓展思考:System.out.println();底层原理

• System:系统提供的类名

• out:System类中定义的静态属性,类型为引用对象

• println():out指向对象里面的普通成员方法

示例简易模拟:
class A{
    static B out = new B(); // 静态属性,存储对象地址
}
class B{
    public void method(){
        System.out.println("B类中的方法method...");
    }
}
3. static修饰初始化代码块(了解)

① 动态代码块(非静态代码块)

• 位置:类内部、方法外部,格式{ 代码内容 }

• 执行时机:每次创建对象时执行,固定执行顺序:
分配内存空间→属性赋默认值→初始化属性赋值→动态代码块执行→执行构造方法

② 静态代码块(重点)

格式:static { 代码内容 }
a. 位置:类内部、方法外部,必须加static修饰
b. 作用:类加载的时候执行,用于给静态属性完成初始化赋值;整个程序运行期间,类只会加载1次,所以静态代码块仅执行唯一一次。
c. 类加载概念:JVM第一次使用某个类时,读取class文件信息存入内存;一个类只会加载一次。

触发类加载的3种时机

① 第一次new创建该类对象:先执行类加载,再创建对象
② 第一次调用该类静态成员(静态属性、静态方法)
③ 子类触发加载时,会优先加载父类

• 调用子类静态成员:先加载父类→再加载子类

• 创建子类对象:先加载父类→再加载子类

父子类完整执行顺序

1. 加载阶段:优先加载父类 → 执行父类静态代码块;再加载子类 → 执行子类静态代码块

2. 创建对象阶段:先初始化父类对象 → 执行父类动态代码块→父类构造方法;再初始化子类对象→子类动态代码块→子类构造方法

⚠️注意:仅声明引用变量,不会触发类加载。

4. static修饰内部类

静态内部类,使用static class 内部类名{}定义。
三、final(最终的、不可更改的)

1. final修饰变量(局部变量、实例变量、静态变量)

(1) final修饰的变量属于常量,仅允许赋值一次,赋值完成后无法修改值,但可以正常读取使用。
(2) final修饰实例变量:不会赋予系统默认初始值,三种合法初始化时机:
a. 声明变量时直接赋值
b. 在每一个构造方法中完成赋值(所有构造方法都必须为该final属性赋值)
c. 在动态代码块中赋值

(3) final修饰静态变量:无默认值,两种初始化时机:
a. 声明同时直接赋值
b. 在静态代码块中赋值

补充:final修饰引用类型变量,代表引用存储的对象地址不能修改,但对象内部属性值可以正常修改。

2. final修饰方法

方法可以被子类正常继承,但是子类不能重写覆盖该方法。

3. final修饰类

被final修饰的类禁止被继承,没有子类。
常见举例:String、System、Math类全部都是final类。

更多推荐