Java基础 - 父类和子类的初始化顺序
顺序
1. 父类中静态成员变量和静态代码块
2. 子类中静态成员变量和静态代码块
3. 父类中普通成员变量和代码块,父类的构造函数
4. 子类中普通成员变量和代码块,子类的构造函数
其中“和”字两端的按照代码先后顺序执行:父类静态块→子类静态块→父类初始化块(成员变量,非静态代码块等)→父类构造方法→子类初始化块(成员变量,非静态代码块等)→子类构造方法
规律
先父后子、先静态后普通(普通成员变量、普通代码块、构造函数按照代码先后顺序执行)
class Parent { /* 静态变量 */ public static String p_StaticField = "父类--静态变量"; /* 变量 */ public String p_Field = "父类--变量"; protected int i = 9; protected int j = 0; /* 静态初始化块 */ static { System.out.println( p_StaticField ); System.out.println( "父类--静态初始化块" ); } /* 初始化块 */ { System.out.println( p_Field ); System.out.println( "父类--初始化块" ); } /* 构造器 */ public Parent() { System.out.println( "父类--构造器" ); System.out.println( "i=" + i + ", j=" + j ); j = 20; } } public class SubClass extends Parent { /* 静态变量 */ public static String s_StaticField = "子类--静态变量"; /* 变量 */ public String s_Field = "子类--变量"; /* 静态初始化块 */ static { System.out.println( s_StaticField ); System.out.println( "子类--静态初始化块" ); } /* 初始化块 */ { System.out.println( s_Field ); System.out.println( "子类--初始化块" ); } /* 构造器 */ public SubClass() { System.out.println( "子类--构造器" ); System.out.println( "i=" + i + ",j=" + j ); } /* 程序入口 */ public static void main( String[] args ) { System.out.println( "子类main方法" ); new SubClass(); } }
上面的初始化结果是:
-
父类--静态变量
-
父类--静态初始化块
-
子类--静态变量
-
子类--静态初始化块
-
子类main方法
-
父类--变量
-
父类--初始化块
-
父类--构造器
-
i=9, j=0
-
子类--变量
-
子类--初始化块
-
子类--构造器
-
i=9,j=20
子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。静态变量、静态初始化块,变量、初始化块初始化了顺序取决于它们在类中出现的先后顺序。
例子(必看)
看 [Java对象的初始化] 小节 https://segmentfault.com/a/1190000009707894
posted on 2020-08-30 00:50 frank_cui 阅读(2352) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?