Java-静态成员变量值到底能不能变?

Java-静态成员变量值到底能不能变?Java 静态成员变量值到底能不能变

程序代码::
public class AccessProperty { static int static_i = 6; // 定义静态成员变量 int normal_i = 0; public static void main(String[] args) { AccessProperty ap1 = new AccessProperty(); // 创建对象1 AccessProperty ap2 = new AccessProperty(); // 创建对象2 ap1.normal_i = 100; // 修改 ap1 的普通变量 normal_i 为 100 ap2.static_i = 60; // 修改 ap2 的静态变量 static_i 为 60 // 输出 ap1 数据 System.out.println("第一个实例对象变量static_i:" + ap1.static_i); // 输出 60 System.out.println("第一个实例对象变量normal_i:" + ap1.normal_i); // 输出 100 // 输出 ap2 数据 System.out.println("第二个实例对象变量static_i:" + ap2.static_i); // 输出 60 System.out.println("第二个实例对象变量normal_i:" + ap2.normal_i); // 输出 0 } } 

运行结果::

第一个实例对象变量static_i:60 第一个实例对象变量normal_i:100 第二个实例对象变量static_i:60 第二个实例对象变量normal_i:0 

调用对象ap2赋值 static_i = 60 。可以发现,静态变量 static_i 的值不仅变了,ap1的 static_i  也跟着变了。而普通变量normal_i 却没有相同效果。

——————————————————分割———————————————————

 经过后续学习,对变量有了一定的理解。

java中变量主要分为:局部变量、成员变量,而成员变量又分为实例变量(普通变量)和类变量(静态变量)。

以作用范围从小到达讲解:

  1. 局部变量:在方法内部声明(定义)的变量,只在这个方法内部有效,出了这个方法就无法使用了,可以理解为销毁。比如代码中的 ap1 和 ap2 ,只在main方法中可用。
  2. 实例变量:成员变量中的实例变量,没有使用static关键字修饰的成员变量,如代码中的变量 normal_i ;他在每一个实例化的对象中都是独立的,每个对象修改其值后,只是修改他自己的这个变量 normal_i ,其他对象的 normal_i 不受影响。用底层的理解就是:每个对象的变量 normal_i 有独立的内存,他们互不影响。
  3. 类变量:成员变量中的类变量,是使用static关键字修饰的成员变量,如代码中的变量 static_i ;之所以叫做类变量,是因为这个类只有这一个变量 static_i  ,不管实例化多少个对象,他的 static_i  只有这一个,所以会出现一个对象修改了 static_i  的值后,其他对象的 static_i  也跟着变的现象。用底层的理解就是:所有这个类实例化的对象使用的变量 static_i  ,指向的是同一个内存。

以上便是java中基本变量的理解。对于新手来说,还是要多写代码,多去自己思考才能更好的理解。而底层理解,则需要一定程度的经验积累才能真正理解。

顺便说一下常量:使用final关键字修饰的变量就成为了常量。常量的值不可改变。所以如果使用在成员变量上,一般也会加上static关键字,实际工作中是最常见的用法了。如:

static final String version = “1.0.1”

总结:静态变量

使用static关键字修饰的变量,称为静态变量。静态变量的值是唯一的,不是不变的,在其作用范围内,只存在一个值,无论在作用域的哪里调用修改,改变的都是同一个内存地址。

拓展知识

虽然同一个静态变量始终指向唯一的内存,但是在高并发场景下,仍然有几率会出现问题,比如一个线程改变值,另一个线程获取值,假设两个线程同时执行,那么总要有个先后顺序,此时就没办法保证谁先谁后,有兴趣的同学可以去学习下这个问题如何解决,对理解多线程很好帮助哦~~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223376.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午2:13
下一篇 2026年3月17日 下午2:13


相关推荐

  • 〖免杀〗.net程序一键免杀Win10 20H2 Defender「建议收藏」

    〖免杀〗.net程序一键免杀Win10 20H2 Defender「建议收藏」WIN10更新至最新版20H2发现,查杀能力比以前强了不少,特别是针对CS加载.NET程序集或NIM加载.NET的查杀,毕竟你要调用的函数微软很了解,它想拦截想杀还是比较容易的。但是不知道大家有没听说过一个故事“微软的编程工具的开发工程师,编写程序时,也需要查阅文档”,说明什么?微软系统的API很多,是微软写的没错,但又不是一个人自己写的,就算是一个人自己写的,功能那么多,他也根本记不起,用到自己的东西也要查阅文档,就像我用Ladon有时也要查阅文档,这很正常,因为我写过的工具或功能太多,有些久不用,甚至都

    2022年8月20日
    11
  • java位运算

    java位运算

    2021年9月29日
    46
  • UML时序图(序列图)

    UML时序图(序列图)什么是时序图时序图 SequenceDiag 又名序列图 循序图 是一种 UML 交互图 它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作 让我们来看一看 visio2016 对时序图的的解释 时序图的元素我们在画时序图时会涉及 7 种元素 角色 Actor 对象 Object 生命线 LifeLine 控制焦点 Activation 消息 Message 自关联消息 组合片段 其中前 6 种是比较常用和重要的元素 剩余的一种组合片段元素不是很常用 但是比较复杂 我们先介绍前 6 种

    2026年3月18日
    2
  • ucGUI入门介绍

    ucGUI入门介绍ucGUI 功能 ucgUI 是一个图形库 API 你可以使用 LCD 底层的画点函数绘制一个图形 但是如果要绘制复杂的窗口 就可以使用这个图形库 nbsp nbsp nbsp nbsp nbsp nbsp nbsp ucgUI 是一种嵌入式应用中的图形支持系统 它设计用于为任何使用 LCD 图形显示的应用提供高效的独立于处理器及 LCD 控制器的图形用户接口 它适用单任务或是多任务系统环境 nbsp 并适用于任意 LCD 控制器和 CPU 下任何尺寸的真实显示或虚拟显示

    2026年3月18日
    2
  • 一位10年程序员生涯的总结与经验忠告分享

    一位10年程序员生涯的总结与经验忠告分享

    2021年10月10日
    46
  • 00后的程序员都开始期望年薪百万

    00后的程序员都开始期望年薪百万北京冬奥会让双奥之城又热火了一把 比这个更火的 是冬奥会上的 00 后运动员 谷爱凌 苏翊鸣 年纪轻轻就冲击奖牌为国争光 粉丝们每天看赛事都是为他们喝彩 怪不得有网友会发出感慨 说自己的存在就是 人间凑数 的 其实现在不仅仅是文化体育行业 各行各业内 都涌现出很多优秀的 00 后 他们已经步入社会 开始发光发热 在近几年发展快速的互联网 IT 行业中 敢想敢干的 00 后也越来越多了 他们其中不乏有通过实学实干 月薪已经过万的 根据一项调查 现在有超一半成 00 后 码农 对自己在 IT 行业冲击年薪上百万持积极态度 或许

    2026年3月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号