文章目录

  • 前言
    • 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,认为都是自己的朋友。
  1. public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用
  2. private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可以使用。
  3. 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)相关推荐

  1. php的 静态变量,PHP之static静态变量详解

    在看别人项目过程中,看到函数里面很多static修饰的变量,关于static修饰的变量,作用域,用法越看越困惑,所以查了下资料. static用法如下: 1.static 放在函数内部修饰变量 2.s ...

  2. java中new关键字详解

    java中new关键字详解 在java中我们可以经常使用new来创建一个对象,但是这对于初学者来说可能只会使用却不能理解new关键字和它的语法 new关键字的语法 注意使用前先导包,一般我们使用ide ...

  3. Java中super关键字详解

    Java中super关键字详解 super有什么用? super什么时候不可以省略呢? super在内存图中是如何存在的呢? super使用时的注意事项 super有什么用? (1)当子类中构造方法第 ...

  4. php之static静态变量详解

    php之static静态变量详解 一.总结 把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期. 把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围. 二.php之sta ...

  5. java static 函数_详解java中的static关键字

    Java中的static关键字可以用于修饰变量.方法.代码块和类,还可以与import关键字联合使用,使用的方式不同赋予了static关键字不同的作用,且在开发中使用广泛,这里做一下深入了解. 静态资 ...

  6. Java中violate关键字详解(2)?真正了解violate

    一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...

  7. Java中violate关键字详解

    一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...

  8. java中变量 关键字_基于java的voliate关键字详解

    voliate关键字的作用: 一.内存可见性 基于缓存一致性协议,当用voliate关键字修饰的变量改动时,cpu会通知其他线程,缓存已被修改,需要更新缓存.这样每个线程都能获取到最新的变量值. 二. ...

  9. Java 并发编程_详解 synchronized 和 volatile

    文章目录 1. synchronized 的应用 1.1 基础知识 1.2 synchronized 语法 2. Monitor概念 3. Synchronized原理进阶 3.1 对象头格式 3.2 ...

最新文章

  1. “编程不规范,同事两行泪!”
  2. R语言置换检验(permutation tests、响应变量是否独立于组、两个数值变量是独立的吗、两个分类变量是独立的吗)、置换检验的基本步骤、R语言自助法Bootstrapping计算置信区间
  3. springmvc json 406
  4. 学习LOWORD、 HIWORD、LOBYTE、HIBYTE
  5. python教学研究_Python程序设计课程教学研究
  6. python pip国内镜像
  7. 通过js判断不同终端类型,跳转到不同的页面
  8. java basic类似的地方_java – Shiro使用HTTP Basic Auth或匿名访问相同的URI
  9. C语言之scanf中的格式
  10. JavaScript知识概要
  11. 程序员拒绝一个合理需求的15个方法!
  12. 命令行中,变量 date time 格式化设定
  13. 感知器(Perceptron)
  14. 各银行支付/各种支付平台/php对接支付接口心得/php h5支付接口对接
  15. Python人工智能之图片识别,Python3一行代码实现图片文字识别
  16. 外星人笔记本计算机在哪里,笔记本电脑没声音,详细教您外星人笔记本没声音如何解决...
  17. qbo机器人软件总体情况
  18. 第二章 数据通信基础
  19. AndroidStudio之option menu菜单的使用,android游戏开发
  20. ADAMS仿真软件教程--模型的相关操作

热门文章

  1. kcf算法c语言,基于KCF跟踪算法的目标轨迹记录系统的设计与实现
  2. Node.js 的 perf_hooks
  3. 苹果下载app必须验证付款信息
  4. spring发送邮件收到方显示为无主题,内容和附件都显示不正常
  5. docker配置defects4j + SimFix
  6. C++ 调用 Tesseract
  7. 简单的mysql左联查询实例
  8. 小米9能刷鸿蒙系统吗,超大乌龙之后,网友:小米真的不可能会使用鸿蒙系统吗?...
  9. 【遇见Doris】Doris基于Hive表的全局字典设计与实现
  10. oppor11点android版本,OPPO R11有几个版本 OPPO R11巴萨版与普通版区别 (全文)