学习Java时,面向对象的思想极其重要,如果对于面向对象的思想理解不到位,会有很多知识点无法真正理解,对知识点的不理解常表现为出现很多疑问,Java静态变量到底能不能变?
就是很常见的其中一个疑问。
本文从一个简单的代码示例入手,真实感受一下静态变量
的变化,希望能帮助大家解答这个问题。
编程切勿纸上谈兵,一切代码都需要自己去实践和感受,才能建立自己的理解。
javapublic 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
在两个对象实例中互相不独立,互相影响。由此可知,静态变量可以变,但无论多少个实例,只能有一个值。
以上是我初学时自己测试的结果和自己的总结,下边写一些工作后自己的理解总结
经过后续的工作和学习,对变量有了较深刻的理解。
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"
。
本文作者:DingDangDog
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!