static 初始化原理


public class Test {
 
  static Test t= new Test();
  static int count1;
  static int count2=0;
  Test(){
   count1++;
   count2++;
  }
  public static void main(String[] args) {
 System.out.println(t.count1);
 System.out.println(t.count2);
}
 
}

 

打印结果为

1

0

先为红色部分分配内存空间   。创建对象,赋值操作,从上到下依次执行
### 初始化原理 在 Java 中,`static` 关键字修饰的内容属于类,而非类的实例。因此,`static` 变量在内存中只有一份,被该类的所有实例共享。这意味着一个实例对 `static` 变量的修改,会影响到其他所有实例对该变量的访问。`static` 关键字可用于修饰类、方法、变量等,使用 `static` 修饰的内容可以不实例化类,而直接通过类名进行调用。静态初始化块主要用于初始化类变量(`static` 字段),适用于在初始化过程中需要执行较复杂逻辑、循环或错误处理的场景,并且希望在类加载时就完成初始化,而非在创建对象时 [^1]。 ### 初始化过程 当涉及父子类时,静态代码块的调用顺序是:父类静态代码块 > 子类静态代码块 > 父类构造代码块 > 父类构造方法 > 子类构造代码块 > 子类构造方法。这是因为类加载时,会先加载父类,执行父类的静态代码块,再加载子类,执行子类的静态代码块。之后,在创建对象时,会依次执行父类和子类的构造代码块与构造方法 [^2]。 ### 示例 #### 静态变量初始化 ```java public class MyClass { private static int myStaticVar; static { try { myStaticVar = 100; } catch (Exception e) { myStaticVar = -1; } } public static void main(String[] args) { System.out.println(MyClass.myStaticVar); } } ``` 在这个示例中,`myStaticVar` 是一个静态变量,通过静态初始化块进行初始化。在类加载时,静态初始化块会执行,将 `myStaticVar` 赋值为 100。如果在赋值过程中出现异常,则将其赋值为 -1 [^1]。 #### 父子类静态代码块示例 ```java class Father { static { System.out.println("我是父类的 static 代码块"); } { System.out.println("我是父类的构造代码块"); } Father() { System.out.println("我是父类的构造方法"); } } class Son extends Father { static { System.out.println("我是子类的 static 代码块"); } { System.out.println("我是子类的构造代码块"); } public Son() { System.out.println("我是子类的构造方法"); } public static void main(String[] args) { Son son = new Son(); } } ``` 在这个示例中,创建 `Son` 类的对象时,会先执行父类的静态代码块,再执行子类的静态代码块,然后依次执行父类和子类的构造代码块与构造方法 [^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邻居出行

码农不易,相互鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值