MST
星途 面试题库

面试题:Java复杂嵌套类及匿名内部类的初始化顺序

假设有一个Java类Outer,在其内部有一个静态嵌套类StaticInner,一个成员内部类MemberInner,以及在某个方法中定义的局部内部类LocalInner和匿名内部类AnonymousInner。每个内部类都包含静态变量、实例变量、静态代码块、实例代码块和构造函数。请分析并说明当在Outer类的main方法中分别创建这些内部类对象时,它们各自的初始化顺序以及相互之间的影响。
21.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 静态嵌套类StaticInner
    • 初始化顺序
      • 静态变量按声明顺序初始化。
      • 静态代码块按出现顺序执行。
      • 构造函数在对象创建时执行。
    • 与其他内部类关系:与其他非静态内部类(MemberInner、LocalInner、AnonymousInner)生命周期和初始化相互独立,因为静态嵌套类不依赖外部类实例。
  2. 成员内部类MemberInner
    • 初始化顺序
      • 外部类实例创建。
      • 成员内部类实例变量按声明顺序初始化。
      • 成员内部类实例代码块按出现顺序执行。
      • 成员内部类构造函数执行。
    • 与其他内部类关系:依赖外部类实例,创建成员内部类实例前必须先有外部类实例。与局部内部类、匿名内部类在不同作用域,互不干扰,但都依赖外部类实例。
  3. 局部内部类LocalInner
    • 初始化顺序
      • 当包含局部内部类的方法被调用时。
      • 局部内部类实例变量按声明顺序初始化。
      • 局部内部类实例代码块按出现顺序执行。
      • 局部内部类构造函数执行。
    • 与其他内部类关系:作用域局限于方法内,与其他内部类在不同作用域,互不干扰,但同样依赖外部类实例(若访问外部类成员)。
  4. 匿名内部类AnonymousInner
    • 初始化顺序
      • 当匿名内部类表达式所在代码执行时。
      • 匿名内部类实例变量按声明顺序初始化。
      • 匿名内部类实例代码块按出现顺序执行。
      • 匿名内部类构造(若有构造逻辑,通过实例代码块模拟构造逻辑)。
    • 与其他内部类关系:作用域局限于其所在表达式位置,与其他内部类在不同作用域,互不干扰,同样依赖外部类实例(若访问外部类成员)。