Java中的静态变量使用

       同样是static的关键字修饰,但是感觉Java中的静态变量跟C语言中的静态变量还真不是一回事儿。从作用的广度上来说,Java重的static修饰后的静态变量倒是作用的广度更广一些。

       写一段简单的代码:

public classStaticDemo

{

       public static void main(String[] args)

       {

              Demo demo_var1 = new Demo();

              Demo demo_var2 = new Demo();

 

              demo_var1.static_value = 123;

 

              System.out.println("staticvalue of var1:" + demo_var1.static_value);

              System.out.println("staticvalue of var2:" + demo_var1.static_value);

 

              demo_var1.normal_value = 234;

 

             System.out.println("normalvalue of var1:" + demo_var1.normal_value);

             System.out.println("normalvalue of var2:" + demo_var2.normal_value);

       }

}

 

class Demo

{

       static int static_value = 0;

       int normal_value = 0;

}

       编译执行如下:

E:\WorkSpace\02_技术实践\01_编程语言\05_Java\02_Java从入门到精通\05_类和对象>dir

 驱动器 E 中的卷没有标签。

 卷的序列号是 2013-5089

 

 E:\WorkSpace\02_技术实践\01_编程语言\05_Java\02_Java从入门到精通\05_类和对象 的目录

 

2017/03/15  20:13   <DIR>          .

2017/03/15  20:13   <DIR>          ..

2017/03/15  19:43               587 StaticDemo.java

               1 个文件            587 字节

               2 个目录79,102,492,672 可用字节

 

E:\WorkSpace\02_技术实践\01_编程语言\05_Java\02_Java从入门到精通\05_类和对象>javac StaticDemo.java

 

E:\WorkSpace\02_技术实践\01_编程语言\05_Java\02_Java从入门到精通\05_类和对象>dir

 驱动器 E 中的卷没有标签。

 卷的序列号是 2013-5089

 

 E:\WorkSpace\02_技术实践\01_编程语言\05_Java\02_Java从入门到精通\05_类和对象 的目录

 

2017/03/15  20:13   <DIR>          .

2017/03/15  20:13    <DIR>          ..

2017/03/15  20:13               321 Demo.class

2017/03/15  20:13               935 StaticDemo.class

2017/03/15  19:43               587 StaticDemo.java

               3 个文件          1,843 字节

               2 个目录79,102,488,576 可用字节

 

E:\WorkSpace\02_技术实践\01_编程语言\05_Java\02_Java从入门到精通\05_类和对象>java StaticDemo

static value ofvar1:123

static value ofvar2:123

normal value ofvar1:234

normal value ofvar2:0

       从运行的结果来看,静态变量修改过之后所有的此类对象相应的属性全都会修改。相比之下,普通的属性则不是这样。同时值得注意的是,编译之后产生了两个class文件。这是因为java代码文件中可以存在多个类的定义,但是只有一个类是public修饰的类,而且这个类的名称必须与文件名一致。而编译的过程中,每一个类的代码都会对应着一个相应的class文件。

### 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、付费专栏及课程。

余额充值