2022-09-04
班门弄斧
00

目录

简介
代码分析
代码
执行结果
现象和总结
现象
总结
理解总结
Java变量
总结:静态变量
拓展知识

简介

学习Java时,面向对象的思想极其重要,如果对于面向对象的思想理解不到位,会有很多知识点无法真正理解,对知识点的不理解常表现为出现很多疑问,Java静态变量到底能不能变?就是很常见的其中一个疑问。

本文从一个简单的代码示例入手,真实感受一下静态变量的变化,希望能帮助大家解答这个问题。

编程切勿纸上谈兵,一切代码都需要自己去实践和感受,才能建立自己的理解。

代码分析

代码

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

现象和总结

现象

  • 初始状态:创建了两个对象实例ap1ap2,初始情况下,两个对象的两个变量值都为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中变量主要分为:局部变量、成员变量,而成员变量又分为实例变量(普通变量)和类变量(静态变量)。

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"
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:DingDangDog

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!