java学习
静态内部类和非静态内部类
| 静态内部类 | 非静态内部类 |
内部定义的成员变量、方法 | 可以是静态的,也可以是非静态的 | 不能定义静态成员(包括静态变量、静态方法、静态内部类),因为静态成员属于类级别的,定义了后不知道这个成员到底是属于内部类还是外部类。 |
访问外部类成员的权限 | 只能访问外部类的静态成员(包括private static),不能访问非静态成员。 | 可以直接访问外部类的所有成员(包括private成员),无论是静态还是非静态。 |
创建方法 | 不依赖于外部类的实例化,直接创建 | 依赖于外部类的实例化 |
垃圾回收 | 不持有外部类引用,无右边所述的内存泄漏问题,更 “轻量” | 因持有外部类引用,可能导致外部类对象无法被 GC 回收(内存泄漏风险),尤其当内部类对象生命周期长于外部类时。 |
内部类的权限:
内部类权限 | 访问范围 | 典型用途 |
private | 仅外部类自身 | 完全封装内部逻辑,不对外暴露 |
默认(包权限) | 同一包下的类,其他包的类(包括子类)无法访问 | 包内共享内部实现 |
public/protected | 更广范围(所有类 / 子类 + 同包) | 对外暴露内部结构(如 HashMap.Entry) |
方法的重载和重写
重载:在同一个类中,多个方法具有相同的方法名,但参数列表不同(参数类型、个数、顺序不同),这种现象称为重载只要求方法的名字一样,且方法的参数类型或个数不一样,对返回值无要求。
重写:方法名和参数和返回值是一样的。
定义:在继承关系中,子类定义了一个与父类方法名、参数列表完全相同的方法,用于覆盖父类的实现,这种现象称为重写。
核心规则(“两同两小一大”):
- 方法名、参数列表必须完全相同(与父类方法签名一致);
- 返回值类型:
- 访问修饰符:子类方法的访问权限不能比父类更严格(如父类是 public,子类不能是 private);
- 异常声明:子类方法不能抛出比父类方法范围更大的受检异常(可少抛、不抛或抛子类异常);
- 静态方法不能被重写(静态方法属于类,子类的同名静态方法只是 “隐藏” 父类方法,而非重写);
- final 方法不能被重写(final 修饰的方法禁止子类修改)。
final
修饰不同元素的核心特性
类 | 不可继承 | 无子类,类的所有方法默认不可重写(无需额外加 final) |
方法 | 不可重写 | 可被继承和调用,但子类不能覆盖其实现 |
基本类型变量 | 数值不可变 | 赋值后不能修改 |
引用类型变量 | 引用地址不可变 | 不能指向新对象,但对象内部属性可修改 |
成员变量 | 必须在初始化阶段赋值 | 实例变量在构造前赋值,类变量在类加载前赋值 |
方法参数 | 方法内部不可修改参数值 / 引用 | 保护参数不被意外修改 |
在 Java 中,范围限定符就是public、protected、
默认(无修饰符)private |