面试知识库
基础

static关键字#

一句话答案#

static 修饰的成员属于类而非实例:静态变量(类共享)、静态方法(无 this)、静态块(类加载时执行)、静态内部类。

核心要点

执行顺序: 父类静态块 → 子类静态块 → 父类构造 → 子类构造

注意: 静态方法不能访问非静态成员 / 不能被override(可以隐藏)

面试回答(2分钟版)

static修饰的成员属于类本身而非某个实例,主要有四种用法。静态变量是类级别共享的,所有实例访问同一份数据,存储在方法区中,随类加载而初始化。静态方法没有this引用,所以不能直接访问非静态成员,只能通过创建实例来调用实例方法。静态代码块在类加载时执行且只执行一次,常用于初始化静态资源。静态内部类不持有外部类的引用,不会导致外部类无法被回收造成内存泄漏,这也是推荐优先使用静态内部类的原因。类的初始化顺序是面试常考点:父类静态代码块和静态变量先于子类静态代码块和静态变量执行,然后是父类的实例代码块和构造方法,最后是子类的实例代码块和构造方法。需要特别注意static方法不能被Override只能被Hide,多态对静态方法无效——调用哪个版本取决于引用的编译时类型而非运行时类型。还要注意不要滥用静态变量做缓存,因为它是GC Root的一部分不会被回收,容易导致内存泄漏。

追问与易错

追问方向:

  • “静态方法能调用非静态方法吗?”→ 不能直接调用,因为静态方法没有 this 引用;必须先创建实例再通过实例调用非静态方法
  • “静态内部类和非静态内部类的区别?”→ 静态内部类不持有外部类的隐式引用,不会导致外部类无法被 GC 回收;非静态内部类持有外部类引用,容易造成内存泄漏
  • 类的初始化顺序?(父类静态→子类静态→父类实例/构造→子类实例/构造)

易错点:

  • ❌ “static 方法可以被重写”——不能重写只能隐藏(hide),多态对静态方法无效
  • ❌ 滥用静态变量作为缓存——全局可见+GC 无法回收,容易内存泄漏