Java static静态关键字详解(public、 private、 volatile)
文章目录
- 前言
- static要解决什么问题?
- 格式
- 特点
- static静态变量
- 静态变量和实例变量的区别
- static静态方法
- static应用场景
- static 与volatile
- static如何去访问
- public static 与private static
- static使用注意事项
- 总结
Java之static静态关键字详解
对java中public、static的理解
Java 中 static 和 volatile 关键字的区别?
前言
(概念)static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
这句话是说,你会用到static修饰一些个变量、方法、方法块什么的,这是你用到static的地方;“但是,java中没有全局变量的概念”,怎么理解这句话?你时刻要记住java是一个面向对象的语言,万事万物皆对象,无论你做什么都需要创建一个对象,然后再调用这个对象的方法, java怎么能允许存在一个在全局都通用的“全局变量”的概念存在呢?所以java中压根就没有所谓的“全局变量”,但是没有这个概念,不代表你不可以实现这个功能,所以static value就可以达到全局变量的作用,所以,你现在应该可以理解下面这句话了吧。
(概念)用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量。例如main()
static要解决什么问题?
我们知道,当我们通过new关键字去创建对象的时候,那么数据的存储空间才会被分配,类中的成员方法才能被对象所使用。但是呢有两种特殊的情况:1、我们通过new关键字创建的对象共享同一个资源,而不是说每个对象都拥有自己的数据,或者说根本就不需要去创建对象,这个资源和对象之间是没有关系的。2、希望某个方法不与包含它的类的任何对象联系在一起。总结下来就是说:即使没有创建对象,也能使用属性和调用方法,static目的就是在于解决这个问题。
static的主要作用在于创建独立于具体对象的域变量或者方法。
格式
修饰变量: static 数据类型 变量名
static int integer
修饰方法:【访问权限修饰符】 static 方法返回值 方法名(参数列表)
private static void func(int a){}
特点
- static可以修饰变量,方法
- 被static修饰的变量或者方法是独立于该类的任何对象,也就是说,这些变量和方法不属于任何一个实例对象,而是被类的实例对象所共享。
- 加载类时同时加载static部分。
- 被static修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即便没有创建对象,也可以去访问。
static静态变量
被static修饰的成员变量叫做静态变量,也叫做类变量,说明这个变量是属于这个类的,而不是属于是对象,没有被static修饰的成员变量叫做实例变量,说明这个变量是属于某个具体的对象的。
静态变量和实例变量的区别
实例变量: 每次创建对象,都会为每个对象分配成员变量内存空间,实例变量是属于实例对象的,在内存中,创建几次对象,就有几份成员变量。
静态变量: 静态变量由于不属于任何实例对象,是属于类的,所以在内存中只会有一份,在类的加载过程中,JVM为静态变量分配一次内存空间。
static静态方法
被static修饰的方法也叫做静态方法,因为对于静态方法来说是不属于任何实例对象的,那么就是说在静态方法内部是不能使用this的,因为既然不属于任何对象,那么就更谈不上this了。
static应用场景
如果某个成员变量是被所有对象所共享的,那么这个成员变量就应该定义为静态变量。
static 与volatile
static指的是类的静态成员,实例间共享
volatile跟Java的内存模型有关,线程执行时会将变量从主内存加载到线程工作内存,建立一个副本,在某个时刻写回。valatile指的每次都读取主内存的值,有更新则立即写回主内存。
理解了这两点,逐句再来解释你的困惑:
- “既然static保证了唯一性”:static保证唯一性,指的是static修饰的静态成员变量是唯一的,多个实例共享这唯一一个成员。
- “那么他对多个线程来说都是可见的啊”:这里,static其实跟线程没太大关系,应该说对多个对象实例是可见的。你说对多个线程可见,虽然没什么毛病,因为静态变量全局可见嘛,但是把这个理解转到线程的上线文中是困惑的起因。
- “volatile保证了线程之间的可见性”:因为线程看到volatile变量会去读取主内存最新的值,而不是自个一直在那跟内部的变量副本玩,所以保证了valatile变量在各个线程间的可见性。
- “那么修改的时候只要是原子操作,那么就会保证它的唯一性了吧”:此时你说的“唯一性”,指的是各个线程都能读取到唯一的最新的主内存变量,消除了线程工作内存加载变量副本可能带来的线程之间的“不唯一性”。这里“唯一性”的含义跟第一句说的“唯一性”是不一样的。
- “这两个在我理解上我觉得差不多。”:其实解决问题的“场景”是完全不一样的。
造成理解困惑最大的原因在于,这两个场景略有类似,以致混淆了:
场景1:各个类的实例共享唯一一个类静态变量
场景2:各个线程共同读取唯一的最新的主内存变量的值,只保证可见性,它不足以保证数据的同步性。
static如何去访问
CLASSNAME.static_value
CLASSNAME.static_func()
这里呢就啰嗦一句,由于被static修饰的变量和方法是不属于任何实例对象的,所以在这里,强烈建议不要通过对象的方式去访问静态的变量或者方法。
public static 与private static
就class之间的关系做一个简单的定义,
- 继承自己的class,base class可以认为他们都是自己的子女,
- 和自己一个目录下的classes,认为都是自己的朋友。
- public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用
- private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可以使用。
- protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。
作用域 | 当前类 | 同一package | 子孙类 | 其他package |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
friendly | √ | √ | × | × |
private | √ | × | × | × |
不写时默认为friendly
即,public static 是project中所有类对象共享的全局变量/方法,private static 是当前类的对象共享的全局变量/方法
static使用注意事项
- 在静态方法中没有this关键字因为静态是随着类的加载而加载,而this是随着对象的创建而存在的。静态比对象优先存在。super也不行,super与继承有关。
- 静态可以访问静态的,但是静态不能访问非静态的。static ! -> non-static
- 非静态的可以去访问静态的。non-static -> static
- 如果你需要通过计算来初始化你的static变量,你可以声明一个static块,Static 块仅在该类被加载时执行一次。
总结
不属于任何对象
全局共享
通过 类.变量/方法
访问
静态只能访问静态。
非静态既可以访问非静态的,也可以访问静态的。
Java static静态关键字详解(public、 private、 volatile)相关推荐
- php的 静态变量,PHP之static静态变量详解
在看别人项目过程中,看到函数里面很多static修饰的变量,关于static修饰的变量,作用域,用法越看越困惑,所以查了下资料. static用法如下: 1.static 放在函数内部修饰变量 2.s ...
- java中new关键字详解
java中new关键字详解 在java中我们可以经常使用new来创建一个对象,但是这对于初学者来说可能只会使用却不能理解new关键字和它的语法 new关键字的语法 注意使用前先导包,一般我们使用ide ...
- Java中super关键字详解
Java中super关键字详解 super有什么用? super什么时候不可以省略呢? super在内存图中是如何存在的呢? super使用时的注意事项 super有什么用? (1)当子类中构造方法第 ...
- php之static静态变量详解
php之static静态变量详解 一.总结 把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期. 把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围. 二.php之sta ...
- java static 函数_详解java中的static关键字
Java中的static关键字可以用于修饰变量.方法.代码块和类,还可以与import关键字联合使用,使用的方式不同赋予了static关键字不同的作用,且在开发中使用广泛,这里做一下深入了解. 静态资 ...
- Java中violate关键字详解(2)?真正了解violate
一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...
- Java中violate关键字详解
一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...
- java中变量 关键字_基于java的voliate关键字详解
voliate关键字的作用: 一.内存可见性 基于缓存一致性协议,当用voliate关键字修饰的变量改动时,cpu会通知其他线程,缓存已被修改,需要更新缓存.这样每个线程都能获取到最新的变量值. 二. ...
- Java 并发编程_详解 synchronized 和 volatile
文章目录 1. synchronized 的应用 1.1 基础知识 1.2 synchronized 语法 2. Monitor概念 3. Synchronized原理进阶 3.1 对象头格式 3.2 ...
最新文章
- “编程不规范,同事两行泪!”
- R语言置换检验(permutation tests、响应变量是否独立于组、两个数值变量是独立的吗、两个分类变量是独立的吗)、置换检验的基本步骤、R语言自助法Bootstrapping计算置信区间
- springmvc json 406
- 学习LOWORD、 HIWORD、LOBYTE、HIBYTE
- python教学研究_Python程序设计课程教学研究
- python pip国内镜像
- 通过js判断不同终端类型,跳转到不同的页面
- java basic类似的地方_java – Shiro使用HTTP Basic Auth或匿名访问相同的URI
- C语言之scanf中的格式
- JavaScript知识概要
- 程序员拒绝一个合理需求的15个方法!
- 命令行中,变量 date time 格式化设定
- 感知器(Perceptron)
- 各银行支付/各种支付平台/php对接支付接口心得/php h5支付接口对接
- Python人工智能之图片识别,Python3一行代码实现图片文字识别
- 外星人笔记本计算机在哪里,笔记本电脑没声音,详细教您外星人笔记本没声音如何解决...
- qbo机器人软件总体情况
- 第二章 数据通信基础
- AndroidStudio之option menu菜单的使用,android游戏开发
- ADAMS仿真软件教程--模型的相关操作
热门文章
- kcf算法c语言,基于KCF跟踪算法的目标轨迹记录系统的设计与实现
- Node.js 的 perf_hooks
- 苹果下载app必须验证付款信息
- spring发送邮件收到方显示为无主题,内容和附件都显示不正常
- docker配置defects4j + SimFix
- C++ 调用 Tesseract
- 简单的mysql左联查询实例
- 小米9能刷鸿蒙系统吗,超大乌龙之后,网友:小米真的不可能会使用鸿蒙系统吗?...
- 【遇见Doris】Doris基于Hive表的全局字典设计与实现
- oppor11点android版本,OPPO R11有几个版本 OPPO R11巴萨版与普通版区别 (全文)