中 基础
static关键字#
一句话答案#
static 修饰的成员属于类而非实例:静态变量(类共享)、静态方法(无 this)、静态块(类加载时执行)、静态内部类。
核心要点
执行顺序: 父类静态块 → 子类静态块 → 父类构造 → 子类构造
注意: 静态方法不能访问非静态成员 / 不能被override(可以隐藏)
面试回答(2分钟版)
static修饰的成员属于类本身而非某个实例,主要有四种用法。静态变量是类级别共享的,所有实例访问同一份数据,存储在方法区中,随类加载而初始化。静态方法没有this引用,所以不能直接访问非静态成员,只能通过创建实例来调用实例方法。静态代码块在类加载时执行且只执行一次,常用于初始化静态资源。静态内部类不持有外部类的引用,不会导致外部类无法被回收造成内存泄漏,这也是推荐优先使用静态内部类的原因。类的初始化顺序是面试常考点:父类静态代码块和静态变量先于子类静态代码块和静态变量执行,然后是父类的实例代码块和构造方法,最后是子类的实例代码块和构造方法。需要特别注意static方法不能被Override只能被Hide,多态对静态方法无效——调用哪个版本取决于引用的编译时类型而非运行时类型。还要注意不要滥用静态变量做缓存,因为它是GC Root的一部分不会被回收,容易导致内存泄漏。
追问与易错
追问方向:
- “静态方法能调用非静态方法吗?”→ 不能直接调用,因为静态方法没有 this 引用;必须先创建实例再通过实例调用非静态方法
- “静态内部类和非静态内部类的区别?”→ 静态内部类不持有外部类的隐式引用,不会导致外部类无法被 GC 回收;非静态内部类持有外部类引用,容易造成内存泄漏
- 类的初始化顺序?(父类静态→子类静态→父类实例/构造→子类实例/构造)
易错点:
- ❌ “static 方法可以被重写”——不能重写只能隐藏(hide),多态对静态方法无效
- ❌ 滥用静态变量作为缓存——全局可见+GC 无法回收,容易内存泄漏