Java中的初始化顺序
一.在创建类时为成员变量赋值和在构造函数中的赋值的先后顺序
在未用构造器之前其实已经将类的字段进行了赋值只是在调用构造器时,又将类的字段进行了重新的赋值。如下:
package com.cjm.inititalize; public class Initialize2 { public static void main(String[] args) { new A1(); } } class A1{ private int i; private B1 b; public A1 () { System.out.println("在初始化函数调用前:i的值为:"+i+"在初始化之前引用b的值为:"+b); i=4; b=new B1(); System.out.println("初始化之后的i值为:"+i+"初始化之后的b为"+b); } } class B1{ }
结果如下:
1.非静态成员变量赋值优先于构造函数且成员变量的赋值顺序按照初始化的顺序
public class Inititalize { private A a1 = new A("a1"); public Inititalize() { System.out.println("Inititalize类被初始化!"); } private A a2=new A("a2"); public static void main(String[] args) { new Inititalize(); }
结果如下:
2.静态成员赋值优先于非静态成员赋值,非静态成员优先于构造函数的
注意:静态变量只会初始化一次,且必须在创建是就初始化
1 2 3 4 5 6 7 8 9 10 11 | public class Inititalize { private A a1 = new A( "a1" ); public Inititalize() { System.out.println( "Inititalize类被初始化!" ); } private static A a2= new A( "a2" ); public static void main(String[] args) { new Inititalize(); } } |
结果为:
3.静态方法块的初始化同样也优先于非静态成员赋值
注意静态方法的变量为局部变量,生命周期仅在方法块中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class Inititalize { private A a1 = new A( "a1" ); public Inititalize() { System.out.println( "Inititalize类被初始化!" ); } private static A a2= new A( "a2" ); public static void main(String[] args) { new Inititalize(); } static { A a3= new A( "a3" ); } } |
结果如下::
小结:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class Inititalize { private A a1 = new A( "a1" ); //4 private B b2= new B( "b2" ); //5 public Inititalize() { System.out.println( "Inititalize类被初始化!" ); } private static A a2= new A( "a2" ); //1 public static void main(String[] args) { new Inititalize(); } static { //2 A a3= new A( "a3" ); } private static B b1= new B( "b1" ); //3 } |
结果如下:
由上可知初始化顺序为:静态成员变量/静态方法块,成员变量初始化/方法块,构造函数。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· DeepSeek V3 两周使用总结
· 回顾我的软件开发经历(1)
· C#使用yield关键字提升迭代性能与效率
· 低成本高可用方案!Linux系统下SQL Server数据库镜像配置全流程详解
· 4. 使用sql查询excel内容