Java中静态变量、实例变量赋值

1. 静态变量赋值流程

+----------------------------------+---------------------------+---------------------------+---------------------------+-----------------------------+
|           赋值情况              |        类加载阶段         |       类初始化阶段        |        静态变量赋值        |      `final`修饰          |
+----------------------------------+---------------------------+---------------------------+---------------------------+-----------------------------+
| 1. 声明时赋值,未`final`         | staticVar = 10            | 不需要再赋值               | staticVar = 10            | 否                          |
+----------------------------------+---------------------------+---------------------------+---------------------------+-----------------------------+
| 2. 声明时赋值,已`final`         | staticFinalVar = 10       | 不需要再赋值               | staticFinalVar = 10       | 是                          |
+----------------------------------+---------------------------+---------------------------+---------------------------+-----------------------------+
| 3. 声明时未赋值,未`final`       | staticVar = 0 (默认值)    | staticVar = 10            | staticVar = 10            | 否                          |
+----------------------------------+---------------------------+---------------------------+---------------------------+-----------------------------+
| 4. 声明时未赋值,已`final`       | staticFinalVar = 0 (默认值) | staticFinalVar = 10       | staticFinalVar = 10       | 是                          |
+----------------------------------+---------------------------+---------------------------+---------------------------+-----------------------------+

2.实例变量赋值流程

+------------------+----------------------------+-----------------------------+
| 阶段             | 创建对象时发生的过程        | 对应的实例变量赋值          |
+------------------+----------------------------+-----------------------------+
| **类加载阶段**   | 类加载时,静态变量初始化     | 静态变量赋值,实例变量不赋值 |
| **实例初始化**   | 对象创建时分配内存并赋默认值 | 实例变量赋默认值(例如 0,null) |
| **构造器阶段**    | 构造器调用                  | 构造器中显式赋值,覆盖默认值  |
+------------------+----------------------------+-----------------------------+

### Java静态变量的修改赋值方法 #### 直接赋值 在类定义时可以直接为静态变量赋值,这是最常见的初始化赋值方式。 ```java public class StaticVariableExample { // 直接赋值 static int staticVar = 10; public static void main(String[] args) { System.out.println(staticVar); } } ``` #### 在静态代码块中赋值 静态代码块在类加载时执行,且只执行一次,可以在其中对静态变量进行赋值操作。 ```java public class StaticBlockExample { static int staticVar; static { // 在静态代码块中赋值 staticVar = 20; } public static void main(String[] args) { System.out.println(staticVar); } } ``` #### 在静态方法中修改赋值 可以定义静态方法,在方法内部对静态变量进行修改赋值。 ```java public class StaticMethodExample { static int staticVar = 30; public static void updateStaticVar(int newValue) { // 在静态方法中修改赋值 staticVar = newValue; } public static void main(String[] args) { updateStaticVar(40); System.out.println(staticVar); } } ``` ### Java静态变量的修改赋值规则 #### 类加载阶段的默认赋值 在类加载的准备阶段,JVM 为静态变量分配内存,并赋予默认值,如数字类型为 0,布尔类型为 false,引用类型为 null [^2]。 ```java public class DefaultAssignmentExample { static int intVar; static boolean boolVar; static Object objVar; public static void main(String[] args) { System.out.println(intVar); System.out.println(boolVar); System.out.println(objVar); } } ``` #### 初始化顺序规则 静态变量静态代码块按照在类中定义的顺序依次初始化。静态代码块对于定义在它之后的静态变量,可以赋值,但是不能访问 [^3]。 ```java public class InitializationOrderExample { static int var1 = 1; static { // 可以对定义在后面的静态变量赋值 var2 = 2; // 编译错误,不能访问定义在后面的静态变量 // System.out.println(var2); } static int var2; public static void main(String[] args) { System.out.println(var1); System.out.println(var2); } } ``` #### 线程安全问题 静态变量是类级别的变量,所有类的实例共享该静态变量。在多线程环境下,如果多个线程同时修改静态变量,可能会出现线程安全问题,需要进行同步处理。 ```java public class ThreadSafetyExample { static int sharedStaticVar = 0; public static synchronized void increment() { sharedStaticVar++; } public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { for (int i = 0; i < 1000; i++) { increment(); } }); Thread t2 = new Thread(() -> { for (int i = 0; i < 1000; i++) { increment(); } }); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(sharedStaticVar); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值