吃透三大修饰符与接口内部类|Java第五单元学习笔记
一、abstract抽象修饰符(模板设计核心)
1. 抽象类 abstract class
✅ 编译产物:独立 .class 字节码文件
✅ 语法: abstract class 类名 {}
❌ 限制:无法直接 new 实例对象,仅能声明引用、依靠多态绑定子类
✅ 内部组成:实例变量 + 普通成员方法 + 构造方法 + 抽象方法
💡构造器作用:子类实例化时,优先调用父类构造,完成父类空间初始化
2. 抽象方法
- 格式: [权限] abstract 返回值 方法名(参数);
- 细节:权限符与 abstract 书写顺序无强制要求、无{}方法体
- 约束:
① 仅能定义在抽象类/接口中
② 实体子类:必须重写父类全部抽象方法
③ 抽象子类:可暂缓实现抽象方法
🎯 设计目的:强制子类落地实现,约束多态落地
二、static静态修饰符(类级资源,附JVM内存图逻辑)
1. static修饰成员变量(类变量)
📌内存位置:JVM方法区(对比实例变量存堆内存)
- 特征:全类对象共享同一份数据,任一实例修改后全局生效
- 调用规范:
类名.静态变量名; // 推荐写法
对象.静态变量名; // 不推荐(语法合法,可读性差)
课件示例:mc1修改静态变量b=48,mc2访问b同样为48
2. static修饰静态方法
1. 访问边界:仅能直接访问本类静态成员(静态属性/静态方法)
2. 禁用关键字: this / super
3. 对比:普通实例方法 → 实例、静态成员均可随意访问
4. 继承规则:可被子类继承,仅静态方法能重写,不构成多态
💡静态方法想要调用实例成员:手动new对象,依托对象访问
3. 代码块分类&执行时机
▷ 实例代码块 {} (动态代码块)
位置:类内、方法外 | 触发:每次 new 对象执行,在构造方法之前运行
对象初始化赋值顺序:默认值 → 实例代码块二次赋值 → 构造器三次赋值
▷ 静态代码块 static{}
触发:类加载阶段只执行1次,用于静态变量初始化
4. 类加载触发条件(3种场景)
① 首次 new 创建类实例
② 首次调用类的静态属性/静态方法
③ 子类加载 → 递归优先加载全部父类
⚠ 仅声明引用 MyClass mc; 不会触发类加载
5. 父子类完整初始化顺序
父类静态代码块 → 子类静态代码块
→ 父类实例代码块 → 父类构造方法
→ 子类实例代码块 → 子类构造方法
三、final最终修饰符(不可变约束)
1. final修饰变量(常量,仅单次赋值)
- 局部变量:使用前任意位置一次性赋值
- 实例成员变量(无默认值)三选一初始化:
①定义处直接赋值 ②全部构造方法内赋值 ③实例代码块赋值
- 静态final常量二选一:定义赋值 / 静态代码块赋值
引用类型final:地址不可变,但对象内部属性可以修改
2. final修饰方法
可以正常继承,禁止子类重写覆写
3. final修饰类
整个类禁止被继承
示例: String、Math、System
四、interface接口(开发规范契约)
1. 基础语法特性
- 关键字 interface ,编译生成独立 .class ,接口≠类
- 无构造方法,无法直接new创建对象,仅声明引用
- 成员默认修饰:
字段:隐式 public static final (常量,必须初始化)
抽象方法:隐式 public abstract
2. 实现规则 implements
class 实现类 implements 接口名{
// 普通类必须重写接口全部抽象方法,权限固定public
}
// 多态标准写法
接口名 ref = new 实现类();
3. 继承&多实现语法
1. 接口→多继承: interface A extends B,C
2. 类→多实现: class Test implements I1,I2
3. 混合写法:先继承extends,后实现implements
class Son extends Father implements I1,I2
4. 接口开发价值
1. 突破Java单继承局限,拓展子类额外功能;
2. 解耦:接口定标准,实现方与调用方分离,降低代码耦合;
3. 接口回调:先编写接口使用者,后期补充实现类
5. 接口 vs 抽象类核心区别
抽象类:描述事物共性,成员无修饰限制(实例/静态/final变量都支持)
接口:定义行为规范,仅常量+抽象方法;接口多继承、抽象类单继承
五、四大内部类(编译:外部类$内部类.class)
1. 成员内部类(类比实例变量)
// 创建格式
Outer o = new Outer();
Outer.Inner in = o.new Inner();
✅ 优势:可直接访问外部类所有私有成员
❌ 限制:不能定义static静态成员
💡同名变量区分: Outer.this.属性名 访问外部类字段
2. 静态内部类(static修饰,类比静态变量)
Outer.Inner in = new Outer.Inner();
约束:仅能访问外部类 static 修饰的成员
权限:自身可自定义实例变量、静态变量
3. 局部内部类(定义在方法体内)
作用域:仅限当前方法内部创建、使用
JDK8+语法糖:被内部类访问的局部变量,编译器自动添加 final
4. 匿名内部类(极简一次性子类,高频开发)
接口名 ref = new 接口名(){
// 重写接口抽象方法
};
- 特点:无类名、定义+实例化同步完成,只能创建单个对象
- 优缺点:精简冗余代码 | 代码可读性偏低
更多推荐


所有评论(0)