Java静态变量到底能不能变?
## 简介 学习Java时,面向对象的思想极其重要,如果对于面向对象的思想理解不到位,会有很多知识点
渲染中...
## 简介
学习Java时,面向对象的思想极其重要,如果对于面向对象的思想理解不到位,会有很多知识点无法真正理解,对知识点的不理解常表现为出现很多疑问,`Java静态变量到底能不能变?`就是很常见的其中一个疑问。
本文从一个简单的代码示例入手,真实感受一下`静态变量`的变化,希望能帮助大家解答这个问题。
**编程切勿纸上谈兵,一切代码都需要自己去实践和感受,才能建立自己的理解。**
<div class="article-ads"></div>
<!-- more -->
## 代码分析
### 代码
```java
public class AccessProperty {
int normal_i = 0; // 定义普通变量
static int static_i = 0; // 定义静态变量
public static void main(String[] args) {
AccessProperty ap1 = new AccessProperty(); // 创建对象实例 ap1
AccessProperty ap2 = new AccessProperty(); // 创建对象实例 ap2
ap1.normal_i = 1; // 修改 ap1 的普通变量 normal_i 为 1
ap2.static_i = 2; // 修改 ap2 的静态变量 static_i 为 2
// 输出 ap1 数据
System.out.println("实例ap1普通变量normal_i:" + ap1.normal_i); // 输出 1
System.out.println("实例ap1静态变量static_i:" + ap1.static_i); // 输出 2
// 输出 ap2 数据
System.out.println("实例ap2普通变量normal_i:" + ap2.normal_i); // 输出 0
System.out.println("实例ap2静态变量static_i:" + ap2.static_i); // 输出 2
}
}
```
### 执行结果
```
实例ap1普通变量normal_i:1
实例ap1静态变量static_i:2
实例ap2普通变量normal_i:0
实例ap2静态变量static_i:2
```
### 现象和总结
#### 现象
- 初始状态:创建了两个对象实例`ap1`、`ap2`,初始情况下,两个对象的两个变量值都为0;
- 修改动作:修改`ap1`的变量`normal_i`值为1,修改`ap2`的变量`static_i`值为2;
- 最终结果:`ap1.normal_i`修改为1,做种结果为1;`ap1.static_i`未修改,但结果变为2;`ap2.normal_i`未修改,未变化;`ap1.static_i`修改为2,做种结果为2。
#### 总结
- 普通变量`normal_i`在两个对象实例中互相独立,互相不影响。
- 静态变量`static_i`在两个对象实例中互相不独立,互相影响。
由此可知,静态变量可以变,但无论多少个实例,只能有一个值。
---
**以上是我初学时自己测试的结果和自己的总结,下边写一些工作后自己的理解总结**
---
<div class="article-ads"></div>
## 理解总结
经过后续的工作和学习,对变量有了较深刻的理解。
java中变量主要分为:局部变量、成员变量,而成员变量又分为实例变量(普通变量)和类变量(静态变量)。
### Java变量
以作用范围从小到大讲解:
> - 局部变量:在方法内部声明(定义)的变量,只在这个方法内部有效,出了这个方法就无法使用了,即被`销毁`。比如代码中的 ap1 和 ap2 ,只在main方法中可用。
>
> - 实例变量:成员变量中的实例变量,没有使用static关键字修饰的成员变量,如代码中的变量 normal_i ;他在每一个实例化的对象中都是独立的,每个对象修改其值后,只是修改他自己的这个变量 normal_i ,其他对象的 normal_i 不受影响。用底层的理解就是:每个对象的变量 normal_i 有独立的内存,他们互不影响。
>
> - 类变量:成员变量中的类变量,是使用static关键字修饰的成员变量,如代码中的变量 static_i ;之所以叫做类变量,是因为这个类只有这一个变量 static_i ,不管实例化多少个对象,他的 static_i 只有这一个,所以会出现一个对象修改了 static_i 的值后,其他对象的 static_i 也跟着变的现象。用底层的理解就是:所有这个类实例化的对象使用的变量 static_i ,指向的是同一个内存。
以上便是java中基本变量的理解。对于初学者来说,还是要多写代码,自己多去思考才能更好的理解。而底层理解,则需要一定程度的经验积累才能真正理解。
### 总结:静态变量
使用static关键字修饰的变量,称为静态变量。静态变量的值是唯一的,不是不变的,在其作用范围内,只存在一个值,无论在作用域的哪里调用修改,改变的都是同一个内存地址。
### 拓展知识
> - 虽然同一个静态变量始终指向唯一的内存,但是在高并发场景下,仍然有几率会出现问题,比如一个线程改变值,另一个线程获取值,假设两个线程同时执行,那么总要有个先后顺序,此时就没办法保证谁先谁后,有兴趣的同学可以去学习下这个问题如何解决,对理解多线程很好帮助哦~~
> - 常量:使用final关键字修饰的变量就成为了常量,常量的值不可改变。所以如果使用在成员变量上,一般也会加上static关键字,实际工作中常用于定义永恒不变的值。如:`static final String version = "1.0.1"`。
<div class="article-ads"></div>END
评论
登录后查看和发表评论
前往登录